<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/'><id>tag:blogger.com,1999:blog-29992405</id><updated>2008-05-02T11:14:22.150-07:00</updated><title type='text'>Sriram Krishnan</title><link rel='alternate' type='text/html' href='http://www.sriramkrishnan.com/blog/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/29992405/posts/default?start-index=26&amp;max-results=25'/><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.sriramkrishnan.com/blog/atom.xml'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29992405/posts/default'/><author><name>Sriram</name><uri>http://www.blogger.com/profile/14514067854950617393</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>81</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-29992405.post-8570236239166239274</id><published>2008-04-21T09:34:00.000-07:00</published><updated>2008-04-21T09:36:09.034-07:00</updated><title type='text'>At the Web 2.0 Expo from the 22nd to the 25th</title><content type='html'>I'll be at the Web 2.0 Expo at SF from the 22nd to 25th. If you're nearby and want to meet up, drop me a line at sriramk@microsoft.com/mail@sriramkrishnan.com</content><link rel='alternate' type='text/html' href='http://www.sriramkrishnan.com/blog/2008/04/at-web-20-expo-from-22nd-to-25th.html' title='At the Web 2.0 Expo from the 22nd to the 25th'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29992405&amp;postID=8570236239166239274' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.sriramkrishnan.com/blog/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29992405/posts/default/8570236239166239274'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29992405/posts/default/8570236239166239274'/><author><name>Sriram</name><uri>http://www.blogger.com/profile/14514067854950617393</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-29992405.post-1315661558900109340</id><published>2008-04-10T20:56:00.001-07:00</published><updated>2008-04-10T21:24:31.046-07:00</updated><title type='text'>Yet another Flickr change, yet another mutiny</title><content type='html'>&lt;p&gt;Flickr related change - &lt;a href="http://www.techmeme.com/080410/p112#a080410p112"&gt;check&lt;/a&gt;&lt;br /&gt;User revolt with protest groups - &lt;a href="http://www.flickr.com/groups/675051@N25/"&gt;check&lt;/a&gt;&lt;br /&gt;A blog post from Zooomr CEO Thomas Hawk, supporting the protest - &lt;a href="http://thomashawk.com/2008/04/no-video-on-flickr-movement-gains-more.html#links"&gt;check&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Sometimes, I feel really sorry for Flickr. They can't seem to make *any* change without drawing the ire of some really vocal users. Here are some incidents from the top off my head&lt;br /&gt;&lt;br /&gt;- Flickr getting acquired by Yahoo&lt;br /&gt;- Flickr moving to using Yahoo's login system&lt;br /&gt;- Flickr potentially getting acquired by Microsoft&lt;/p&gt; &lt;p&gt;Now, I love Flickr. I think Stewart Butterfield and Caterina Fake have created something wonderful. I've gifted Pro accounts to friends and I have some valuable photos up there. But I think there's a line between 'being vocal fans' and 'harming the site's progress'. It's almost as if a lot of people have a frozen mental image of Flickr as it was when they first joined it and want to preserve that site forever, at the cost of the site growing.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;"But shouldn't Flickr stick to what it does best? Photos?"&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;No.&lt;br /&gt;&lt;br /&gt;Let me illustrate with a short history lesson from Microsoft's past. Microsoft was originally a languages and tools company - BillG wrote the first BASIC interpreter. If it had stuck to just doing one thing well - languages, it would have never built Windows and Office. Similarly, a decade ago, Microsoft was primarily known as a consumer company and didn't have a credible presence on the backend. SQL Server, Exchange, IIS and the Windows Server products changed all that. At each point in time, if Microsoft had stuck to what users thought it did best, it wouldn't have grown.&lt;/p&gt; &lt;p&gt; In my view, Flickr users are doing Flickr a disservice if they want to shoehorn into an online photo site. I would rather see Flickr evolve beyond photos into an friendly online forum where people post creations, regardless of their nature. Flickr's management seems to understand this well - the 90-second limit on the videos is a master-stroke. It stops people turning Flickr into another Youtube and forces them to some extent to post original content.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;The Thomas Hawk Affair&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;Thomas Hawk's involvement in each of these protests makes me a bit uncomfortable since I'm a fan of his photography and enjoy reading his blog. At the end of the day, he is the CEO of a company that competes with Flickr. For him to lead every Flickr user protest and claim that there is no conflict of interest is a bit...stretched. A friend compared this to &lt;a href="http://en.wikipedia.org/wiki/Tom_Anderson_(MySpace)"&gt;Tom Anderson&lt;/a&gt; (hypothetically) protesting Facebook's beacon implementation. Even though Thomas' arguments are probably being made on good faith, the fact remains that he stands to gain from Flickr users leaving to join his service.&lt;/p&gt;</content><link rel='alternate' type='text/html' href='http://www.sriramkrishnan.com/blog/2008/04/yet-another-flickr-change-yet-another.html' title='Yet another Flickr change, yet another mutiny'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29992405&amp;postID=1315661558900109340' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.sriramkrishnan.com/blog/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29992405/posts/default/1315661558900109340'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29992405/posts/default/1315661558900109340'/><author><name>Sriram</name><uri>http://www.blogger.com/profile/14514067854950617393</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-29992405.post-1569794083502477829</id><published>2008-03-30T02:13:00.000-07:00</published><updated>2008-03-30T02:18:46.651-07:00</updated><title type='text'>Popfly - now using Cacheman</title><content type='html'>John &lt;a href="http://blogs.msdn.com/johnmont/archive/2008/03/27/popfly-update.aspx"&gt;beat me&lt;/a&gt; to the post. Popfly is now running on top of &lt;a href="http://www.sriramkrishnan.com/blog/2008/02/cacheman-fast-distributed-hashtable-for.html"&gt;Cacheman&lt;/a&gt; and we're seeing anywhere between a 2x-6x perf improvement depending on the mashup you're running. This is also the first time Cacheman has been put to real production usage and so far, it has been handling all of Popfly's traffic without breaking a sweat.&lt;br /&gt;&lt;br /&gt;This has to be the first time one of my pet projects has proven remotely useful so  I'm pretty pleased :-)</content><link rel='alternate' type='text/html' href='http://www.sriramkrishnan.com/blog/2008/03/popfly-now-using-cacheman.html' title='Popfly - now using Cacheman'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29992405&amp;postID=1569794083502477829' title='3 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.sriramkrishnan.com/blog/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29992405/posts/default/1569794083502477829'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29992405/posts/default/1569794083502477829'/><author><name>Sriram</name><uri>http://www.blogger.com/profile/14514067854950617393</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-29992405.post-5654258279652089249</id><published>2008-03-23T08:31:00.001-07:00</published><updated>2008-03-23T08:35:10.933-07:00</updated><title type='text'>Slicehost</title><content type='html'>&lt;p&gt;I spent a lot of my weekend moving my website from Dreamhost to &lt;a href="http://www.slicehost.com/"&gt;Slicehost&lt;/a&gt;. Slicehost is a VPS provider with a platform based on Xen. This was not really due to any problem with Dreamhost (they're really good and I would recommend them instantly) but more due to how good Slicehost was. In fact, I have to say that Slicehost, at this early stage, is by far the best host I've worked with. &lt;/p&gt; &lt;p&gt;&lt;strong&gt;Shared hosts vs Virtual Private Servers vs dedicated servers&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;A quick primer on shared hosts vs VPS vs dedicated servers (most of you can probably skip this section - but you'll be surprised how many people confuse these).&lt;br /&gt;&lt;br /&gt;A shared host, like the name implies, means that you get a machine that is shared. Your website will run on the same box as several other websites with some security ACLs in place to make sure you don't trample over someone else's files.  Depending on the host, your access to the machine might range from just FTPing files over to a shell account where you can log in and run programs yourself. However, you'll never have root/administrator access to the box and you'll usually need to go through cPanel/some-really-ugly administrative control panel to request changes to your configuration or setting up new software. However, these security settings can't really protect against other type of bad behavior from individual websites. For example, if your website happens to be on the same machine as another website undergoing a Digg/Slashdot-effect, your performance will be affected as there is no real effective throttling mechanism. Most shared hosts will either kill the website hogging resources or perform some manual magic, like moving it to a different box.&lt;/p&gt; &lt;p&gt;A dedicated server is the other end of the spectrum - you get a full machine to yourself. Depending on which company you work and/or how much money you pay, this might be from a low-end provider or in a colo facility or in a big datacenter along with thousands of other boxes. You don't share the machine with anyone and you can party on it to your heart's content. However, since these require a 1:1 mapping between customer and hardware box, they're typically expensive.&lt;/p&gt; &lt;p&gt;A VPS falls in the middle. They offer you most of the benefits of dedicated servers (full root access on the box) without the 'bad-neighbour' problems of shared hosts. They tackle the latter problem by using some form of virtualization and use a hypervisor or a virtual machine to act as a sandbox and throttle resources. In Slicehost's case, they use &lt;a href="http://en.wikipedia.org/wiki/Xen"&gt;Xen&lt;/a&gt;. In the screenshot below from my slice, you can see the custom Xen kernel in action as well as the 256mb limit imposed on my slice though the actual underlying hardware probably supports multiple GBs.&lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt;&lt;img style="border-width: 0px;" alt="image" src="http://lh5.google.com/sriramk/R-Z4eKJCjFI/AAAAAAAAAIs/Kg8hSZcS3f0/image%5B4%5D.png?imgmax=800" border="0" height="95" width="430" /&gt; &lt;/p&gt; &lt;p&gt;&lt;strong&gt;Some random notes&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;I picked the base 256mb $20/month slice. I was tempted to get a beefier configuration but forced myself to hold off for now. This is also more than double what I was paying Dreamhost  &lt;/li&gt;&lt;li&gt;Slicehost has an awesome feel of community and sincerity around it. Their documentation and wiki are great, they know their stuff and they seem genuinely *honest*. That's hard to find in the overselling-world of web hosting.  &lt;/li&gt;&lt;li&gt;I installed Ubuntu 7.10 on my slice. I would really like to have installed Windows Server 2008 but I doubt that Slicehost will offer that as an option anytime soon. :-)  &lt;/li&gt;&lt;li&gt;I'm running lighttpd as my web server. I ran nginx for some time but switched to lighttpd when I needed to get mercurial to talk to my web server over fastcgi. Nginx rocks but I was just too lazy to figure out the spawn-fcgi magic to get it to talk with mercurial (and the cgi options seems unreliable).  &lt;/li&gt;&lt;li&gt;After a lot of iptables and lighttpd configuration file hacking, I realized how much I had been spoiled by MMC add-ins back in Windows land. I wish there was a way to remote-connect an configuration GUI over SSH (I'm thinking of the ability to connect to remote servers through MMC).  &lt;/li&gt;&lt;li&gt;I can't wait for the day when I get mod_rewrite style rules right at the first attempt. Or on the tenth attempt. On a tangential note, I like nginx's mini-language inside the configuration file.  &lt;/li&gt;&lt;li&gt;I'm writing a Python web app and I'm bewildered by the options for running it. mod_wsgi, mod_python, fcgi, etc. For every blog post with some graphs supporting one option, I can find another saying the exact opposite. I'm also amused at how a lot of people measure server performance under load by essentially hitting the server in a tight loop. All the interesting stress related problems only show up after a few days (as I painfully found out while writing cacheman).  &lt;/li&gt;&lt;li&gt;Mercurial vs Git - Git's poor support for Windows was a deal breaker for me. Now I just need to find a Mercurial&amp;lt;-&amp;gt;TFS bridge :-)&lt;/li&gt;&lt;/ul&gt;</content><link rel='alternate' type='text/html' href='http://www.sriramkrishnan.com/blog/2008/03/slicehost.html' title='Slicehost'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29992405&amp;postID=5654258279652089249' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.sriramkrishnan.com/blog/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29992405/posts/default/5654258279652089249'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29992405/posts/default/5654258279652089249'/><author><name>Sriram</name><uri>http://www.blogger.com/profile/14514067854950617393</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-29992405.post-158161633888523712</id><published>2008-03-02T22:49:00.000-08:00</published><updated>2008-03-02T23:04:35.733-08:00</updated><title type='text'>Running Ubuntu on Windows Server 2008 Hyper-V</title><content type='html'>I'm hoping this post saves people the trouble I had with getting Ubuntu 7.10 to boot on Win2k8 Hyper-V.&lt;br /&gt;&lt;br /&gt;If you're trying to install Ubuntu 7.10 (either server or desktop) on a VT-enabled machine, you'll be probably get stuck at the &lt;span style="font-style: italic;"&gt;"Loading..."&lt;/span&gt; screen. If you're interested in the gory details, check out this &lt;a href="https://bugs.launchpad.net/ubuntu/+bug/83642"&gt;bug&lt;/a&gt; - the issue seems to be around emulation of real mode instructions and the graphics instructions that ISOLinux uses to boot.&lt;br /&gt;&lt;br /&gt;The fix is simple - get the patch from this &lt;a href="http://forums.xensource.com/thread.jspa?threadID=2438&amp;amp;start=15&amp;amp;tstart=0"&gt;thread&lt;/a&gt; and patch your ISO images (the patch makes a small change to your isolinux.cfg.&lt;br /&gt;&lt;br /&gt;Ubuntu is now purring away happily on my Win2k8 box :-)</content><link rel='alternate' type='text/html' href='http://www.sriramkrishnan.com/blog/2008/03/running-ubuntu-on-windows-server-2008.html' title='Running Ubuntu on Windows Server 2008 Hyper-V'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29992405&amp;postID=158161633888523712' title='2 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.sriramkrishnan.com/blog/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29992405/posts/default/158161633888523712'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29992405/posts/default/158161633888523712'/><author><name>Sriram</name><uri>http://www.blogger.com/profile/14514067854950617393</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-29992405.post-8148346556927037862</id><published>2008-03-02T00:57:00.000-08:00</published><updated>2008-03-02T01:03:09.327-08:00</updated><title type='text'>Cacheman update (0.0.2)</title><content type='html'>I've just put out a new Cacheman release (0.0.2 for those of you keeping count). You can get the bits from the link at the bottom of &lt;a href="http://www.sriramkrishnan.com/blog/2008/02/cacheman-fast-distributed-hashtable-for.html"&gt;http://www.sriramkrishnan.com/blog/2008/02/cacheman-fast-distributed-hashtable-for.html&lt;/a&gt; (which will always point to the latest release).&lt;br /&gt;&lt;br /&gt;There are no new features in this release but a *ton* of bug fixes. I had fun stomping out several race conditions that had crept into the code. I've also tested it on a bunch of diverse environments (single-core and multi-core, x86 and x64, Windows XP/Vista and Windows Server 2003/2008) so you shouldn't see some of the OS specific issues that were present in the last release.&lt;br /&gt;&lt;br /&gt;I would like to thank &lt;a href="http://www.ayende.com/Blog/"&gt;Ayende&lt;/a&gt; for taking the trouble to find and report a lot of the bugs in the last release. Thanks Ayende!</content><link rel='alternate' type='text/html' href='http://www.sriramkrishnan.com/blog/2008/03/cacheman-update-002.html' title='Cacheman update (0.0.2)'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29992405&amp;postID=8148346556927037862' title='1 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.sriramkrishnan.com/blog/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29992405/posts/default/8148346556927037862'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29992405/posts/default/8148346556927037862'/><author><name>Sriram</name><uri>http://www.blogger.com/profile/14514067854950617393</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-29992405.post-5709522478740736181</id><published>2008-02-25T03:34:00.001-08:00</published><updated>2008-03-02T00:56:19.667-08:00</updated><title type='text'>Cacheman - a fast distributed hashtable for Windows</title><content type='html'>&lt;p&gt;Cacheman is a fast, distributed hashtable for Windows, implemented purely in managed code. This is a personal side-project  which I started and abandoned several months ago and picked up a few weekends ago. &lt;em&gt;If you just want the binaries, scroll to the bottom of the post to get the raw, early bits&lt;/em&gt; (and I do mean raw and early!)&lt;/p&gt; &lt;p&gt;It all started with my fascination with memcached and how well it works for several heavy-traffic sites. I set off to create a bare bones hashtable with a set of requirements in mind&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Really fast and really scalable. I didn't have a firm numerical target in place but wanted to atleast do a few thousand requests per second. I wound up doing a lot more than that ( details in the how-stuff-works section below).  &lt;/li&gt;&lt;li&gt;Client agnostic i.e anyone should be able to take a look at the protocol and implement a client in their language/environment of choice. Though Cacheman can't work with current memcached clients, I've deliberately made the wire protocol similar so that I can make it compatible with some work  &lt;/li&gt;&lt;li&gt;Ops-friendly. Put simply, it shouldn't be a pain in the rear to deploy and maintain on hundreds of production machines. James Hamilton has &lt;a href="http://research.microsoft.com/%7Ejamesrh/TalksAndPapers/JamesRH_AmazonDev.pdf"&gt;written&lt;/a&gt; extensively on this subject - and I would be overjoyed if I get around to doing half the things he talks about.  &lt;/li&gt;&lt;li&gt;Windows and .NET friendly. I wanted something that felt 'native' to Windows. I don't have a good justification for this - just that I work on Windows and managed code a lot and happen to like them :)&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Note that memcached meets a lot of the requirements above. My biggest reason for starting from scratch was to just see 'whether I could do it' :-). &lt;/p&gt; &lt;p&gt;I'll walk you through a little demonstration before digging into how it works and why certain design decisions were made.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;A quick tour&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;If you grab the binaries below, you'll see 3 binaries - the server, a console/client and a library that you can link to your own apps.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Server:&lt;br /&gt;  Run CachemanServer.exe with the  /? argument to see the various arguments that you can give. By default, it'll try to bind to the first IP address and listen on port 16180 and set a maximum memory size of 100mb for the items it holds. You need to run with administrative priveleges the first time as it installs a few perf counters on first launch.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;         &lt;img style="border-width: 0px;" alt="image" src="http://www.sriramkrishnan.com/blog/images/CachemanafastdistributedhashtableforWind_E41/image.png" border="0" height="300" width="579" /&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Console:&lt;br /&gt;  Since it was a pain to write client code to test out the server, I wrote a bare-bones console. Run 'CachemanConsole.exe'  and at the prompt, type '&lt;span style=";font-family:Courier New;font-size:85%;"  &gt;connect&lt;/span&gt; &lt;span style=";font-family:Courier New;font-size:85%;"  &gt;&amp;lt;the-ip-address-the-server-is-listening-on&amp;gt;'&lt;/span&gt;. From there, you can do basic get/set/delete operations as well as run a few homegrown stress tests. Note that the times in the screenshot below are not representative of server performance - the first 5 ms set is more due to the client being run for the first time.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;         &lt;a href="http://www.sriramkrishnan.com/blog/images/CachemanafastdistributedhashtableforWind_E41/image_3.png"&gt;&lt;img style="border-width: 0px;" alt="image" src="http://www.sriramkrishnan.com/blog/images/CachemanafastdistributedhashtableforWind_E41/image_thumb.png" border="0" height="241" width="367" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;ul&gt; &lt;li&gt;Client library:&lt;br /&gt; The console is actually a thin layer over CachemanAPI.dll which is where the meat of the client lives. Frankly, I haven't had much time to work on the client API and it needs quite a bit of work and polish before it can be used in a production system.&lt;br /&gt;&lt;br /&gt;Dare Obasanjo has &lt;a href="http://www.25hoursaday.com/weblog/2007/07/05/ASPNETCachingVsMemcachedSeekingEfficientDataPartitioningLookupAndRetrieval.aspx"&gt;written&lt;/a&gt; extensively on how typical code using memcached in .NET looks like and the same pattern is applicable here too. Here's some sample code using the client library. Ignore the IPEndPoint stuff - the next release will let you write this in a nice config file and never have to deal with IP addresses and port in code.&lt;br /&gt;&lt;a href="http://www.sriramkrishnan.com/blog/images/CachemanafastdistributedhashtableforWind_E41/image_4.png"&gt;&lt;img style="border-width: 0px;" alt="image" src="http://www.sriramkrishnan.com/blog/images/CachemanafastdistributedhashtableforWind_E41/image_thumb_3.png" border="0" height="114" width="503" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;strong&gt;How stuff works  (with a few design detours and some pretty perf graphs)&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;In terms of general architecture, Cacheman is similar to memcached as opposed to other distributed hash tables (for e.g, EHCache from the Java world is an in-memory cache with async replication to the server).  The server listens on a socket, parses commands from the client and responds appropriately. The client itself is pretty dumb and is just a thin layer over some networking code. This means that Cacheman is neither a read-through nor a write-through cache at the moment.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;When you do a GET/SET/DELETE operation for a specified key, the client first needs to figure out which Cacheman server instance to talk to. To do that, the client does a quick FNV hash of the key and then mods that with the number of servers to get the server to talk to.&lt;br /&gt;&lt;br /&gt;The disadvantage of this approach is that when you add a new server node or remove a server node, the cache needs to get repopulated. The fix for this is a consistent hashing algorithm which I haven't gotten around to implementing  (and from the little I know, there are not too many of these algorithms out there)&lt;br /&gt;&lt;br /&gt;The other choice is to use a central 'master cache server' which stores a lookup table of server nodes at which the clients can constantly poll.  I'm not sure whether I like this too much as it seems to be a lot of added complexity and brings its own set of problems.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The client talks to the server using a simple network protocol. My protocol looks similar to memcached's text protocol but is stripped down and simplified. I looked at a bunch of options and my choice was influenced by a few things&lt;/li&gt; &lt;ul&gt; &lt;li&gt;Binary protocols are a pain to debug - text protocols are simple and clean, especially if you are up at 3AM poring over a Wireshark trace, IMHO :)  &lt;/li&gt;&lt;li&gt;The protocol I have is small and lightweight enough that it doesn't have much parsing or network overhead.  &lt;/li&gt;&lt;li&gt;I wanted to make my server work with the huge set of memcached clients out there today.This is going to be a challenge since the internal implementation is vastly different.     &lt;br /&gt;&lt;br /&gt;The networking layer also takes care to not do small writes. This, along with the protocol design lets me get a perf win by setting TCP_NODELAY  on my sockets.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;The most interesting part of all this was the implementation of the server. Being new to scalable servers, I wrote a few naive implementations which just didn't scale. My first implementation had a model where the server had a thread dedicated per socket. This was quite poor scalability-wise and just lead to a lot of thrashing threads.&lt;br /&gt;&lt;br /&gt;The model I have now is built around NT's &lt;a href="http://technet.microsoft.com/en-us/sysinternals/bb963891.aspx"&gt;IO Completion ports&lt;/a&gt;. Unlike the previous model, there is a M*N relationship between sockets and threads (rather than a 1:1 relationship).&lt;br /&gt;&lt;br /&gt;When data is queued to the completion port (from the client), one of the waiting threads is woken up and it goes to work on the data. Once it is done processing (either handling the request or deciding that it needs more data), it goes back to waiting by calling GetQueuedCompletionStatus internally. This lack of thread affinity for client sockets lets me multiplex several clients to a few active threads.&lt;br /&gt;&lt;br /&gt;On my home machine (2.4GHz Intel Core 2 with 2GB RAM), I can push the server to around &lt;strong&gt;16000 requests per second&lt;/strong&gt; (clients and server running on the same machine).  I *believe* I can get it to around 25K requests on the same box with a bit of work but anything above that is going to mean some serious work.&lt;br /&gt;&lt;br /&gt;Cacheman comes with a nice set of perf counters for you to get at these numbers anytime&lt;br /&gt;&lt;a href="http://www.sriramkrishnan.com/blog/images/CachemanafastdistributedhashtableforWind_E41/image_5.png"&gt;&lt;img style="border: 0px none ;" alt="image" src="http://www.sriramkrishnan.com/blog/images/CachemanafastdistributedhashtableforWind_E41/image_thumb_4.png" border="0" height="216" width="333" /&gt;&lt;/a&gt; &lt;a href="http://www.sriramkrishnan.com/blog/images/CachemanafastdistributedhashtableforWind_E41/image_6.png"&gt;&lt;img style="border: 0px none ;" alt="image" src="http://www.sriramkrishnan.com/blog/images/CachemanafastdistributedhashtableforWind_E41/image_thumb_5.png" border="0" height="104" width="244" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;However, my code isn't entirely async. When the server sends data back to the client, it blocks on the send. This was a deliberate choice - whenever I did perf tests with async sends, I saw a noticeable dip in speed (as measured in requests processed per second). My theory here is that the hit is due to the context switch between the 'request-processing' thread and the 'socket send' thread.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Internally, the cache items are stored in a giant dictionary. I plan on moving to a better model in the future as right now, I'm forced to take a lock over the entire store for any destructive action. Cache expiration is pretty naive at the moment - you have a choice of using either LRU or LFU to expire items from the cache (apart from the items which get thrown out due to living past their lifetime). I plan on adding more cache expiration algorithms in the future and looking into a generational model.  But the current model is good enough to ensure that you don't run out of memory on your server :)&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;strong&gt;The Bits&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;There is a lot of work left to be done (a better client, wrapping the server into a NT service, making things more ops friendly, lock-free internal data structures,etc) but I wanted to try the 'release-early-release often' approach for once. Things are quite busy at work (some kick-a** Popfly features in the pipeline as usual) so only expect bug fixes over the weekend :)&lt;/p&gt; &lt;p&gt;Be warned - these are really early, really raw bits. Stuff will crash or not work. The next version will change everything. Demons will be pulled out of your nose. Use at your own risk! Have fun and send feedback through the comments or to &lt;a href="mailto:mail@sriramkrishnan.com"&gt;mail@sriramkrishnan.com&lt;/a&gt; or &lt;a href="mailto:sriramk@microsoft.com"&gt;sriramk@microsoft.com&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;a href="http://www.sriramkrishnan.com/projects/cacheman/Cacheman_0_0_2.zip"&gt;&lt;strong&gt;Download - Cacheman_0_0_2.zip&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Acknowledgements&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;I don't usually have an 'acknowledgements' section but I just had to have one this time. A shout out to my friends who saw very little of me these past weekends. :) And to Brad Fitzpatrick and the rest of the Memcached folks for their awesome work.&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic;"&gt;Updated 2nd March 2008 - Updated link to Cacheman_0_0_2.zip which has a ton of bug fixes&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;</content><link rel='alternate' type='text/html' href='http://www.sriramkrishnan.com/blog/2008/02/cacheman-fast-distributed-hashtable-for.html' title='Cacheman - a fast distributed hashtable for Windows'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29992405&amp;postID=5709522478740736181' title='16 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.sriramkrishnan.com/blog/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29992405/posts/default/5709522478740736181'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29992405/posts/default/5709522478740736181'/><author><name>Sriram</name><uri>http://www.blogger.com/profile/14514067854950617393</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-29992405.post-7502792147136487434</id><published>2008-01-19T16:23:00.001-08:00</published><updated>2008-01-19T16:26:46.319-08:00</updated><title type='text'>Goosebumps</title><content type='html'>I was at a local theater yesterday to see Cloverfield and almost dropped the popcorn when I saw this.&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="373"&gt;&lt;param name="movie" value="http://www.youtube.com/v/RllSZW_YLk8&amp;rel=1&amp;border=1"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/RllSZW_YLk8&amp;rel=1&amp;border=1" type="application/x-shockwave-flash" wmode="transparent" width="425" height="373"&gt;&lt;/embed&gt;&lt;/object&gt;</content><link rel='alternate' type='text/html' href='http://www.sriramkrishnan.com/blog/2008/01/goosebumps.html' title='Goosebumps'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29992405&amp;postID=7502792147136487434' title='2 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.sriramkrishnan.com/blog/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29992405/posts/default/7502792147136487434'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29992405/posts/default/7502792147136487434'/><author><name>Sriram</name><uri>http://www.blogger.com/profile/14514067854950617393</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-29992405.post-7600952727231975453</id><published>2008-01-11T13:49:00.001-08:00</published><updated>2008-01-11T13:49:33.038-08:00</updated><title type='text'>Live action Popfly tutorial</title><content type='html'>&lt;p&gt;My team put this together a few weeks ago. I fell sick on the day of the shoot and couldn't make it into the video unfortunately :-(.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.youtube.com/watch?v=tpmvtDQ8-kQ"&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;embed src="http://www.youtube.com/v/tpmvtDQ8-kQ&amp;amp;rel=1" width="425" height="355" type="application/x-shockwave-flash" wmode="transparent"&gt;&lt;/embed&gt;  </content><link rel='alternate' type='text/html' href='http://www.sriramkrishnan.com/blog/2008/01/live-action-popfly-tutorial.html' title='Live action Popfly tutorial'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29992405&amp;postID=7600952727231975453' title='1 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.sriramkrishnan.com/blog/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29992405/posts/default/7600952727231975453'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29992405/posts/default/7600952727231975453'/><author><name>Sriram</name><uri>http://www.blogger.com/profile/14514067854950617393</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-29992405.post-727005946896628160</id><published>2007-12-14T00:28:00.001-08:00</published><updated>2007-12-14T21:16:16.979-08:00</updated><title type='text'>Amazon SimpleDB - Technical Overview</title><content type='html'>&lt;p&gt;Structured storage was one of the missing pieces in Amazon's cloud services jigsaw puzzle (the other has to be the ability to host a site completely on EC2 without using dynamic DNS hacks) and Amazon is plugging that hole today with the launch of SimpleDB.&lt;/p&gt; &lt;p&gt;There is an &lt;a href="http://www.informationweek.com/news/showArticle.jhtml?articleID=204803008"&gt;Information Week article&lt;/a&gt; and the official site is at &lt;a title="http://aws.amazon.com/simpledb" href="http://aws.amazon.com/simpledb"&gt;http://aws.amazon.com/simpledb&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Here are the highlights as I see it&lt;/p&gt; &lt;ul&gt; &lt;li&gt; Structured storage service in the same model as EC2 and S3.&lt;/li&gt; &lt;li&gt;Launching in a limited beta in a few weeks (I've signed up on the waiting list)&lt;/li&gt; &lt;li&gt;$0.14 per machine hour, $0.10 per GB of data transferred in. The data 'out' pricing is a bit interesting - $0.18 for the first 10 terabytes for the month, $0.16 for the next 40 TB and $0.13 for all data after that. &lt;/li&gt; &lt;li&gt;Apart from this, there is a cost for storing data -$1.50 per GB per month. Note that you can store data on S3 for cheaper rates and transfer it to SimpleDB  for free&lt;/li&gt; &lt;li&gt;10 GB  maximum per domain (think 'table') and a limit of 100 such domains. Amazon indicates that these restrictions will be loosened soon.&lt;/li&gt; &lt;li&gt;Data model is similar to that of a spreadsheet, except that each 'cell' can have multiple values. The screenshot below (stolen from their documentation) shows off the model very well. The individual worksheets are 'domains' in SimpleDB terminology, rows are 'items' and columns are 'attributes'. However, each item can have more than one value for an attribute (a car could be both 'blue' and 'black') and attributes are optional. In this respect, the model is similar to Google's  BigTable. They are pretty dissimilar in other aspects - BigTable stores previous versions of all values and SimpleDB can do limited subset of SQL.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.sriramkrishnan.com/blog/images/AmazonSimpleDBTechnicalOverview_14BB8/image.png"&gt;&lt;img style="border: 0px none ;" alt="image" src="http://www.sriramkrishnan.com/blog/images/AmazonSimpleDBTechnicalOverview_14BB8/image_thumb.png" border="0" height="221" width="576" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/li&gt; &lt;li&gt;Both REST and SOAP apis available (the WSDL should be up soon at &lt;a title="http://sdb.amazonaws.com/doc/2007-11-07/AmazonSimpleDB.wsdl" href="http://sdb.amazonaws.com/doc/2007-11-07/AmazonSimpleDB.wsdl"&gt;http://sdb.amazonaws.com/doc/2007-11-07/AmazonSimpleDB.wsdl&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;There were a bunch of things which caught my eye&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Pricing&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;The pricing for storing data on SimpleDB is much higher than the costs on S3. Storing 1 GB of data on S3 for a month is going to cost you $0.15 while the same on SimpleDB is going to set you back on by $1.50. This points to Amazon using pretty different hardware for the two services.&lt;/p&gt; &lt;p&gt;I'm also fascinated by the idea of 'box usage'. For every query, Amazon returns the amount of 'machine time' used to execute that query. Since these queries are almost surely getting distributed over a variety of nodes, I'm curious to know how this 'machine time' is calculated. &lt;/p&gt; &lt;p&gt;&lt;strong&gt;Data Model and APIs&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;I love the data model for SimpleDB. I've never been a fan of relational tables and SQLs and prefer data structures where everything's just one huge hashtable. Though SimpleDB's data model is not exactly a hashtable, it is pretty close. There are several things to like here if your programming loyalty lies with the dynamic side&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Optional attributes&lt;/li&gt; &lt;li&gt;No types - you can stick any value into any attribute. &lt;/li&gt; &lt;li&gt;Multiple values per attribute (think lists or tuples)&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;All these things are possible using standard databases but would require quite a bit of work. And changing table schemas once you've piled up a decent amount of data is definitely not fun.&lt;/p&gt; &lt;p&gt;To program against the data, you have a choice of (some very clean!)REST APIs and SOAP APIs. Here's a sample REST request and response pair from the docs&lt;/p&gt; &lt;blockquote&gt;&lt;br /&gt;Sample Request&lt;br /&gt;&lt;br /&gt;https://sdb.amazonaws.com/&lt;br /&gt;?Action=Query&lt;br /&gt;&amp;amp;AWSAccessKeyId=[valid access key id]&lt;br /&gt;&amp;amp;DomainName=MyDomain&lt;br /&gt;&amp;amp;MaxNumberOfItems=3&lt;br /&gt;&amp;amp;NextToken=[valid next token]&lt;br /&gt;&amp;amp;QueryExpression=%5B%27Color%27%3D%27Blue%27%5D&lt;br /&gt;&amp;amp;SignatureVersion=1&lt;br /&gt;&amp;amp;Timestamp=2007-06-25T15%3A03%3A09-07%3A00&lt;br /&gt;&amp;amp;Version=2007-11-07&lt;br /&gt;&amp;amp;Signature=2wVXB1x0NSWWETwLylZPVP%2FtqXQ%3D&lt;br /&gt;&lt;br /&gt;Sample Response&lt;br /&gt;&lt;br /&gt;&amp;lt;QueryResponse xmlns="http://sdb.amazonaws.com/doc/2007-11-07"&amp;gt;&lt;br /&gt;&amp;lt;QueryResult&amp;gt;&lt;br /&gt;&amp;lt;ItemName&amp;gt;eID001&amp;lt;/ItemName&amp;gt;&lt;br /&gt;&amp;lt;ItemName&amp;gt;eID002&amp;lt;/ItemName&amp;gt;&lt;br /&gt;&amp;lt;ItemName&amp;gt;eID003&amp;lt;/ItemName&amp;gt;&lt;br /&gt;&amp;lt;/QueryResult&amp;gt;&lt;br /&gt;&amp;lt;ResponseMetadata&amp;gt;&lt;br /&gt;&amp;lt;RequestId&amp;gt;c74ef8c8-77ff-4d5e-b60b-097c77c1c266&amp;lt;/RequestId&amp;gt;&lt;br /&gt;&amp;lt;BoxUsage&amp;gt;0.0000219907&amp;lt;/BoxUsage&amp;gt;&lt;br /&gt;&amp;lt;/ResponseMetadata&amp;gt;&lt;br /&gt;&amp;lt;/QueryResponse&amp;gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Eventual Consistency&lt;/strong&gt;&lt;br /&gt;&lt;/p&gt;This is going to surprise a lot of SimpleDB users (and probably cause a lot of hard bugs). Reading data from SimpleDB immediately after a write may not reflect the latest updates.  SimpleDB relaxes the 'C' in ACID and doesn't promise that you'll instantly see your updates (due to it being propagated across all the copies of your data). Amazon may not have a choice here (see &lt;a href="http://citeseer.ist.psu.edu/544596.html"&gt;CAP Conjecture&lt;/a&gt;) but I don't think this is going to be popular with a lot of programmers.&lt;br /&gt;&lt;p&gt;Dare talks about this &lt;a href="http://www.25hoursaday.com/weblog/2007/10/10/WhenDatabasesLieConsistencyVsAvailabilityInDistributedSystems.aspx"&gt;extensively&lt;/a&gt; and as someone writes code for a high traffic website with lots of data flowing around, I shudder at the prospect of not relying on data not being always up to date. For SimpleDB developers, this is going to mean some extensive coding to make their apps resistant to stale data - something programmers traditionally never had to worry about.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Another possibility is that frameworks could take away the pain of doing this checking - this is definitely going to be an interesting place to watch.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Query language&lt;/strong&gt;&lt;br /&gt;Unlike Google's BigTable which eschews any and all forms of querying (probably in favor of a map-reduce type paradigm), SimpleDB supports a simple set of query operators - =, !=, &amp;lt;, &amp;gt; &amp;lt;=, &amp;gt;=, STARTS-WITH,  AND, OR, NOT, INTERSECTION AND UNION. Also, queries can only execute for a maximum of 5 seconds.&lt;br /&gt;&lt;/p&gt;There are several interesting properties here&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Since the data is split across several nodes, these queries must be getting palletized across several machines. There's been a ton of academic work on database query parallelism and you can be sure Amazon is making full use of it here .&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The 'type-less' data model is going to lead to some peculiar query problems. For example, when comparing '13-5-2007' and '24-4-2006', do you compare it as a couple of dates or do you compare it as a couple of strings? The docs talk about this &lt;a href="http://docs.amazonwebservices.com/AmazonSimpleDB/2007-11-07/DeveloperGuide/SDB_API_Query.html"&gt;problem&lt;/a&gt; and asks developers to convert all dates to ISO 8601 format.&lt;br /&gt;&lt;br /&gt;This is probably another example of Amazon choosing implementation simplicity even if it means that the developers have to do a bit more work. This is not necessarily a bad thing - I've seen products (non-Microsoft and Microsoft) which try and do the opposite and they're not necessarily always successful.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;The ecosystem and the competition&lt;/strong&gt;&lt;br /&gt;Amazon has built a good ecosystem around their services. Their services all work together (the same AWS keys can be used, the same X.509 certificate system,etc). The only thing missing is the ability to statically host a site completely on Amazon. What's even more surprising to me is that these are the sort of services that you would expect Google to release, given their much talked about infrastructure. As far as Microsoft goes, the only current service I can think of that comes close is &lt;a href="http://astoria.mslivelabs.com/"&gt;Astoria&lt;/a&gt; (something which I should definitely spend more time digging into).&lt;br /&gt;&lt;br /&gt;If Amazon does as good a job with this as they did with S3 and EC2, startups are going to love this service. Instead of having to shell out a ton of money up front and having to worry about dedicated hosting and colos, you now have a pay-as-you-go database in the sky.&lt;br /&gt;&lt;/p&gt;&lt;p style="font-weight: bold;"&gt;Update #1&lt;br /&gt;&lt;/p&gt;&lt;p&gt;This &lt;a href="http://www.satine.org/archives/2007/12/13/amazon-simpledb/"&gt;post&lt;/a&gt; says that SimpleDB is built on Erlang. Interesting!&lt;/p&gt;&lt;p style="font-weight: bold;"&gt;Update #2&lt;/p&gt;&lt;p&gt;See the &lt;a href="http://www.techcrunch.com/2007/12/14/amazon-takes-on-oracle-and-ibm-with-simple-db-beta/"&gt;Techcrunch post&lt;/a&gt; and the Techmeme discussion &lt;a href="http://www.techmeme.com/071214/p53#a071214p53"&gt;here &lt;/a&gt;&lt;br /&gt;&lt;/p&gt;</content><link rel='alternate' type='text/html' href='http://www.sriramkrishnan.com/blog/2007/12/amazon-simpledb-technical-overview.html' title='Amazon SimpleDB - Technical Overview'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29992405&amp;postID=727005946896628160' title='3 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.sriramkrishnan.com/blog/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29992405/posts/default/727005946896628160'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29992405/posts/default/727005946896628160'/><author><name>Sriram</name><uri>http://www.blogger.com/profile/14514067854950617393</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-29992405.post-6748457050075568427</id><published>2007-10-24T12:14:00.001-07:00</published><updated>2007-10-24T12:14:42.078-07:00</updated><title type='text'>The drama! The suspense!</title><content type='html'>&lt;p&gt;Someday, I hope they make a good movie out of the wild and crazy times we live in.&lt;/p&gt; &lt;p&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="198" alt="image" src="http://www.sriramkrishnan.com/blog/images/ThedramaThesuspense_AC2E/image.png" width="500" border="0"&gt;&lt;/p&gt; </content><link rel='alternate' type='text/html' href='http://www.sriramkrishnan.com/blog/2007/10/drama-suspense.html' title='The drama! The suspense!'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29992405&amp;postID=6748457050075568427' title='3 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.sriramkrishnan.com/blog/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29992405/posts/default/6748457050075568427'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29992405/posts/default/6748457050075568427'/><author><name>Sriram</name><uri>http://www.blogger.com/profile/14514067854950617393</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-29992405.post-5286720872768401495</id><published>2007-10-18T09:16:00.001-07:00</published><updated>2007-10-18T10:20:01.879-07:00</updated><title type='text'>Popfly - open to everyone!</title><content type='html'>&lt;p&gt;I see that Soma has put up his &lt;a href="http://blogs.msdn.com/somasegar/archive/2007/10/18/popfly-beta.aspx"&gt;post&lt;/a&gt; which means that this is now official -Popfly is no longer in alpha! This means that the old invite system is now gone - anyone can head on over to &lt;a href="http://www.popfly.com/"&gt;www.popfly.com&lt;/a&gt; and start using Popfly instantly. Woohoo!&lt;/p&gt; &lt;p&gt;It has been a fun and wacky ride to this point. Since May, we've added a ton of features and made a lot of changes across the board. From integration with Dapper and Facebook and a slew of other sites, to making the site a whole lot faster for everyone to a lot of other goodies.  Instead of linking to just one mashup like everyone has, I urge you to check out this &lt;a href="http://www.popfly.ms/users/Team/web2summit.content"&gt;mashup of mashups&lt;/a&gt; (if you're at the Web 2.0 summit, you would have seen the kiosks running this).&lt;/p&gt; &lt;p&gt;For me, it has been a wild ride from the time I joined the team in May. I've worked on features as varied as Dapper and Facebook integration to the site-wide search and ranking system. I've learned a *lot* about building massive web 2.0 sites/services - for someone coming from a traditional desktop software background, it has been a pretty crazy experience.&lt;/p&gt; &lt;p&gt;And talking about crazy, here's a photo I took of the crazy team that builds Popfly (this was taken in my office on my birthday)&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;img style="border: 0px none ;" alt="DSC00413" src="http://www.sriramkrishnan.com/blog/images/Popflyopentoeveryone_8265/DSC00413.jpg" border="0" height="380" width="504" /&gt;&lt;/p&gt;&lt;p&gt;Update: Here's the &lt;a href="http://www.techmeme.com/071018/p60#a071018p60"&gt;Techmeme discussion&lt;/a&gt;.&lt;br /&gt;&lt;/p&gt;</content><link rel='alternate' type='text/html' href='http://www.sriramkrishnan.com/blog/2007/10/popfly-open-to-everyone.html' title='Popfly - open to everyone!'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29992405&amp;postID=5286720872768401495' title='1 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.sriramkrishnan.com/blog/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29992405/posts/default/5286720872768401495'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29992405/posts/default/5286720872768401495'/><author><name>Sriram</name><uri>http://www.blogger.com/profile/14514067854950617393</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-29992405.post-4633328125715864202</id><published>2007-09-10T01:58:00.001-07:00</published><updated>2007-09-10T01:58:08.665-07:00</updated><title type='text'>Dave Cutler and the Bill Gates award</title><content type='html'>&lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Dave_Cutler_(software_engineer)"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="200" alt="image" src="http://www.sriramkrishnan.com/blog/images/DaveCutlerandtheBillGatesaward_12A1/image.png" width="159" align="left" border="0"&gt;&lt;/a&gt; Adam Barr beat me to a post that I wanted to write after the Microsoft company meeting on Thursday - Dave Cutler winning the Bill Gates award. Adam has a &lt;a href="http://www.proudlyserving.com/archives/2007/09/dave_cutler_win.html"&gt;nice summary&lt;/a&gt; of what the award is and a couple of typical DaveC anecdotes. &lt;/p&gt; &lt;p&gt;What he doesn't describe is the atmosphere in the stadium when Bill Gates announced Cutler's name - you had thousands of employees give DaveC a standing ovation (and laugh at the joke DaveC cracked in his acceptance speech which I see Adam wisely left out :-) ). I remember telling someone sitting next to me &lt;em&gt;"There goes any chance I had of ever winning this thing".&lt;/em&gt; When you start of an award series by handing one to Cutler, you're setting a standard which is almost impossible to live upto.&lt;/p&gt; &lt;p&gt;After the event, I sent him a heartfelt 'thank you' mail. I'm not sure whether he read it (I haven't gotten a reply yet) but I wanted to convey the gratitude that all of us felt - no accolade or award is too much for this man. Studying Cutler's life and his work in the past year or so have lead me to my current fascination for how to do good, sound 'engineering' (as opposed to just writing code and hacking together code).&lt;/p&gt; &lt;p&gt;I've talked to a lot of people who have worked with Cutler in the past. Almost everyone I spoke usually had two things to say&lt;/p&gt; &lt;ul&gt; &lt;li&gt;He was the greatest programmer/engineer/project leader they've ever seen.  &lt;li&gt;He was the angriest and scariest person they've ever worked for&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;The latter is where all the fun anecdotes come from. Here are a couple of anecdotes I've heard from people who had worked with Cutler in the past. All these probably happened over a decade ago.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;If you made a bad checkin, Cutler would take the offending piece of code and send a mail to Jim Allchin (who was the VP for Windows and a bunch of other stuff) with the additional line &lt;em&gt;"Do you know that this person works for you?".&lt;/em&gt; The fun part was that you as the developer never got CCed so you were never really sure what was getting sent to Jim Allchin about you :-). Of course, no one ever got fired&amp;nbsp; as a result of this but it always kept people on their toes. :-)  &lt;li&gt;DaveC and members of his team were having a meeting in a conference room when a senior VP walked in with some bigshot she &lt;sup&gt;1&lt;/sup&gt; was meeting. There had obviously been some conference boom booking snafu. Clearly impatient, she snapped &lt;em&gt;"I believe I had booked this room? Can you people please leave?"&lt;br&gt;&lt;/em&gt;Big mistake.&lt;br&gt;Cutler slowly stood up and said &lt;em&gt;"I'm Dave Cutler. Who the f*** are you?". &lt;/em&gt;The VP quickly closed the door and beat a retreat without saying a word. Later, someone on Cutler's team looked up the conference booking information and found that the VP was right - she *had* booked the room and Cutler's team had mistakenly come to the wrong room. :-) &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Seriously though, Cutler is probably the greatest programmer to work at Microsoft (a senior friend of mine called him a "contender for the programmer of the century of the century award"). If you're at Microsoft, I would strongly recommend reading through Cutler's code (you can do this if you are a student and have access to the Windows Research Kernel). I learnt a lot about how to write beautiful C code by looking at his scheduler implementation in the NT kernel. Above the level of coding style, it is pretty evident that he was able to make design choices back in the late 1980s that have let the NT kernel scale and adapt itself in a wide variety of ways. &lt;/p&gt; &lt;p&gt;Designing and writing large parts of an operating system that is used by almost a billion people - that's a pretty tough act to follow. &lt;/p&gt; &lt;p&gt;&lt;strong&gt;Notes&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;1. I think the person who told me this anecdote said it was a 'she' but I could be mistaken.&lt;/p&gt; </content><link rel='alternate' type='text/html' href='http://www.sriramkrishnan.com/blog/2007/09/dave-cutler-and-bill-gates-award.html' title='Dave Cutler and the Bill Gates award'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29992405&amp;postID=4633328125715864202' title='8 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.sriramkrishnan.com/blog/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29992405/posts/default/4633328125715864202'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29992405/posts/default/4633328125715864202'/><author><name>Sriram</name><uri>http://www.blogger.com/profile/14514067854950617393</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-29992405.post-8376729370214756769</id><published>2007-09-10T00:49:00.001-07:00</published><updated>2007-09-10T00:49:04.149-07:00</updated><title type='text'>Apps of yesteryear (or) The one in which I feel old</title><content type='html'>&lt;p&gt;A conversation I had with &lt;a href="http://www.aarthir.com"&gt;Aarthi&lt;/a&gt; yesterday went like this&lt;/p&gt; &lt;p&gt;&lt;em&gt;Me: I feel old.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;Aarthi: Why?&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;Me: In the past, when I saw some good-looking girl on television and looked her up on the web, she would be much older than I am. Today, I looked up &lt;/em&gt;&lt;a href="http://en.wikipedia.org/wiki/Deepika_Padukone"&gt;&lt;em&gt;Deepika Padukone&lt;/em&gt;&lt;/a&gt;&lt;em&gt; and to my shock and horror, she's 3 years younger! I feel middle-aged.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Seriously though, I've now spent enough time with computers to see a generation of software. I find that my usage of software has changed - I no longer use apps that I used to use all the time 4-5 years ago. Here are some of the apps I used to use a lot in the past but now no longer use at all.&lt;/p&gt; &lt;p&gt;Note - most of the apps below still have thriving user-bases so don't read this as a&lt;em&gt; 'X or Y was used in the past but is now dead'&lt;/em&gt; post.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;font size="4"&gt;&lt;strong&gt;Winamp&lt;/strong&gt; &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Winamp"&gt;&lt;img src="http://upload.wikimedia.org/wikipedia/en/0/09/Winamp1.006.PNG" align="right"&gt;&lt;/a&gt; For several years, Winamp was my music player of choice. I don't remember how exactly I came across it - I must have got it through one of those computer magazine CDs I used to collect back then. I remember collecting hundreds of skins for it and installing a zillion different plugins ( the most memorable were the DSP plugins which did magic to how it *sounded*). &lt;/p&gt; &lt;p&gt;This was back in the day when a new version of some software had new features (as opposed to a security fix :-) ). Whenever there was a new version distributed, I would install it and go straight to the About screen where there would be some funny release notes.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;What I use now&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Windows Media Player / iTunes&lt;/p&gt; &lt;p&gt;I'm not quite sure why I moved away from Winamp - I do remember spending a long time away from it after the disastrous Winamp 3 and then moving back to Winamp 5. I think over time, WMP caught up and fixed a lot of the annoyances that had stopped me from using it in the past. &lt;br&gt;&lt;br&gt;To Winamp's credit, a lot of my friends back home in India still swear by it. This may just be a case of me being assimilated by the B0rg :-)&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;IrfanView&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Before the likes of Picasa and Windows Live Photo Gallery, you were out of luck if you had an image in a non-mainstream format (I used to run into this a lot from my past in game map-making) . You can argue that you're still out of luck but I just don't deal with much of those images anymore. &lt;a href="http://en.wikipedia.org/wiki/IrfanView"&gt;IrfanView&lt;/a&gt; was the best story in town for image viewing - it could deal with images from almost any format and was *very* light-weight.&lt;/p&gt; &lt;p&gt;From the website, it appears that IrfanView is still going strong. The author &lt;a href="http://www.irfanview.com/main_about.htm"&gt;appears&lt;/a&gt; to be getting..umm... a lot of love from his users. Quoting from his site&lt;/p&gt; &lt;p&gt;&lt;em&gt;...In the years since IrfanView hit the Net I've received more than 50,000 e-mail messages thanking me, congratulating me, and wishing me well. And at least a dozen women have wanted me to be the father of their children ;-)...&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;What I use now&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;The picture viewer built into Windows or whichever OS I happen to be using at the moment. I've dabbled with Picasa and Windows Live Photo Gallery but have found plain ol' files and folders good enough for most of my needs.&lt;/p&gt; &lt;p&gt;IrfanView is still a great app - there are lessons to be learnt from the community support it enjoys (check out the number of codecs, skins packs, etc). &lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;Winzip&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/WinZip"&gt;&lt;img src="http://upload.wikimedia.org/wikipedia/en/9/9e/Winzip-logo.png" align="right"&gt;&lt;/a&gt; Winzip was the de-facto archiver pretty much wherever you went. I remember seeing it on all my school computers, all the computers at college and on every friend's PC. However, I always remember seeing the shareware version (which used to pop-up a nag screen) so I'm not sure whether any of the people I saw actually bought a copy of it.&lt;/p&gt; &lt;p&gt;I remember the day when I stopped using the Winzip 'wizard' and just used the plain interface. That was probably the first time I felt like a true 'power user' :-).&lt;/p&gt; &lt;p&gt;I hadn't followed Winzip news for a few years now - they seem to have been acquired by Corel and do have a new version (v11.1) out. They also have support for RAR and Bz2 now so I should probably go and give them a try.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;What I use now&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;I moved to using WinRar and now 7-zip for some of the more esoteric compression formats. For good ol' zip files, I just use the 'Compressed Folders' support built into Windows. &lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;Visual Basic 6.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt; What more can I say :-). This was the single biggest reason I took up programming full-time. Though I don't use VB day-to-day anymore, I still&lt;a href="http://en.wikipedia.org/wiki/Visual_Basic"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="181" alt="image" src="http://www.sriramkrishnan.com/blog/images/TheoneinwhichIfeelold_14D8F/image.png" width="216" align="right" border="0"&gt;&lt;/a&gt; feel that my life revolves around the VB family. Apart from the fact that I work in the same building as the VB team, what we're doing with&amp;nbsp; Popfly is in a lot of ways, VB 'for the web'.&lt;/p&gt; &lt;p&gt;It annoys me that VB6 doesn't get the credit it deserves at times. I would rank it as one of Microsoft's greatest applications ever, probably second only to Windows 95 and some of the Office releases.&lt;/p&gt; &lt;p&gt;Sometimes, I miss the days of installing VS 6 and then MSDN from the multiple CDs (ok- maybe not the multiple CDs bit). I should have guessed back then that I'll wind up working for Developer Division and be a part of making Visual Studio :-) &lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;What I use now&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Too many to list here :-)&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;I can think of a lot more apps that I've used in short bursts - Paintshop Pro, ACDSee, WinAce. Before anyone flames me, this list is Windows only because that's where I've done almost all of my computing. Also, a lot of the open source apps I use (Firefox/Thunderbird) are still apps that I use everyday.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;I wonder whether someone will go through a similar exercise a few years later with social network sites of today :-). Does anyone have other examples of applications they used a lot in the past?&lt;/p&gt; </content><link rel='alternate' type='text/html' href='http://www.sriramkrishnan.com/blog/2007/09/apps-of-yesteryear-or-one-in-which-i.html' title='Apps of yesteryear (or) The one in which I feel old'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29992405&amp;postID=8376729370214756769' title='6 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.sriramkrishnan.com/blog/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29992405/posts/default/8376729370214756769'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29992405/posts/default/8376729370214756769'/><author><name>Sriram</name><uri>http://www.blogger.com/profile/14514067854950617393</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-29992405.post-4291280133764047988</id><published>2007-09-09T16:16:00.001-07:00</published><updated>2007-09-09T16:16:21.597-07:00</updated><title type='text'>Social Graph = Blogging 2.0?</title><content type='html'>&lt;p&gt;Is it just me or are the people talking about the 'social graph' and&amp;nbsp;speaking at&amp;nbsp;conferences around the theme the same folks who were speaking&amp;nbsp;at blogging conferences until they became passe ?&lt;/p&gt; &lt;p&gt;It's getting to the point where I just skip over any post in my feed reader which has the term in it.&lt;/p&gt; &lt;p&gt;P.S I don't include people&amp;nbsp;like&amp;nbsp;danah boyd or Dare Obasanjo in the list above as they actually&amp;nbsp;*work* in that area.&amp;nbsp;&lt;/p&gt;</content><link rel='alternate' type='text/html' href='http://www.sriramkrishnan.com/blog/2007/09/social-graph-blogging-20.html' title='Social Graph = Blogging 2.0?'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29992405&amp;postID=4291280133764047988' title='1 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.sriramkrishnan.com/blog/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29992405/posts/default/4291280133764047988'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29992405/posts/default/4291280133764047988'/><author><name>Sriram</name><uri>http://www.blogger.com/profile/14514067854950617393</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-29992405.post-6578590246298112199</id><published>2007-09-01T23:00:00.001-07:00</published><updated>2007-09-01T23:00:09.457-07:00</updated><title type='text'>A 'Hello World' Windows driver from scratch</title><content type='html'>&lt;p&gt;One of the advantages of having no social life is that you get to spend long weekends catching up on technical topics that you otherwise wouldn't be able to :-). For this weekend, I decided to take a break from the usual feverish Popfly hacking and catch up on some stuff I've always wanted to&amp;nbsp;dig into but never really found the time for.&amp;nbsp;&lt;/p&gt; &lt;p&gt;On the top of my list was to go and learn how Windows *really* works in kernel mode (a&amp;nbsp; pretty&amp;nbsp;long way away from my daily managed code/JS hackery). I ordered a copy of &lt;a href="http://www.amazon.com/Microsoft-Windows-Internals-Fourth-Pro-Developer/dp/0735619174"&gt;Microsoft Windows Internals&lt;/a&gt; by the incomparable &lt;a title="Mark Russinovich blog" href="http://blogs.technet.com/markrussinovich/"&gt;Mark Russinovich&lt;/a&gt; and David Solomon&amp;nbsp;and after some re-reading (the last time I read it was over a year ago), set out to write my first device driver.&lt;a href="http://www.amazon.com/Microsoft-Windows-Internals-Fourth-Pro-Developer/dp/0735619174" atomicselection="true"&gt;&lt;img src="http://g-ec2.images-amazon.com/images/I/51ZE8R1VAEL._BO2,204,203,200_PIsitb-dp-500-arrow,TopRight,45,-64_OU01_AA240_SH20_.jpg" align="right"&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;This is not the first time I've tried to do so and I've often forgotten how to get started . This post is mostly a reference for me to come and look up later.&lt;/p&gt; &lt;p&gt;&lt;em&gt;Note: This really isn't a tutorial. I would strongly suggest that you read all of &lt;a href="http://www.catch22.net/tuts/"&gt;James Brown's tutorials&lt;/a&gt; which do a much better job of *explaining* this stuff.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Pre-requisites (all free downloads)&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;The latest &lt;a href="http://www.microsoft.com/whdc/devtools/ddk/default.mspx"&gt;Windows Driver Kit&lt;/a&gt; installed. I pulled a copy from one of our internal shares but I just found out that it is now a free download as well (you could only get it shipped to you in the past).&lt;br&gt; &lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=04D26402-3199-48A3-AFA2-2DC0B40A73B6&amp;amp;displaylang=en"&gt;Microsoft Virtual PC&lt;/a&gt;. This is to let me test my driver without having to get another machine and finding the right cable to go between them (I'm just lazy).&amp;nbsp;Modifying this tutorial to work with a real machine is pretty trivial.&lt;br&gt; &lt;li&gt;&lt;a href="http://www.microsoft.com/whdc/devtools/debugging/default.mspx"&gt;Debugging Tools for Windows&lt;/a&gt;. Visual Studio cannot do kernel-mode debugging and hence you need to use the&amp;nbsp;WinDBG/NTSD/CDB family of debuggers.&lt;br&gt; &lt;li&gt;Windows XP/2003/Vista installed on VPC. In my case, I have a Win2k3 VPC but depending on which operating system you have, pick the right build environment in the 'Build your driver' section below.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Code for your driver&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;1. Create a directory where your driver sources will lie. For the following example,&amp;nbsp;all&amp;nbsp;my source&amp;nbsp;files will lie&amp;nbsp;in C:\testdrv&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;2. Create a file called &lt;strong&gt;test.c&lt;/strong&gt; with the following contents. This is as simple a driver as you can get (in fact, it doesn't even know how to unload itself). When started, it prints a 'Hello World' message which any attached kernel debugger or DbgView will see.&lt;br&gt;&lt;/p&gt;&lt;pre class="alt"&gt;#include &amp;lt;ntddk.h&amp;gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath) &amp;nbsp;&lt;br&gt;{&lt;/pre&gt;&lt;pre&gt;  DbgPrint(&lt;span class="str"&gt;"Hello World\n"&lt;/span&gt;);&lt;br&gt;  &lt;span class="kwrd"&gt;return&lt;/span&gt; STATUS_SUCCESS;&lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;3.&amp;nbsp;Create a file called &lt;strong&gt;makefile.def&lt;/strong&gt; with the following line it it. This pulls in the appropriate makefile for your build environment (more on that later).&lt;br&gt;&lt;br&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp; !INCLUDE $(NTMAKEENV)\makefile.def&lt;/font&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;4. Create a file called &lt;strong&gt;sources&lt;/strong&gt; (note that it doesn't have any extension) with the following contents. This specifies which source files you are compiling, that it will build a driver and the headers and lib files to use.&amp;nbsp;&lt;/p&gt;&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;br /&gt;&lt;p&gt;&lt;font face="Courier New" size="1"&gt;TARGETNAME = test&lt;br&gt;TARGETPATH = obj&lt;br&gt;TARGETTYPE = DRIVER &lt;/font&gt;&lt;br /&gt;&lt;p&gt;&lt;font face="Courier New" size="1"&gt;INCLUDES = %BUILD%\inc&lt;br&gt;LIBS = %BUILD%\lib &lt;/font&gt;&lt;br /&gt;&lt;p&gt;&lt;font face="Courier New" size="1"&gt;SOURCES = test.c&lt;/font&gt; &lt;br /&gt;&lt;p&gt;&amp;nbsp; &lt;br /&gt;&lt;p&gt;&lt;strong&gt;Building your driver&lt;a href="http://www.sriramkrishnan.com/blog/images/AHelloWorldWindowsdriver_E84B/image.png" atomicselection="true"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="138" alt="image" src="http://www.sriramkrishnan.com/blog/images/AHelloWorldWindowsdriver_E84B/image_thumb.png" width="265" align="right" border="0"&gt;&lt;/a&gt;&lt;/strong&gt; &lt;br /&gt;&lt;p&gt;1. &amp;nbsp;Click on Start-&amp;gt;All Programs-&amp;gt;Windows Driver Kits-&amp;gt;WDK 6000-&amp;gt;Build Environments-&amp;gt;Windows Server 2003-&amp;gt;Windows Server 2003 x86 Checked Build. I'm picking this since I have a 32-bit Win2k3 &amp;nbsp;VPC - pick the one which matches the closest with your target machine. For example, if you have a physical Windows Vista x64 machine you want to try out your driver on, you would pick &lt;em&gt;'Windows Vista and Windows Server Longhorn x64 Checked Build Environment'&lt;/em&gt;.&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;p&gt;&amp;nbsp;This drops you into a command prompt with some nice environment variables (your build environment) already set for you. &lt;br /&gt;&lt;p&gt;&amp;nbsp; &lt;br /&gt;&lt;p&gt;2. Change to the directory which has your driver source and run 'build'. This invokes build.exe , the de-facto Microsoft build tool for&amp;nbsp;almost two decades until MSBuild came on the scene (and even now, a lot of product groups still use build.exe). Written by Steve Wood over 15 years ago, this is one tool that has withstood the test of time :-) &lt;sup&gt;1&lt;/sup&gt;&lt;br&gt;&lt;br&gt;&lt;a href="http://www.sriramkrishnan.com/blog/images/AHelloWorldWindowsdriver_E84B/image_3.png" atomicselection="true"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="352" alt="image" src="http://www.sriramkrishnan.com/blog/images/AHelloWorldWindowsdriver_E84B/image_thumb_3.png" width="549" border="0"&gt;&lt;/a&gt;&amp;nbsp;&lt;br&gt;&lt;br&gt;If you've followed along well, you should see a&amp;nbsp;&lt;strong&gt;test.sys&lt;/strong&gt; and a &lt;strong&gt;test.pdb&lt;/strong&gt; (along with other files) in your object build directory. &lt;br /&gt;&lt;p&gt;&amp;nbsp; &lt;br /&gt;&lt;p&gt;&lt;strong&gt;Setting up your target machine for kernel debugging&lt;/strong&gt; &lt;br /&gt;&lt;p&gt;1. To attach a kernel debugger to a running instance of Windows, you need to do some minor configuration. In the target VPC Win2k3 instance, go to My Computer-&amp;gt;Properties-&amp;gt;Advance-&amp;gt;Settings under Startup and Recovery-&amp;gt;Edit. You should see a line like &lt;br&gt;&lt;br&gt;&lt;font face="Courier New" size="1"&gt;multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Windows Server 2003, Enterprise" /fastdetect /NoExecute=OptOut&lt;br&gt;&lt;/font&gt;&lt;br&gt;Add &lt;font face="Courier New" size="1"&gt;"/debug /debugport=com1&lt;/font&gt;" to the line above (without the quotes).&lt;br&gt;&lt;br&gt;If you're using Windows Vista as your target operating system, you can't use this technique - you'll have to use the inbuilt bcdedit.exe utility. &lt;br /&gt;&lt;p&gt;2. In the virtual machine's settings, redirect the COM port to a pipe called &lt;a href="file://\\.\pipe\vpc"&gt;\\.\pipe\vpc&lt;/a&gt;&amp;nbsp;. What we're doing here is telling Windows to redirect all debug spew to the COM1 port and then telling VPC to redirect COM1 to a named pipe.&lt;br&gt;&lt;br&gt;&lt;a href="http://www.sriramkrishnan.com/blog/images/AHelloWorldWindowsdriver_E84B/image_4.png" atomicselection="true"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="179" alt="image" src="http://www.sriramkrishnan.com/blog/images/AHelloWorldWindowsdriver_E84B/image_thumb_4.png" width="468" border="0"&gt;&lt;/a&gt; &lt;br /&gt;&lt;p&gt;3. Restart the virtual machine (the boot settings need a restart to kick in). &lt;br /&gt;&lt;p&gt;4. One final step - running the kernel debugger! Run windbg with the following command-line (if you already have symbols setup correctly, ignore the -y parameter). &lt;br /&gt;&lt;p&gt;&lt;font face="Courier New" size="1"&gt;windbg-y SRV*c:\symbols*http://msdl.microsoft.com/download/symbols -k com:pipe,port=\\.\pipe\vpc,resets=0,reconnect&lt;/font&gt; &lt;br /&gt;&lt;p&gt;This should open up windbg and connect it to your running instance of Win2k3 on VPC. &lt;br /&gt;&lt;p&gt;&amp;nbsp; &lt;br /&gt;&lt;p&gt;&lt;strong&gt;Registering and running your driver&lt;/strong&gt; &lt;a href="http://www.sriramkrishnan.com/blog/images/AHelloWorldWindowsdriver_E84B/image_5.png" atomicselection="true"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="244" alt="image" src="http://www.sriramkrishnan.com/blog/images/AHelloWorldWindowsdriver_E84B/image_thumb_5.png" width="190" align="right" border="0"&gt;&lt;/a&gt; &lt;br /&gt;&lt;p&gt;Whew. Just a couple of steps more and we'll be home. The last 2 things for us to do are to register the driver and then to run it. Our driver currently cannot be unloaded (the ability to do so would just require 4 more lines of code though) so you'll have to restart the machine manually to see new changes reflected. &lt;br /&gt;&lt;p&gt;1. First, let's register the driver. James Brown's tutorial covers some of the ways you can register the driver but (like him), I'll recommend downloading the 'Driver Loader' utility from &lt;a href="http://www.osronline.com"&gt;http://www.osronline.com&lt;/a&gt; which unfortunately requires a free registration.&amp;nbsp;Run it on your target Win2k3 VPC &lt;br /&gt;&lt;p&gt;2. Copy your drivers' binaries over to the VPC (I typically do this using the shared folder feature).&amp;nbsp;Point Driver Loader to your binary and register your driver. This needs to be done only once irrespective of how many times you rebuild your binaries.&amp;nbsp;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;If you've followed along so far, congratulations for you're finally&amp;nbsp;home. Hit 'Start Service'&amp;nbsp;in&amp;nbsp;'Driver Loader'. This should result in a call to your DriverEntry method and in your WinDBG running on the host computer, you should see&amp;nbsp;this&lt;br&gt;&lt;br&gt;&lt;a href="http://www.sriramkrishnan.com/blog/images/AHelloWorldWindowsdriver_E84B/image_6.png" atomicselection="true"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="107" alt="image" src="http://www.sriramkrishnan.com/blog/images/AHelloWorldWindowsdriver_E84B/image_thumb_6.png" width="240" border="0"&gt;&lt;/a&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;To quote John McClane, &lt;em&gt;Yippie-Ki-ay &amp;lt;insert non-family-friendly-term&amp;gt;&lt;/em&gt;!&lt;br&gt;&lt;br&gt;From here, it is pretty trivial to start exploring. Here's a screenshot of a breakpoint in my DriverEntry routine (the WRK stuff is because I'm running a custom Windows kernel built from the publicly available&amp;nbsp;Windows Research Kernel code). &lt;br&gt;&lt;br&gt;&lt;a href="http://www.sriramkrishnan.com/blog/images/AHelloWorldWindowsdriver_E84B/image_7.png" atomicselection="true"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="154" alt="image" src="http://www.sriramkrishnan.com/blog/images/AHelloWorldWindowsdriver_E84B/image_thumb_7.png" width="872" border="0"&gt;&lt;/a&gt; &lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;Happy hacking!&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp; &lt;br /&gt;&lt;p&gt;&lt;strong&gt;Notes&lt;/strong&gt; &lt;br /&gt;&lt;p&gt;1. If you're interested in the internals of build.exe, you should check out the code that ships with Rotor (&lt;a href="http://www.google.com/codesearch?hl=en&amp;amp;q=show:-WLa-Fiov60:tKC99iw8sYY&amp;amp;sa=N&amp;amp;ct=rdp&amp;amp;cs_p=http://www.netsw.org/softeng/lang/csharp/sscli_20020619.tgz&amp;amp;cs_f=sscli/tools/build"&gt;online cached copy here&lt;/a&gt;). However, I haven't checked to see whether it is from the same code base as the real build.exe.&lt;/p&gt;&lt;/div&gt;</content><link rel='alternate' type='text/html' href='http://www.sriramkrishnan.com/blog/2007/09/world-windows-driver-from-scratch.html' title='A &amp;#39;Hello World&amp;#39; Windows driver from scratch'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29992405&amp;postID=6578590246298112199' title='6 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.sriramkrishnan.com/blog/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29992405/posts/default/6578590246298112199'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29992405/posts/default/6578590246298112199'/><author><name>Sriram</name><uri>http://www.blogger.com/profile/14514067854950617393</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-29992405.post-4342781495431191688</id><published>2007-09-01T19:49:00.001-07:00</published><updated>2007-09-01T19:49:26.300-07:00</updated><title type='text'>NYTimes on mashups</title><content type='html'>&lt;p&gt;The NYTimes is running a &lt;a href="http://www.nytimes.com/2007/09/02/technology/circuits/02novelties.html?ex=1346385600&amp;amp;en=700f153fdefa04d7&amp;amp;ei=5088&amp;amp;partner=rssnyt&amp;amp;emc=rss"&gt;piece&lt;/a&gt; on mashups&amp;nbsp;written by Anne Eisenberg&amp;nbsp;which has a section on Popfly with quotes from &lt;a href="http://blogs.msdn.com/johnmont"&gt;John&lt;/a&gt;. I was involved with this piece, though quite tangentially.&lt;/p&gt; &lt;p&gt;A few weeks ago, I was going through my check-mail-first-thing-after-waking-up routine with my personal mail account. Instead of clearing out of my junk folder without checking it (as I usually do), I saw a mail there from Anne. My mental reaction in the first few seconds went from &lt;em&gt;"This must be a hoax"&lt;/em&gt; to &lt;em&gt;"Oh cr*p - someone from the NYTimes got my email id from my blog. Did I just blog something which I'm going to get fired over?"&lt;/em&gt; &lt;/p&gt; &lt;p&gt;Thankfully, neither was true :). &lt;/p&gt; &lt;p&gt;Anne - if you're still reading, thanks for the kind words&amp;nbsp;about my writing skills :-)&lt;/p&gt;</content><link rel='alternate' type='text/html' href='http://www.sriramkrishnan.com/blog/2007/09/nytimes-on-mashups.html' title='NYTimes on mashups'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29992405&amp;postID=4342781495431191688' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.sriramkrishnan.com/blog/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29992405/posts/default/4342781495431191688'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29992405/posts/default/4342781495431191688'/><author><name>Sriram</name><uri>http://www.blogger.com/profile/14514067854950617393</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-29992405.post-2860040574577531550</id><published>2007-08-06T23:40:00.001-07:00</published><updated>2007-08-06T23:40:58.472-07:00</updated><title type='text'>The best complement that Popfly has ever received</title><content type='html'>&lt;p&gt;Lots of people have said lots of things lots of things about Popfly.&amp;nbsp;One of my colleagues forwarded an&amp;nbsp;&lt;a href="http://www.computerpoweruser.com/editorial/article.asp?article=articles%2Farchive%2Fc0708%2F44c08%2F44c08.asp"&gt;article&lt;/a&gt;&amp;nbsp;(you need to be a subscriber to view it) by &lt;a href="http://www.google.com/url?sa=t&amp;amp;ct=res&amp;amp;cd=1&amp;amp;url=http%3A%2F%2Fchris.pirillo.com%2F&amp;amp;ei=TxO4RvCpNo_CgQPF39zHBA&amp;amp;usg=AFQjCNGqag1KzPxIIrb71ZK1FlzD9Qb22w&amp;amp;sig2=g3ls87amtOYfK7BUqtQ6OA"&gt;Chris Pirillo&lt;/a&gt; in Computer Power User magazine&amp;nbsp; where he says a bunch of nice things about Popfly (thanks Chris!). However, he wraps it up by saying something about Popfly which definitely has to be a first.&lt;/p&gt; &lt;p&gt;&lt;em&gt;"..Even Paris Hilton could use Popfly.."&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Forget the dog and the duck and all our current branding. I think we should use this as our tagline from now on. :-)&lt;/p&gt;</content><link rel='alternate' type='text/html' href='http://www.sriramkrishnan.com/blog/2007/08/best-complement-that-popfly-has-ever.html' title='The best complement that Popfly has ever received'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29992405&amp;postID=2860040574577531550' title='3 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.sriramkrishnan.com/blog/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29992405/posts/default/2860040574577531550'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29992405/posts/default/2860040574577531550'/><author><name>Sriram</name><uri>http://www.blogger.com/profile/14514067854950617393</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-29992405.post-4489314939336381775</id><published>2007-08-03T16:31:00.001-07:00</published><updated>2007-08-03T16:31:47.350-07:00</updated><title type='text'>Open source and scratching itches in the cloud</title><content type='html'>&lt;p&gt;&lt;em&gt;[Note : I happen to work at Microsoft but do&amp;nbsp;read and understand&amp;nbsp;the disclaimer at the bottom. This is just the geek in me talking. I'll get very annoyed if someone links to this with the heading "Microsoft employee says...".&amp;nbsp;&amp;nbsp;I don't even work in the Live org&amp;nbsp;so don't even start thinking that this represents any future direction/future products from Microsoft. I work in Developer Division so if I ever say that we're going to bring back Algol-60, then you're onto something ;-)]&lt;/em&gt;&lt;/p&gt; &lt;p&gt;I read a couple of posts today which made me think about open source in web 2.0 - the &lt;a href="http://radar.oreilly.com/archives/2007/08/yahoos_bet_on_h.html"&gt;first&lt;/a&gt; is Tim O'Reilly on Yahoo supporting Hadoop and the &lt;a href="http://www.25hoursaday.com/weblog/2007/08/03/Web20IsTheNewVendorLockin.aspx"&gt;other&lt;/a&gt; is Dare on 'Free Data'. Tim has this interesting factoid about Nutch in his post&lt;/p&gt; &lt;p&gt;&lt;em&gt;"...Some years ago, I was on the board of Doug's open source search engine effort, Nutch. Where the project foundered was in not having a large enough data set to really prove out the algorithms. Having more than a couple of hundred million pages in the index was too expensive for a non-profit open source project to manage. One of the important truths of Web 2.0 is that it ain't the personal computer era any more, &lt;/em&gt;&lt;em&gt;Eben Moglen's arguments to the contrary notwithstanding&lt;/em&gt;&lt;em&gt;. A lot of really important software can't even be exercised properly without very large networks of machines, very large data sets, and heavy performance demands..."&lt;/em&gt;&lt;/p&gt; &lt;p&gt;And from Dare&lt;em&gt; &lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;"...This leads to a tendency for the rich to get richer because since they have the most data they provide the most value for end users (e.g. Amazon). Another problem&amp;nbsp;is that social software leads to lock-in. &amp;nbsp;My buddy list on Windows Live Messenger and my list of&amp;nbsp;friends in Facebook&amp;nbsp;are useless to me outside the context of these applications. Although I can get all of my history and data out of these services, I lose the value I get from the fact that all my friends use these services as well...."&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Based on the above (which I agree with), I'm going to posit the following.&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Most of&amp;nbsp;the value in Web 2.0 comes from data (generated by lots of users). E.g - del.ico.us, Digg, Facebook  &lt;li&gt;It is beyond the financial&amp;nbsp;means of any one person to run large scale server software E.g Gmail, Google Search, Live, Y! Search  &lt;li&gt;Companies will fight hard to keep their users (and their data) in their system as that's what will keep them alive. You need the ad money from your users to pay your bills.&amp;nbsp;At the least, moving to a competing service will not be painless. (pretty much any service which requires a log in)&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;&lt;strong&gt;Hacking the code&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Now, let's take these three and juxtapose them with open source and in particular, where open source came from. For me, the powerful idea about open source has always been geeks scratching their itches. Find a bug in Emacs? Checkout the code from whichever CVS server it is on, fix the bug and then&amp;nbsp;do the configure-make-make install dance. You could submit your change back as well (though YMMV on whether it gets accepted or not).&lt;/p&gt; &lt;p&gt;The same is not possible with any large cloud-based server. If you find something you dislike in Gmail or Windows Live Hotmail&amp;nbsp;which can't be fixed in the browser through some GreaseMonkey magic, you're stuck. The same goes for Facebook, Digg, etc &lt;sup&gt;1&lt;/sup&gt;. If you are have an 'itch' to scratch (and you are one of those people who wouldn't use Microsoft software if there was only PC left in the world and it ran Windows &amp;lt;grin/&amp;gt;), you probably have to contribute at one of these levels&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;1. Change things in Linux/*BSD which powers some of these sites&lt;/p&gt; &lt;p&gt;2. Change things in Apache/Lighttpd/Mongrel/memcached/MySQL&lt;/p&gt; &lt;p&gt;3. Change things in PHP/Ruby/Python&lt;/p&gt; &lt;p&gt;4. Change things using the API provided by the site.&amp;nbsp;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;There's a huge gap between #3 and #4 there - that's where the Facebook backend code lives or Google's backend code (or Windows Live code if you swap in the stuff that the Live guys use). This is code that you don't get to see or modify and you pretty much have no influence over.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Code might be&amp;nbsp;data but&amp;nbsp;I'd rather just have data&amp;nbsp;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;The above problem is solvable if Google and Facebook and Microsoft want to - they could go the Slashdot/Wikipedia way and actually put out backend code up on CodePlex or SF. But you'll probably soon find that the code doesn't have as much value as having the data to back it up. &lt;/p&gt; &lt;p&gt;Example - look at MySpace. It would be possible for a bunch of coders to take MySpace's backend and create a modified version of MySpace in a few days. However, it is useless without the data of the millions of users who make up MySpace. Obviously, this is not data that should fall into Joe RandomGeek's hands without the consent of the users themselves. You can see how this soon turns into a very hard problem to solve.&lt;/p&gt; &lt;p&gt;The only site I know which gives away both code and data is Wikipedia. It is theoretically possible to take MediaWiki and the WIkipedia dumps and have the equivalent of the CVS checkout I first talked about. You are free to hack on MediaWiki and since you have the data, you are free to do whatever you want with it. I'm curious as to why there has not been a lot of interesting work done on top of Wikipedia's data - the only notable work I know of is &lt;a href="http://www.aaronsw.com/weblog/whowriteswikipedia"&gt;Aaron Swartz's&lt;/a&gt; when he ran for office inside Wikipedia.&lt;/p&gt; &lt;p&gt;Even if you have both code and data, you run into the third and arguably the toughest problem&lt;/p&gt; &lt;p&gt;&lt;strong&gt;It's all about the hardware, stupid&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Your typical long-haired geek&amp;nbsp;probably can't get his hands&amp;nbsp;on the following from the comfort of his bedroom &lt;sup&gt;2&lt;/sup&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Geo-distributed datacenters which have scary electrical,networking, legal,&amp;nbsp;social and financial design issues to worry about.&lt;/li&gt; &lt;li&gt;Large scale blob storage (S3, Google File System)&lt;/li&gt; &lt;li&gt;Large scale structured storage ( Google's Bigtable)&lt;/li&gt; &lt;li&gt;Tools to run code across such infrastructure (MapReduce, Dryad). &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Constructing one by yourself is out of the question (unless you are an expert on topics like air conditioning and setting up multiple diesel generators which are better than &lt;a href="http://radar.oreilly.com/archives/2007/07/mistakes_will_b.html"&gt;these&lt;/a&gt;). The other option is to shell out hard cash to get some racks on someone else's datacenter. And *that* costs a lot&amp;nbsp;more than what your average college-going hacker (don't you love stereotypes?) can afford. Or even what I can afford :-)&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Possible answers&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;I'm not really saying 'gloom and doom' here. I think we'll see consolidation and commodification of several&amp;nbsp;of the above pieces. &lt;/p&gt; &lt;p&gt;&lt;em&gt;"Hmm..so you want a few thousand machines. x64 boxes with oodles of RAM, you say? In Asia as well as Europe? Ok - one order coming right up. Would you like some chips with that, Sir" ?&lt;/em&gt;&lt;/p&gt; &lt;p&gt;As a geek, it is mouth watering to think of the possibilities when that eventually happens. In reality, instead of specifying machines, you'll probably just call some service and the magic (how many machines, which data center to serve the request from ) will happen transparently on the backend.&lt;/p&gt; &lt;p&gt;This&amp;nbsp;needs to&amp;nbsp;happen at multiple levels. At the datacenter/ geo-distribution level&amp;nbsp;Amazon's S3 and EC2 provide great features at a great price point&amp;nbsp;. However, you still need to run your servers...today.&amp;nbsp;A few years&amp;nbsp;down the road, you could theoretically lease a bunch of machines from Google, Yahoo, Microsoft&amp;nbsp;or Amazon&amp;nbsp;and you don't need to worry about machines going down, coming up, failovers across continents - it'll 'just work'. &lt;/p&gt; &lt;p&gt;In terms of code, Doug Cutting's projects and projects like&amp;nbsp;memcached means that you already have a lot of backend code to play with. From the Microsoft side of things, you have&amp;nbsp;everything from Windows Server to IIS to SQL Server&amp;nbsp;which definitely do scale very well&amp;nbsp;- Microsoft runs them *everywhere*.&lt;/p&gt; &lt;p&gt;The really tricky problem is data. No company wants to part with their data as it really is the 'crown jewels'. If an alternative social network sprung up which had all of Facebook's data and users, Facebook could go out of business very soon.&amp;nbsp;This is where the 'Free Data' movement comes in (see Dare's post for more). I still don't see a good model of getting to everyone's data without trampling all over privacy and security. This may be a problem that never gets solved.&lt;/p&gt; &lt;p&gt;Whatever happens, there'll soon be a 'cloud software' equivalent to './configure, make, make install' and it is going to be fun to watch and see what it turns out to be. Until then, if you've got an itch, I'm afraid you can't scratch.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Notes: &lt;/strong&gt;&lt;/p&gt; &lt;p&gt;1. LiveJournal might be an exception here&lt;/p&gt; &lt;p&gt;2. I'm not sure how far along Doug Cutting's open source equivalents have come along for these - so that might be an answer&lt;/p&gt;</content><link rel='alternate' type='text/html' href='http://www.sriramkrishnan.com/blog/2007/08/open-source-and-scratching-itches-in.html' title='Open source and scratching itches in the cloud'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29992405&amp;postID=4489314939336381775' title='5 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.sriramkrishnan.com/blog/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29992405/posts/default/4489314939336381775'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29992405/posts/default/4489314939336381775'/><author><name>Sriram</name><uri>http://www.blogger.com/profile/14514067854950617393</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-29992405.post-80756041033274756</id><published>2007-07-26T19:12:00.000-07:00</published><updated>2007-07-26T19:27:02.058-07:00</updated><title type='text'>Popfly videos</title><content type='html'>There are a bunch of videos out there with demos of Popfly.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://on10.net/Blogs/tina/microsoft-popfly/"&gt;Popfly on On10&lt;/a&gt; - this was put up there just a few hours ago. This was filmed before our new features last week (so you don't see the new home page, etc).&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://on10.net/Blogs/nhodge/presenting-popfly-at-australia-remix-2007/"&gt;Popfly at ReMix Australia&lt;/a&gt; - Nick Hodge showing off Popfly in the land down under.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://channel9.msdn.com/showpost.aspx?postid=308460"&gt;Channel 9 Popfly interview&lt;/a&gt; - this was done a few days before we went public in May. You see several members of the team in this one&lt;br /&gt;&lt;a href="http://www.popfly.ms/Overview/"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.popfly.ms/Overview/"&gt;The Overview video&lt;/a&gt; - this is a screencast on our site which walks you through the various features of Popfly&lt;/li&gt;&lt;/ul&gt;I've been doing a bunch of demos over the last few days and it is *always* scary when you do a public demo with Flickr or Twitter or any web site with user generated content. You get into these awkward situations in public where you wind up saying &lt;span style="font-style: italic;"&gt;"So, I'm going to pull in photos from Flickr of beaches....and...ummm... here is a photo of a naked man on a beach."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We had trouble finding a 'safe' term search for by default. &lt;span style="font-style: italic;"&gt;'Cats'&lt;/span&gt; is probably the safest we've found so far :-)</content><link rel='alternate' type='text/html' href='http://www.sriramkrishnan.com/blog/2007/07/popfly-videos.html' title='Popfly videos'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29992405&amp;postID=80756041033274756' title='1 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.sriramkrishnan.com/blog/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29992405/posts/default/80756041033274756'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29992405/posts/default/80756041033274756'/><author><name>Sriram</name><uri>http://www.blogger.com/profile/14514067854950617393</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-29992405.post-901997752317320549</id><published>2007-07-19T20:01:00.001-07:00</published><updated>2007-07-20T00:16:59.326-07:00</updated><title type='text'>Popfly Updates</title><content type='html'>&lt;p&gt; &lt;/p&gt;&lt;center&gt;&lt;a href="http://www.sriramkrishnan.com/blog/images/PopflyUpdates_10E54/image.png" atomicselection="true"&gt;&lt;img style="border-width: 0px;" alt="image" src="http://www.sriramkrishnan.com/blog/images/PopflyUpdates_10E54/image_thumb.png" border="0" height="240" width="233" /&gt;&lt;/a&gt; &lt;/center&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt;This afternoon, I typed in 'www.popfly.com' in my browser and closed my eyes and prayed. When I opened them and found that the page looked the way it was supposed to do, I shouted out loud and danced through the corridors (which I don't do at all due to my very limited dancing skills :-) ).&lt;br /&gt;&lt;br /&gt;The occasion? We had just pushed out new bits to production and my code was live and out there. And it was running the way it supposed to. There's no high which comes close to this. :-) It was quite an exciting afternoon - we had a ton of emails fly back and forth as we tried out the new production site, touched and probed the various parts of Popfly to make sure everything works.&lt;br /&gt;&lt;br /&gt;There are a ton of new and exciting features - you can find the entire list &lt;a href="http://popflyteam.spaces.live.com/Blog/cns%2151018025071FD37F%21222.entry"&gt;at our team blog&lt;/a&gt;. I'll try to expand on some of my favorites.&lt;/p&gt;&lt;p&gt; Aaron Brethorst did a great job with simplifying the navigation. We had different navigation schemes in different parts of the site - we now have one unified navigation bar.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.sriramkrishnan.com/blog/images/PopflyUpdates_10E54/image_3.png" atomicselection="true"&gt;&lt;img style="border-width: 0px;" alt="image" src="http://www.sriramkrishnan.com/blog/images/PopflyUpdates_10E54/image_thumb_3.png" border="0" height="118" width="264" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;We also put out some major, much-needed features related to projects. You can now add  and see comments, tags and publish links to Facebook. Here's a link which our big boss just published to his Facebook profile. &lt;/p&gt; &lt;p&gt;&lt;a href="http://www.sriramkrishnan.com/blog/images/PopflyUpdates_10E54/image_4.png" atomicselection="true"&gt;&lt;img style="border-width: 0px;" alt="image" src="http://www.sriramkrishnan.com/blog/images/PopflyUpdates_10E54/image_thumb_4.png" border="0" height="108" width="351" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt;Unlike the last deployment, I actually wrote some code this time &amp;lt;grin/&amp;gt;. I spent most of my time on the new home page. Until now, we just had a static page when you entered the site which had a couple of links. If you wanted to go back to the half-finished mashup you were working the previous night, you had to poke around through the list of projects.  We wanted to change all that - so we put in a super-easy 'recent projects' list so that you are just one click away from your masterpiece.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.sriramkrishnan.com/blog/images/PopflyUpdates_10E54/image_5.png" atomicselection="true"&gt;&lt;img style="border-width: 0px;" alt="image" src="http://www.sriramkrishnan.com/blog/images/PopflyUpdates_10E54/image_thumb_5.png" border="0" height="61" width="645" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;The other big thing which you will see on your home page on the left side is a combination of news items from the team blog as well as info on what your friends are upto (are they sharing new projects? Are they making new friends? ). This was a whole lot of fun to code up as designing for such a large number of users is quite challenging. We frequently had design discussions where the conversation would go like this&lt;br /&gt;&lt;br /&gt;&lt;em&gt;" I think we should implement it using this technique"&lt;br /&gt;"That would not hold up well once we have X users on the site...at the same time"&lt;br /&gt;"Dammit!" (and go back to the drawing board)&lt;br /&gt;&lt;br /&gt;&lt;/em&gt;Here's a screen shot of how it looks (with fake entries of course)&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.sriramkrishnan.com/blog/images/PopflyUpdates_10E54/image_6.png" atomicselection="true"&gt;&lt;img style="border-width: 0px;" alt="image" src="http://www.sriramkrishnan.com/blog/images/PopflyUpdates_10E54/image_thumb_6.png" border="0" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;And if you're wondering what's the dog is doing at the top, well, we've played around with our logo a bit this time and tried to 'mash' things up. The evil purple duck is still present all through the site but you'll see variations of the Popfly logo at some places. Like 'Attention Dog' above. Yes, that's really what we call him. Yes, we're a bunch of nerds :-)&lt;/p&gt; &lt;p&gt;Have fun with the site, y'all. If you experience issues (happens sometimes when we deploy shiny new bits), leave a message on the forums or post a comment or send me an email.&lt;br /&gt;&lt;/p&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic;"&gt;Update - s/Alertness/Attention Dog. Thanks to the nitpicker who found it :-)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;</content><link rel='alternate' type='text/html' href='http://www.sriramkrishnan.com/blog/2007/07/popfly-updates.html' title='Popfly Updates'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29992405&amp;postID=901997752317320549' title='2 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.sriramkrishnan.com/blog/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29992405/posts/default/901997752317320549'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29992405/posts/default/901997752317320549'/><author><name>Sriram</name><uri>http://www.blogger.com/profile/14514067854950617393</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-29992405.post-9155526585959109625</id><published>2007-06-23T00:54:00.001-07:00</published><updated>2007-06-23T23:37:32.563-07:00</updated><title type='text'>Popfly Files Part 1 - What is Popfly?</title><content type='html'>&lt;p&gt;Over the last one month, I've got a lot of queries on what Popfly is, what it can do and what it is going to do in the future. Instead of repeating myself over and over again, I thought I'll save myself some typing by compiling a few blog posts. &lt;/p&gt;&lt;p&gt;Unlike most of my friends who started off with C/C++ or Java or GW-Basic, I learnt programming with Visual Basic. I actually had tried to learn C and C++ but I just didn't find that interesting back then. Most tutorials focused on the syntax of the language, how to write simple math applications or how to draw circles or simple graphics. None of that stuff excited me - so I had made up my mind that programming and computers were just not my thing.&lt;/p&gt;&lt;p&gt;All that changed one sunny afternoon in mid-2000. I had just installed Windows 2000 on my first home computer and I fired up VB6 for the first time. I gingerly drag-dropped a button onto the main form and then hit 'Run'. What followed was pure bliss. I actually saw an application &lt;strong&gt;*I*&lt;/strong&gt; had created running. Not Microsoft. Not Adobe or some professional. &lt;strong&gt;*Me* .&lt;/strong&gt;It looked just like any other Windows application and the button was clickable ! This was a huge moment for me and probably the pivotal moment which changed me from just a computer user to someone who could create software. &lt;/p&gt;&lt;p&gt;Popfly tries to recreate this 'aha' moment for a new generation of computer users. &lt;/p&gt;&lt;h3&gt;&lt;strong&gt;The Past&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;Two great technologies have done in the past what Popfly is trying to do now for a new generation.&lt;/p&gt;&lt;p&gt;The first is Visual Basic. VB let users create GUI applications without having to learn how Win32 worked. A lot of the features made popular by VB have stuck around. You see VB's influence in current day Visual Studio and even frameworks like Winforms which were built years after VB. I would credit VB with features like Intellisense, controls and being able to generate code for them by drag-drop, a WYSIWYG GUI tool with code generation and everything surrounding data access (ADO, the data designers, data binding, etc). &lt;/p&gt;&lt;p&gt;The second is the combination of HTTP+HTML+Javascript+the webbrowser. There are a couple of features from this world which stand out for me. The first is 'View Source'. Like I said in a &lt;a href="http://www.sriramkrishnan.com/blog/2007/06/first-week-at-popfly.html"&gt;previous post&lt;/a&gt;, this let everyone learn web development by just picking apart a webpage they liked. The second is the forgiving nature of the web browser world. If the smallest HTML mistake had just shown an empty page and a parsing error, a lot of web developers would have never become at what they do today.&lt;sup&gt;1&lt;/sup&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;h3&gt;&lt;strong&gt;What is Popfly?&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;Let me copy-paste from the official &lt;a href="http://www.popfly.ms/Overview/Default.aspx"&gt;description&lt;/a&gt; page (which you should definitely read)&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;Popfly is the fun, easy way to build and share mashups, gadgets, Web pages, and applications. Popfly consists of two parts:&lt;/em&gt; &lt;p&gt;&lt;em&gt;1. Popfly Creator is a set of online visual tools for building Web pages and mashups.&lt;/em&gt; &lt;p&gt;&lt;em&gt;2. Popfly Space is an online community of creators where you can host, share, rate, comment and even remix creations from other Popfly users.&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;sup&gt;&lt;/sup&gt;You can get a good overview of all the features &lt;a href="http://www.popfly.ms/Overview/Default.aspx"&gt;here&lt;/a&gt; but let me try and point out the highlights.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Blocks&lt;/strong&gt; &lt;a href="http://www.sriramkrishnan.com/blog/images/PopflyFilesThePastthePresentandtheFuture_11E32/image.png" atomicselection="true"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="143" alt="image" src="http://www.sriramkrishnan.com/blog/images/PopflyFilesThePastthePresentandtheFuture_11E32/image_thumb.png" width="181" align="right" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Superhuman_Samurai_Syber-Squad" atomicselection="true"&gt;&lt;img style="MARGIN: 5px 10px 0px 0px" height="178" src="http://upload.wikimedia.org/wikipedia/en/thumb/c/cf/Goservo.jpg/180px-Goservo.jpg" width="99" align="left" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;You can think of blocks in two ways. One way to think of them is as a component which provides some functionality. Blocks usually provide one or more of three types of functionality. Blocks that let you display stuff (like in a carousel, sphere or one of the mapping blocks), blocks that wrap around a web site and let you access data from that site (Flickr, Digg, Twitter, etc) and blocks which do some sort of transformation on their input (Sort, Combine, etc). Of course, there are a lot of blocks which don't fall into this neat classification (e.g. Calculator, the Block Inspector block) but they're (currently) few in number.&lt;br /&gt;&lt;br /&gt;Another way to think of them is as arbitrary chunks of Javascript code. Since it is Javascript, blocks are free to (and often) use HTML and/or XAML for Silverlight. Every block on the site maps to a Javascript class&lt;sup&gt;2&lt;/sup&gt;. Blocks are represented throughout the site with a spinning red 'block' shown on the right. You can use any of the default blocks provided (written by the Popfly team) or over a hundred blocks (as of writing this) created by Popfly users. You can create your own - from scratch or by 'rip'- ing some other block's which lets you see how another block works and lets you build upon/modify it.&lt;br /&gt;&lt;br /&gt;Blocks by themselves aren't that interesting - they're like the individual characters in &lt;a href="http://en.wikipedia.org/wiki/Superhuman_Samurai_Syber-Squad"&gt;Super Human Samurai&lt;/a&gt;&lt;sup&gt;3&lt;/sup&gt;. It's when they join together that true magic happens!&lt;br /&gt;&lt;li&gt;&lt;strong&gt;Mashups&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Like I said in the previous section, the blocks by themselves aren't that powerful - like the individual characters in an old TV show. A better analogy is components (COM/ActiveX/Corba/beans/pick-your-poison). When you put these blocks together, you create what we call 'mashups'. An example of a mashup would be joining the Soapbox block (which generates video output) and the video player block (which, well, lets you play videos) and voila! You instantly have your own mashup which plays Soapbox videos. Another popular type are ones involving maps. One slightly advanced mashup you can create using the Virtual Earth, Timer and GeoNames service lets you replicate &lt;a href="http://www.twittervision.com/"&gt;Twittervision&lt;/a&gt; in seconds.&lt;br /&gt;&lt;a href="http://www.sriramkrishnan.com/blog/images/PopflyFilesThePastthePresentandtheFuture_11E32/image_3.png" atomicselection="true"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="151" alt="image" src="http://www.sriramkrishnan.com/blog/images/PopflyFilesThePastthePresentandtheFuture_11E32/image_thumb_3.png" width="240" align="right" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The primary tool used to create these mashups is the mashup design surface (shown on the right). Most people would agree that this is one of the most visually intense development environments created &lt;sup&gt;4&lt;/sup&gt; . You can search for blocks and add and connect them. When you connect blocks, Popfly tries to match the right output to the right input. We try to do this using the 'type' of the input/output (more on that in a later post).You also have the ability to customize all the Javascript and HTML generated by the designer using the custom HTML view.&lt;br /&gt;&lt;br /&gt;Currently, adding custom Javascript to mashups (as opposed to blocks) is slightly difficult - we're working on making this easier in future releases.&lt;br /&gt;&lt;li&gt;&lt;strong&gt;Web Page Creator&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;Popfly includes a WYSIWYG web page creator which was built off the Office Live Web Designer. This is very popular - users can easily create pages, change themes, styles and colors without writing any HTML. You also have the ability to embed Popfly mashups and share them externally just like mashup projects. When I initially came across this feature, I was surprised by the huge number of themes available - over 150!&lt;br /&gt;&lt;li&gt;&lt;strong&gt;Popfly Space&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;'Popfly Space' is the umbrella term we use to refer to all the social network aspects of the site. You can add friends, look at anyone's projects, rip anyone's projects, etc. There are a lot of interesting features that this lets us do. Every person gets a 'rating' which is an aggregation of how their projects have been rated - so you can see who the best creators on Popfly are, what the top projects are and so on. I personally use it as a sort of 'geek social network' :-)&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;strong&gt;Embedding and publishing&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Popfly lets you embed Popfly mashups/webpage pretty much everywhere. Here are some of the places you can embed your mashup in&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; MARGIN: 0px 30px 0px 50px; BORDER-RIGHT-WIDTH: 0px" height="70" alt="image" src="http://www.sriramkrishnan.com/blog/images/PopflyFilesThePastthePresentandtheFuture_11E32/image_4.png" width="240" align="right" border="0" /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;ul&gt;&lt;li&gt;Any TypePad/MetaWebLog API blog &lt;li&gt;Live Spaces &lt;li&gt;As a gadget which you can embed in your Vista sidebar &lt;li&gt;As an iframe which you can embed..well..anywhere.&lt;br /&gt;&lt;br /&gt;I've already seen bloggers embed Popfly mashups in their site. One frequently asked question is - do my blog readers also have to be Popfly users to view these embedded mashups? The answer is no - the embedded mashups are opened up for anonymous viewing. Since you're using an iframe to embed the mashup, you're also ensuring that there are no potential security issues. The mashup runs in its own iframe sandbox and hence can't do bad things to your site.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;strong&gt;Popfly Explorer&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;This lets you upload and share projects built with Visual Studio Express. Note - you can share *any* type of project- Winforms/ConsoleApp/whatever. When you share it, your friends can access it and pull it down to their machines. The only limitation is that you have a 25 mb space limit on our servers currently. This is a great way to share projects without having to send zip files back and forth - a process I'm sure a lot of you are familiar with. &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;h3&gt;&lt;strong&gt;Resources&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;I plan on writing a series of blog posts to dig into various parts of Popfly. There's some great content available on the web about Popfly - I've linked to a few below.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.popfly.ms/Overview/Default.aspx"&gt;Overview page and video&lt;/a&gt; &lt;li&gt;&lt;a href="http://www.popfly.ms/Videos/"&gt;Tutorial videos&lt;/a&gt; (you need to be a Popfly member to view this). The 'Create a Mashup in 30 seconds' blew me away the first time I saw it. &lt;li&gt;&lt;a href="http://www.popfly.ms/Overview/faq.aspx"&gt;The official Popfly FAQ&lt;/a&gt; &lt;li&gt;&lt;a href="http://popflyteam.spaces.live.com/"&gt;Popfly team blog&lt;/a&gt;. You can find links to the blogs of all the team members &lt;a href="http://www.popfly.ms/Overview/About.aspx"&gt;here&lt;/a&gt;. &lt;sup&gt;5&lt;/sup&gt; &lt;li&gt;&lt;a href="http://blogs.msdn.com/sharepoint/archive/2007/05/25/sharepoint-and-popfly-integration-yes-really.aspx"&gt;Mike Ganotti's post on integrating Sharepoint and Popfly&lt;/a&gt; &lt;li&gt;&lt;a href="http://www.cjcraft.com/Blog/2007/05/26/MicrosoftPopflyLinksTheMicrosoftPopflyLaunchPadIsReadyForLaunch.aspx"&gt;Chris Craft's collection of Popfly links&lt;/a&gt; &lt;li&gt;&lt;a href="http://forums.microsoft.com/MSDN/default.aspx?ForumGroupID=434&amp;SiteID=1"&gt;Popfly Forums&lt;/a&gt; - for any questions, suggestions and bug reports. We monitor these forums very closely and you'll frequently see Popfly team members in the forum threads.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Notes&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;1. I've spoken about this a long time ago in &lt;a href="http://www.sriramkrishnan.com/blog/2004/11/tyranny-of-geeks.html"&gt;'Tyranny of the geeks'&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;2. I know that Javascript doesn't have 'classes' per-se but now is not the time to quibble about prototype-based languages. &lt;/p&gt;&lt;p&gt;3. Does anyone else remember this show? I loved this as a kid!&lt;/p&gt;&lt;p&gt;4. &lt;a href="http://blogs.msdn.com/Adam_Nathan/"&gt;Adam Nathan&lt;/a&gt; is the man!&lt;/p&gt;&lt;p&gt;5. I just noticed that my blog isn't up there. Need to go around and beat up some people into adding it (or sneak in the change myself ;-) )&lt;/p&gt;</content><link rel='alternate' type='text/html' href='http://www.sriramkrishnan.com/blog/2007/06/popfly-files-part-1-what-is-popfly.html' title='Popfly Files Part 1 - What is Popfly?'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29992405&amp;postID=9155526585959109625' title='1 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.sriramkrishnan.com/blog/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29992405/posts/default/9155526585959109625'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29992405/posts/default/9155526585959109625'/><author><name>Sriram</name><uri>http://www.blogger.com/profile/14514067854950617393</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-29992405.post-3356300501957660956</id><published>2007-06-14T23:08:00.001-07:00</published><updated>2007-06-14T23:08:29.343-07:00</updated><title type='text'>Firefox and IE deal with no-cache differently</title><content type='html'>&lt;p&gt;I just spent a few hours debugging something that I finally tracked down to IE and Firefox dealing with HTTP caching differently. To make a very *long* story short (and believe me, this was a story of hours in Firebug and Fiddler and VS), IE does &lt;strong&gt;*not*&lt;/strong&gt; cache HTTP pages if you send down the no-cache directive. Firefox does not cache &lt;strong&gt;HTTPS&lt;/strong&gt; pages but &lt;strong&gt;*caches*&lt;/strong&gt; HTTP responses even if you send down a no-cache. The fix is simple - send down a no-store directive instead. So instead of &lt;/p&gt;&lt;pre&gt;Cache-Control	no-cache&lt;br /&gt;&lt;/pre&gt;&lt;br&gt;you send down &lt;pre&gt;Cache-Control   no-store&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;I eventually found a &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=139541"&gt;Bugzilla bug&lt;/a&gt; which deals with this exact scenario. It seems to be a contentious issue with different opinions on what the right behaviour should be. I'm just happy that I get to fix it with just a one-line code change :-)&lt;/p&gt;&lt;pre class="csharpcode"&gt;Response.Cache.SetNoStore();&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;I'm putting it out there so that some poor soul in the future can save some time. :-)&lt;br /&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;br /&gt;&lt;/style&gt;&lt;/p&gt;</content><link rel='alternate' type='text/html' href='http://www.sriramkrishnan.com/blog/2007/06/firefox-and-ie-deal-with-no-cache.html' title='Firefox and IE deal with no-cache differently'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29992405&amp;postID=3356300501957660956' title='3 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.sriramkrishnan.com/blog/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29992405/posts/default/3356300501957660956'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29992405/posts/default/3356300501957660956'/><author><name>Sriram</name><uri>http://www.blogger.com/profile/14514067854950617393</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-29992405.post-2354395695747474679</id><published>2007-06-14T15:47:00.000-07:00</published><updated>2007-06-14T17:28:41.925-07:00</updated><title type='text'>Return of the duck - new Popfly bits</title><content type='html'>&lt;center&gt;&lt;img src="http://www.sriramkrishnan.com/blog/images/e27e1a8b85de_F75C/popfly.jpg"/&gt;&lt;/center&gt;We just pushed out a major update to our site. You can get the entire list &lt;a href="http://popflyteam.spaces.live.com/blog/cns!51018025071FD37F!219.entry"&gt;here&lt;/a&gt; but the biggest changes for me are the tremendous perf improvements and the fixes for embedding your mashups.&lt;br /&gt;&lt;br /&gt;My actual contribution to this release is quite minimal but the entire team has put in some real hard work to get this out the door. &lt;br /&gt;&lt;br /&gt;For those of you already inside Popfly, play with the new release. Everything should just work and if it doesn't, it is a bug &amp;lt;grin/&amp;gt;. Let us know if you find an issue (mail me or puff@microsoft.com or post on the forums).&lt;br /&gt;&lt;br /&gt;For those of you not inside Popfly, sign up for an invite. We are sending out thousands and thousands and you should get yours real quick. Of if you have a friend inside Popfly and get them to send you one.&lt;br /&gt;&lt;br /&gt;Have fun playing with the new stuff. Don't be gentle. :-)&lt;br /&gt;&lt;br /&gt;Random comment from our team meeting yesterday - &lt;em&gt;"Let's not get stuck with the evil duck"&lt;/em&gt;</content><link rel='alternate' type='text/html' href='http://www.sriramkrishnan.com/blog/2007/06/return-of-duck-new-popfly-bits.html' title='Return of the duck - new Popfly bits'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29992405&amp;postID=2354395695747474679' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.sriramkrishnan.com/blog/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29992405/posts/default/2354395695747474679'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29992405/posts/default/2354395695747474679'/><author><name>Sriram</name><uri>http://www.blogger.com/profile/14514067854950617393</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-29992405.post-8093732359567301226</id><published>2007-06-05T22:26:00.000-07:00</published><updated>2007-06-05T22:48:53.579-07:00</updated><title type='text'>Making music</title><content type='html'>&lt;center&gt;&lt;a href="http://www.flickr.com/photos/p_d_gibson/532827341/" style="text-decoration:none;"&gt;&lt;img src="http://farm2.static.flickr.com/1418/532827341_fc764e6077_d.jpg"/ border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;/center&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;In the middle of a thread on whether Zooomr stole code from Flickr or not, Stewart Butterfield from Flickr has one of the best &lt;a href="http://www.flickr.com/groups/central/discuss/72157600288796893/72157600315081071/"&gt;comments&lt;/a&gt; I've seen on our industry in a long time. &lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;...&lt;em&gt; My favorite analogy to software development and product design is music: it's possible to be entirely original in a context where there pretty much every chord progression, every rhythm, every melody and every harmony has been done before, even if it is combining influences and whole elements from those who influence you....&lt;/em&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;That's truly what our industry is about - making music. Easy to forget in the blur of Google vs Microsoft vs Yahoo or the latest Techcrunch startup.&lt;br /&gt;&lt;br /&gt;P.S On a tangential (and jarring) note, the way Zooomr operates perplexes me. You have a CEO who says he isn't familiar with coding ethics and legality and a sole developer who hand waves away suspiciously similar-looking code as just naming conventions.  What gives?&lt;br /&gt;&lt;br /&gt;P.P.S As always, do read the disclaimer at the bottom of the page (this is my own opinion, yada, yada)</content><link rel='alternate' type='text/html' href='http://www.sriramkrishnan.com/blog/2007/06/making-music.html' title='Making music'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29992405&amp;postID=8093732359567301226' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.sriramkrishnan.com/blog/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29992405/posts/default/8093732359567301226'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29992405/posts/default/8093732359567301226'/><author><name>Sriram</name><uri>http://www.blogger.com/profile/14514067854950617393</uri><email>noreply@blogger.com</email></author></entry></feed>