1,389 karma · joined February 13, 2011
This is interesting from a technical perspective, though. How does it know what's in the cup?
What this property does is lets us continue doing the same thing, but in a way that the intent is clear ("I'm using this property to make the animation on this element more performant" vs. "I want to add a transform that does nothing"). Furthermore, it lets the browser decide if it wants to add any optimization, and it can decide which sort of optimization is best.
While it would be nice if we didn't have to do this hinting at all, the fact of the matter is that it's hard for the browser to predict what will happen on the page in the future, and we're already having to do this (just in the cryptic null transform way), so it's nice that the web platform is letting us do it in a standardized way that communicates our intent clearly.
[0]: http://aerotwist.com/blog/on-translate3d-and-layer-creation-...
It's not a direct phone number, but a reasonable number of average people will hopefully take a look while their video is buffering and start to understand that their ISP may be the reason YouTube seems slow.
This is supposedly the commit for the 7.2 release. Just looks like a bunch of code replaced with the app aborting as insecure.
I'm not sure how legit this is, the repository was just created a few minutes ago. Apparently there is a new binary release that goes along with this, though.
[I've created a fork here just in case the original goes down: https://github.com/timothyarmstrong/truecrypt/compare/master...]
I was just clarifying that the invite-only stage didn't last more than a year.
When I think about scheduling, I immediately think about Google Calendar or Google+ Events, because that's where I would go to schedule any sort of event (with a video call or otherwise). Both of those places support adding a Hangouts video chat to an event.
[0]: https://github.com/openssl/openssl/commit/731f431497f463f3a2...
[0]: https://developers.google.com/chrome-developer-tools/docs/ja...
There is a JavaScript object representing all of the Google Analytics state and functions. When this object is set up, they add the property "answer = 42" to it. Then, before making this object globally accessible at `window.ga`, they double check that `window.ga` does not yet exist or that `window.ga.answer` does not equal 42. If it already equals 42, then the initialization must have already happened (maybe the Analytics code was included twice?), and so it doesn't proceed to clobber that already-initialized global Analytics state. Checking that the `window.ga` variable doesn't exist is not quite enough, since other JavaScript on the page may have set that property for some reason (of course, this logic wouldn't work if other code on the page had simple set `window.ga.answer = 42`, but that's unlikely to happen by accident). As long as it looks like the initialization hasn't already run, then it goes ahead and does the initialization and makes the result globally accessible at that point.
tl;dr: It's not just a joke; it's actually used to make it less likely that other JavaScript on the page hasn't created a global variable called `ga` which may otherwise prevent the Analytics code from running.
Then again, this article is from Google Ventures, so maybe they are just using internal design resources.
Side question: What is long and convoluted about Google's account management? It's one account with a single login which works across all Google products. Seems pretty straightforward to me. It only gets a bit more complicated if you try to disable parts of your account, but that's not the normal use case.
var boundEvent = handleEvent.bind(this);
document.addEventListener('click', boundEvent);
and later: document.removeEventListener('click', boundEvent);
This situation is a bit messier, though, because you have to keep track of both `handleEvent` and `boundEvent`.`bind` returns a new function, which has it's context `this` set to whatever you pass in, along with arguments partially applied.
`apply` calls the function, using the context object you provide and the arguments provided in an array. (`apply` also has a sister function `call`, which also calls the function with the context object you provide and the arguments you provide individually).
My common use case is when I'm setting up event handlers and I want the event handler to know about a companion object I have to the element in the DOM. For example:
MyObject.prototype.buildDom_ = function() {
for (var i = 0; i < buttons.length; i++) {
var button = new MyButton(...);
this.myButtons_.push(button);
var element = document.createElement('div');
element.addEventListener('click', this.handleClick_.bind(this, button));
this.rootElement_.appendChild(element);
}
};
MyObject.prototype.handleClick_ = function(button, clickEvent) {
// I have access to the MyButton instance passed in.
};
In this case, I use the partial application to pass in the MyButton instance so that when I'm in the handler for a button click, I have access to the original JavaScript object that was created when the event handler was set up.To mitigate the problem, Chrome does have the permissions model to limit what extensions can do, and if an extension requires more permissions after an update, Chrome will give you a warning, along with an option to remove the extension. Your best defence is to not grant overly broad permissions when you first install the extension.
Regarding your comment about Chrome's automatic updates being "bad", I disagree wholeheartedly - the web platform would not be able to move forward at the same rate that it can today. One of the biggest problems with IE was simply that it was updated so infrequently that it was really hard to support the large percentage of outdated versions. We'd be in the same situation with Chrome if it didn't auto-update. Furthermore, I trust Chrome to make good decisions for my security. I'd rather have my browser updated quickly so that vulnerabilities in the browser can be fixed quickly before they affect me.
Interesting that they chose to share code with Chrome. Since the two are competitors, I would have thought that they'd use completely separate implementations. It's interesting that open source makes this sharing possible.