http://www.nytimes.com/2013/02/20/realestate/commercial/to-b...
89 karma · joined December 23, 2010
http://www.nytimes.com/2013/02/20/realestate/commercial/to-b...
http://www.nytimes.com/2013/05/12/business/employers-pull-ap...
In one scene Batman and Bane were fighting on the steps of Wall Street. From one angle the shot was filmed in front of the Mellon Institute in Pittsburgh and another angle was actually on Wall Street.
For one, the computers have a higher BOM and price, so an increase in manufacturing costs takes a smaller share of the total profit. Plus they only make 5 million computers a quarter, compared to 41 million iPhones+iPads.
iDevices are released on an annual schedule, which means delays are extremely costly (especially if they are timed for the holidays). This requires a very tight supply chain. It isn't as big a deal if the iMac slips by a month.
Finally, the market for iDevices is extremely competitive compared to desktops. Execution matters way more for iDevices and a lot more money is on the line. It is easy to experiment with iMacs because there is much less pressure in that market segment.
http://www.nytimes.com/2011/06/26/business/global/26bridge.h...
I think they got rid of this feature a few versions ago because I haven't been able to reproduce it. I suspect (but have no evidence for) that this is related to the typing lag that was really bad in ios 2 or 3. From my perspective, it seems they weren't able to fix the realtime correction so they made it asynchronous and just fix up words after you hit space. This is how it seems to perform now (and let's them offer more features like multi word correction).
The workers were configured to fetch new tasks every 30 seconds. With 10 workers you'd expect tasks to get fetched from the queue every 3 seconds, but that is not what we were seeing. The tasks were only getting picked up on 30 second boundaries. What was going on?
It turns out that the tasks were piling up. As soon as one task tried to update at the same time as another it would get blocked on the database lock. Its own transaction would then run really quickly following the first transaction. However, since these two tasks were run in immediate succession, now they were synced for life. They both slept for exactly 30 seconds, the first one wakes up a few tens of milliseconds earlier and grabs the lock, the second one wakes up and blocks on the lock, and this happens in perpetuity. Eventually, due to small randomness, all tasks entered lockstep and would be a small thundering herd against the database.
This was noticed by a developer and fixed by introducing a small jitter in the sleep time. After the push our tasks were picked up in three seconds and our end-to-end workflow time got substantially shorter.
Humans are great at adapting, so if you throw a new enclosure at them or a new motherboard design which has the CPU sockets in a different location, they'll be able to learn the new system in 30 minutes.
A former coworker of mine trained to work with factory robots, but he realized that there wasn't much of a current job market for it because humans are still way cheaper (and will be for some time). Instead he went into software.
AppEngine went the other route and provided a very simple database API at first and all queries had to be range scans over an index. Any query you wanted to perform had to be precalculated by defining a composite index and some things (like inequalities on multiple fields) weren't supported. Over time they've built upon their basic database and added features such as a zigzag merge join algorithm which lets you perform queries that were otherwise impossible with a given set of indexes.[1]
I bet DynamoDB will be going the AppEngine route by starting with a simple, scalable base which can be used to build more advanced query engines and features.
1. http://code.google.com/appengine/articles/indexselection.htm...
This just goes to show that you have to be vigilant if you are building sites with the latest and greatest, as they are still under development and likely to change out from under you.
Also: in further testing, it looks like Safari works with the drag and drop, but not the uploading. I purposely disabled all socket.io transfer types except web sockets in order to encourage adoption of modern browsers. Unfortunately, since I used such bleeding edge, unstandardized technology (drag and drop, file API, and web sockets), the browsers have changed and broken my implementation, each in a slightly different way, such that none of them work end to end anymore.
The server is written in node.js and it uses socket.io to do the transfers. I think it only works in Chrome because I didn't bother getting the drag-and-drop working with anything else. Actually, it seems to be broken in the current dev channel of Chrome. I announced it back in September:
https://plus.google.com/116396240707733722472/posts/d9ydb8o2...
Also, related to source control but not Git, a few years ago Google had a tech talk about writing a Mercurial storage system on top of BigTable: http://www.google.com/events/io/2009/sessions/MercurialBigTa...
http://developer.android.com/design/static/content/ui_overvi...
https://plus.google.com/116396240707733722472/posts/EHpaKDWM...