Shared posts

15 Apr 12:10

Dietary supplements: who needs them? | Tania Browne

by Tania Browne

A Guardian article that claimed to 'tune out the hype' was far too eager to recommend vitamins and other supplements. In reality, most of us are better off without them

Whenever I see an article entitled The science of I become suspicious. So when the Guardian's G2 section published a piece last week called "The science behind dietary supplements" by Spencer Nadolsky of nutrition website examine.com, it rang alarm bells.

As it did for many others. Commenter flash131 discovered that Nadolsky appeared to be registered as a co-director of Leaner Living, which sells diet supplements. Subsequently, examine.com told the Guardian that he no longer has any connection to the company he co-founded, which is now run by his brother. However, during his time at Leaner Living Nadolsky received a warning from the Federal Drug Administration for making therapeutic claims for a product that hadn't received FDA approval.

Continue reading...
03 Dec 16:50

Knockout Projections – a plugin for efficient observable array transformations

by Steve

knockout-projections is a new Knockout.js plugin that adds efficient “map” and “filter” features to observable arrays. This means you can:

  • Write myObservableArray.map(someMappingFunction) to get a new, read-only array-valued observable containing the mapped version of each input item.
  • Write myObservableArray.filter(someFilterFunction) to get a new, read-only array-valued observable containing a subset of the input items.

When the underlying myObservableArray changes, or whenever any observable accessed during the mapping/filtering changes, the output array will be recomputed efficiently, meaning that the map/filter callbacks will only be invoked for the affected items.

The point of all this: it can scale up to maintain live transforms of large arrays, with only a fixed cost (not O(N)) to propagate typical changes through the graph of dependencies.

Trivial mapping example

To illustrate the mechanics in an obvious way, consider this underlying array:

var numbers = ko.observableArray([1, 2, 3]);

Now if you’ve referenced knockout-projections, you can write:

var squares = numbers.map(function(x) { return x*x; });

Initially, squares will contain [1, 4, 9]. It’s observable, so you can use squares.subscribe to get notifications when it mutates, or you can bind it to a DOM element (e.g., foreach: squares) in KO’s usual way.

Now if you transform the underlying array:

numbers.push(8);

… then squares updates (to [1, 4, 9, 64]) and only calls your mapping function for the new item, 8.

Any transformation is permitted, e.g.:

numbers.reverse();

This has the effect of reversing squares (to [64, 9, 4, 1]), again without remapping anything.

If you remove item(s):

numbers.splice(1, 1);

… then squares is updated (here, to [64, 1]) without remapping anything.

In summary, anyObservableArray.map is an efficient, observable equivalent to Array.prototype.map. Also, it can be arbitrarily chained (and combined in chains with filter) to produce graphs of transformations.

Trivial filtering example

The filter feature works exactly as you’d expect, given the above. For example,

var evenSquares = squares.filter(function(x) { return x % 2 === 0; });

Initially, evenSquares will contain just [64]. When you mutate the underlying array,

numbers.push(4); // evenSquares now contains [64, 16]
numbers.push(5); // evenSquares doesn't change
numbers.push(6); // evenSquares now contains [64, 16, 36]

Again, it responds to arbitrary transformations:

numbers.sort();  // evenSquares now contains [16, 36, 64]

A more realistic use case

Typically you won’t just be playing around will small collections of numbers. Most Knockout apps work with collections of model objects – sometimes very large collections.

Here’s a simple model object:

function Product(data) {
    this.id = data.id;
    this.name = ko.observable(data.name);
    this.price = ko.observable(data.price);
    this.isSelected = ko.observable(false);
}

Many KO applications involve fetching a large collection of model objects and exposing that from a viewmodel:

function PageViewModel() {
    // Some data, perhaps loaded via an Ajax call
    this.products = ko.observableArray([
        new Product({ id: 1, name: 'Klein Burger', price: 3.99 }),
        new Product({ id: 2, name: 'Mobius Fries', price: 1.75 }),
        new Product({ id: 3, name: 'Uncountable Chicken Chunks', price: 3.59 }),
        new Product({ id: 4, name: 'Mandelbrot Salad', price: 2.40 }),
        ... etc ...
    ]);
}
 
ko.applyBindings(new PageViewModel());

Now this might be bound to the UI:

<ul data-bind="foreach: products">
    <li>
        <input type="checkbox" data-bind="checked: isSelected" />
        <strong data-bind="text: name"></strong>
        (Price: £<span data-bind="text: price().toFixed(2)"></span>)
    </li>
</ul>

This is all fine, and Knockout is already good at efficiently (i.e., incrementally) updating the UI when the products array changes. But what if you want to track which subset of products is “selected”?

The traditional approach would be something like:

this.selectedProducts = ko.computed(function() {
    return this.products().filter(function(product) {
        return product.isSelected();
    });
}, this);

This works (using Array.prototype.filter, not the Knockout-projections filter function). However, it’s inefficient. Every time the products array changes, and every time any of their isSelected properties changes, it re-evaluates the isSelected property of every product. It has to do so, because it has no built-in understanding of what you’re doing, so it can’t be clever and incremetally update the earlier selectedProducts array.

However, if you use Knockout-projections filter function, e.g.:

this.selectedProducts = this.products.filter(function(product) {
    return product.isSelected();
});

… it’s both syntactically cleaner, and way faster for large arrays: it now updates the selectedProducts array incrementally whenever either products changes or any of the isSelected values changes.

Similarly you might want to output the names of the selected items. So, you could chain on a new selectedNames property, and perhaps furthermore chain on selectionSummary:

this.selectedNames = this.selectedProducts.map(function(product) {
    return product.name();
});
 
this.selectionSummary = ko.computed(function() {
    return this.selectedNames().join(', ')  || 'Nothing';
}, this);

Now when products changes, or when an isSelected or name property changes, the effect will propagate out incrementally through the whole dependency graph with the minimum of callback-invoking, meaning a snappy user experience even with large data sets and low-end mobile devices.

Licence and origin

knockout-projections is open source under the Apache 2.0 license. It was built as a tiny component in a very large project I’m working on at Microsoft, and thanks to my boss (and his boss, and probably multiple people up the chain) we’ve decided to open-source it. Hopefully my team will be producing plentiful nuggets of OSS goodness for you as we go about our work :)

Just a clarification for the avoidance of any confusion, Knockout.js itself remains MIT licensed and is run by the KO community and the KO core team members (which includes me personally).

24 Oct 15:13

Amazing robot gymnast

by Jason Kottke

I wasn't expecting a whole lot from this video of a robotic gymnast doing a routine on the high bar, but holy cow! I audibly gasped at the 33-second mark and again at 57 seconds.

Looks like a home-built, just some guy in his garage. The robot has learned some new tricks since that video was made. Here's a quintuple backflip landing:

A double twist that it didn't quite land:

And it does floor exercises as well...here's a double back handspring:

(via @moth)

Tags: gymnastics   robots   sports   video
16 Sep 18:45

Easy NFL/Netflix/Hulu region unlock using DNS

by Jason Kottke

Lex Friedman details how to use DNS services (like AdFree Time) to route around region-specific content locks, so you can do things like watch all NFL games in HD from anywhere, change Netflix regions (for access to different content), etc.

Third-party services like AdFree Time offer up a DNS-based solution: Pay a monthly fee and use their DNS services, and the NFL's website treats you as if you're coming from Europe. You thus get to watch every NFL game streaming online in high definition, since the league offers that option to folks in Europe at no charge. Americans, usually, miss out. I could pay for DirecTV's insanely overpriced Sunday Ticket, but I think it's a ripoff when I'm only looking to watch about six to eight Eagles games that won't show here.

This beats hate-reading the NFL TV maps every weekend.

Tags: Lex Friedman   NFL   sports   TV
10 Jul 15:40

Crazy Sky-High Waterspout Captured on Camera in Florida

waterspout-fl-01.jpg

There are those natural phenomena that we know are coming, like comets, the Supermoon and this year's forthcoming Manhattanhenge, causing shutterbugs around the world to prepare their cameras. Then there's the stuff we have no idea is coming, like earthquakes, tsunamis and tornadoes. But the prevalence of cell phone cameras mean we're now capturing images from the latter category too. Yesterday a series of photos out of Oldsmar, Florida, went viral as a handful of residents were able to capture a waterspout—a sort of oceangoing tornado—that formed around sunset on Monday.

waterspout-fl-02.jpg

Naturally there's video of it too; unsurprisingly most of it is grainy and ill-composed. After wading through a bunch of it, we found Oldsmar resident John Bosker's footage, which he showed to ABC News, to be the cake-taker. It starts around 0:44 below, and you can of course ignore the news hype before and after the footage:

This second video is kind of funny because you can hear the typical American parent-child interaction in the background (NSFW language):

(more...)
    


12 Jul 14:50

Kuwait's booming Instagram economy

by Jason Kottke

In Kuwait, people sell all sorts of stuff on Instagram, using the service as a visually oriented mobile storefront instead of using a web site or something like eBay. From an interview with artist/musician Fatima Al Qadiri:

BR: Kuwait is a crazy mix: a super-affluent country, yet basically a welfare state, though with a super neo-liberal consumer economy.

FQ: We consume vast amounts of everything. Instagram businesses are a big thing in Kuwait.

BR: What's an Instagram business?

FQ: If you have an Instagram account, you can slap a price tag on anything, take a picture of it, and sell it. For instance, you could take this can of San Pellegrino, paint it pink, put a heart on it, call it yours, and declare it for sale. Even my grandmother has an Instagram business! She sells dried fruit. A friend's cousin is selling weird potted plants that use Astroturf. People are creating, you know, hacked products.

I dug up a few examples: Manga Box is an Instagram storefront selling manga (contact via WhatsApp to buy), Sondos Makeup advertises makeup services (WhatsApp for appts.), sheeps_sell sells sheep, and store & more is an account selling women's fashion items. There was even an Insta-Business Expo held in April about Instagram businesses.

The Entrepreneurship and Business Club of the American University of Kuwait is holding an "INSTA BUSINESS EXPO" which will consist of all your favorite and newest popular entrepreneurs that grew their businesses through Instagram. Not only that, there will be guest speakers by Entrepreneurs that made it through Instagram as well!

(via @cmchap)

Tags: business   Fatima Al Qadiri   Instagram   interviews   Kuwait
11 Jul 15:44

Keeping to the beat

by Jason Kottke

A study by researchers in Sweden indicates that the heartbeats of singers in a choir quickly synchronize.

Using pulse monitors attached to the singers' ears, the researchers measured the changes in the choir members' heart rates as they navigated the intricate harmonies of a Swedish hymn. When the choir began to sing, their heart rates slowed down.

"When you sing the phrases, it is a form of guided breathing," says musicologist Bjorn Vickhoff of the Sahlgrenska Academy who led the project. "You exhale on the phrases and breathe in between the phrases. When you exhale, the heart slows down."

But what really struck him was that it took almost no time at all for the singers' heart rates to become synchronized. The readout from the pulse monitors starts as a jumble of jagged lines, but quickly becomes a series of uniform peaks. The heart rates fall into a shared rhythm guided by the song's tempo.

(via @stevenstrogatz)

Tags: music   science