<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Me.Tech() &#187; Architecture &#8211; Design</title>
	<atom:link href="http://riteshnayak.com/blog/category/architecture-design/feed/" rel="self" type="application/rss+xml" />
	<link>http://riteshnayak.com/blog</link>
	<description>my technology blog</description>
	<lastBuildDate>Wed, 08 Feb 2012 08:01:18 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Panacea &#8211; Augmented Reality Contacts Management and Location Service</title>
		<link>http://riteshnayak.com/blog/2011/07/10/panacea-augmented-reality-contacts-management-and-location-service/</link>
		<comments>http://riteshnayak.com/blog/2011/07/10/panacea-augmented-reality-contacts-management-and-location-service/#comments</comments>
		<pubDate>Sun, 10 Jul 2011 07:13:39 +0000</pubDate>
		<dc:creator>Ritesh</dc:creator>
				<category><![CDATA[Architecture - Design]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Unsolved problems]]></category>
		<category><![CDATA[Usability]]></category>
		<category><![CDATA[socionets]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[augmented_reality]]></category>
		<category><![CDATA[contacts]]></category>
		<category><![CDATA[couchDB]]></category>
		<category><![CDATA[face.com]]></category>
		<category><![CDATA[gps]]></category>
		<category><![CDATA[identity]]></category>
		<category><![CDATA[location]]></category>
		<category><![CDATA[ThoughtWorks]]></category>
		<category><![CDATA[vcard]]></category>

		<guid isPermaLink="false">http://riteshnayak.com/blog/?p=514</guid>
		<description><![CDATA[Panacea was the first android application that I helped envision and build. The obnoxious sounding name stems from the fact that we were trying to solve a lot of problems using the application. The team comprised of Navneet, Manohar and Nikhil and I. Here is what the application does.

&#8220;Panace is an Augmented Reality application that [...]]]></description>
			<content:encoded><![CDATA[<p>Panacea was the first android application that I helped envision and build. The obnoxious sounding name stems from the fact that we were trying to solve a lot of problems using the application. The team comprised of <a title="Navneet Kumar" href="http://www.facebook.com/neet.iitk" target="_blank">Navneet</a>, <a title="Manohar Akula" href="http://www.facebook.com/profile.php?id=711406764" target="_blank">Manohar</a> and <a title="Nikhil Nulkar" href="http://twitter.com/#!/nikhilnulkar" target="_blank">Nikhil </a>and I. Here is what the application does.</p>
<blockquote><p>
&#8220;Panace is an Augmented Reality application that uses real time face/image recognition technology, and provides for Contacts Management and HyperLocal communities inside an Enterprise.&#8221;
</p></blockquote>
<p>You can find the presentation about Panacea below, or find it on Slideshare <a target="_blank" href="http://www.slideshare.net/itsmeritesh/panacea-augmented-reality">here</a>.</p>
<p><center></p>
<div style="width:425px" id="__ss_7233224"> <strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/itsmeritesh/panacea-augmented-reality" title="Panacea - Augmented Reality " target="_blank">Panacea &#8211; Augmented Reality </a></strong> <iframe src="http://www.slideshare.net/slideshow/embed_code/7233224" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
<div style="padding:5px 0 12px"> View more <a href="http://www.slideshare.net/" target="_blank">presentations</a> from <a href="http://www.slideshare.net/itsmeritesh" target="_blank">itsmeritesh</a> </div>
</p></div>
<p></center></p>
<p>The core idea behind the product is that, inside a closed community, it should be really easy to exchange contact and schedule information. Just like how inside an enterprise there is a Global Address Book and also shared calendaring. Panacea extends that by associating a facial identity with each person in the closed community. I mention closed community a number of times, for even I cannot fathom the privacy implications such an application will have in the public domain. We used <a title="Face.com" href="http://face.com" target="_blank">Face.com</a>&#8217;s face recognition technology to aid in Face Recognition and used <a href="http://opencv.willowgarage.com/wiki/FaceDetection" target="_blank">OpenCV&#8217;s face detection</a> algorithm by accessing their compiled libraries via JNI calls on the android platform.</p>
<p><strong>Scenario 1</strong>: You meet a colleague in your organization or at your local community meet. You need exchange contact information. Now, instead of exchanging visiting cards, you could just switch on our app, point the camera at the person, wait till the algorithm recognizes the person, and then add the person&#8217;s contact information via a single click. Better explained by a video demo of the solution.</p>
<p><center><br />
<iframe width="425" height="355" src="http://www.youtube.com/embed/njxyXry4LuQ" frameborder="0" allowfullscreen></iframe><br />
</center></p>
<p>Like any pattern matching algorithm, face.com&#8217;s algorithm is also a trained algorithm. Better the sample set or the reference set, better the matching. To make the algorithm work consistently, we need to train the service by sending at least 7 to 8 different photos of the person and associate a unique identifier for that set. When a candidate input is presented, the image clicked via the camera on the phone is sent to face.com and we get back that unique identifier with a matched probability score. Now, this unique identifier could be anything from your corporate id or your twitter handle. The important thing is that there is a backend system which you can query using that unique identifier and retrieve contact details associated with that id.</p>
<p>There is a problem though &#8211; I cannot ask every person in the community to upload 10 mugshots to our system to be included in the training set. I would need a more scalable solution. We solved this problem by providing a training mode in the app itself.</p>
<p><strong>Scenario 2</strong>: If you realized that one of your colleagues or friends isn&#8217;t registered on the service, you can switch on the app and switch to training mode. Start the training by pointing the camera to the person and associate the unique identifier for the person. You can then fill in the contact details yourself or fetch it from the centralized contacts store. Follow the progress bar in the training mode and wait for the training to complete. Once done, any user of the app can now add your recently added contact using the mechanism described in scenario 1. Adding a new user to the application &#038; service is crowdsourced. Again, better explained with a Video demo.</p>
<p><center><br />
<iframe width="425" height="355" src="http://www.youtube.com/embed/j-2LYWieKkM" frameborder="0" allowfullscreen></iframe><br />
</center></p>
<p>Now that we had sort of envisioned this technology and its working, fleshed out some initial prototypes, we brainstormed about how this technology can be used to solve other problems. I was also in the market to buy a smart phone myself. I did some research and found out that smart phones in India, with Assisted GPS support, started at around Rs 12,000. But high resolution camera phones were selling as low as 6. Also, I was fascinated by the whole location service apps like FourSquare and Gowalla. It turned out that only 13% of all smart phones sold in the world were location aware. This means there was a big market for location based services for non GPS enabled smart phones.  This is how we tried to crack this problem.</p>
<p><strong>Scenario 3</strong>: You have a smart phone with an internet connection but no GPS. You want to use a location based service to get some deals on items, check into the place, or just give some feedback or tips for other travelers.  Our application defines what we call as a PlaceMark, a unique image of some sort which is linked to a location in our service. To perform any of these functions, open our app, point to the place mark and wait for the location features to load up. You will now get a feed of past conversations, tips, tricks shared by people at that place. The owner of the location can also target people by providing them deals for checking in and giving a social recommendation of sorts. You can even use these as mechanisms to receive feedback, complaints or engage in a Q&amp;A at a large conference. The possibilities are endless. The example video shows a distributed discussion happening on the wikileaks issue. You can join this discussion by using our app and start conversing. The app even sends notifications to your phone when new messages come in.</p>
<p><center><br />
<iframe width="425" height="355" src="http://www.youtube.com/embed/7PoLU2rr7IE" frameborder="0" allowfullscreen></iframe><br />
</center></p>
<p>This was mostly what we came up with. There are plenty more things that can be done with this application, and this, or a similar technology, can be used to solve many other problems.  We also want to take this product to the market and see what responses it receives. Feel free to leave comments.</p>
]]></content:encoded>
			<wfw:commentRss>http://riteshnayak.com/blog/2011/07/10/panacea-augmented-reality-contacts-management-and-location-service/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Continuous Deployment : My first experience</title>
		<link>http://riteshnayak.com/blog/2011/01/30/continuous-deployment-my-first-experience/</link>
		<comments>http://riteshnayak.com/blog/2011/01/30/continuous-deployment-my-first-experience/#comments</comments>
		<pubDate>Sun, 30 Jan 2011 10:26:50 +0000</pubDate>
		<dc:creator>Ritesh</dc:creator>
				<category><![CDATA[Architecture - Design]]></category>
		<category><![CDATA[Tips,Tricks and code]]></category>
		<category><![CDATA[continuous delivery]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[gradle]]></category>
		<category><![CDATA[hudson]]></category>
		<category><![CDATA[tomcat]]></category>

		<guid isPermaLink="false">http://riteshnayak.com/blog/?p=495</guid>
		<description><![CDATA[After following a lot of discussions around the devops role, I was eager to put my new found knowledge to use. After i attended a talk by Jez Humble about his new book Continuous Delivery, I was fascinated by the concept of a fully automated deployment script for applications. I am still yet to get [...]]]></description>
			<content:encoded><![CDATA[<p>After following a lot of discussions around the devops role, I was eager to put my new found knowledge to use. After i attended a talk by <a href="http://twitter.com/#!/jezhumble" target="_blank">Jez Humble</a> about his new book<a href="http://continuousdelivery.com/" target="_blank"> Continuous Delivery</a>, I was fascinated by the concept of a fully automated deployment script for applications. I am still yet to get my hands dirty with infrastructure automation tools like <a href="http://www.puppetlabs.com/puppet/introduction/" target="_blank">Puppet</a> and <a href="http://www.opscode.com/chef" target="_blank">Chef</a> but wanted to give Continuous Deployment a shot. Eventually, I hope to utilize this deployment script , along with Puppet and Chef code, and make a self deploying machine configuration. First, the problem.</p>
<p>One of my side projects has a very active code base. We use <a href="http://git-scm.org" target="_blank">Git</a> as our Source Code Management system and <a href="http://hudson-ci.org/" target="_blank">Hudson</a> for Continuous Integration. Since most of the application backend is pretty stable, the bulk of the changes on our trunk are mostly changes in logic, new features , enhancements and bug fixes. We also run a dogfooding instance where we push the latest changes and test our changes. On our Linux server, we use Tomcat as our app container, MySql and <a href="http://cassandra.apache.org" target="_blank">Cassandra</a> for datastores, Solr for indexing and all builds use <a href="http://gradle.org" target="_blank">Gradle</a>. Till now, pushing changes was a manual task. Here is how I automated this task. @<a href="http://twitter.com/prateeksha" target="_blank">prateeksha</a> , who is a unix command line ninja, was kind enough to guide me through the entire process.</p>
<p>Pushing changes involved , updating the code base to the latest master branch, doing the database migrations and restarting the App Container. Though I still have to get my head around database migrations, here is where automation stands now.</p>
<p>- The continuous deployment script can either be triggered by a git Post-Receive hook or by using a Cron Job.</p>
<p>-  If triggered by a Cron job, we need to poll git for changes. I found this neat little script that figures out whether there have been changes to the source repository and prints out the status of the repository.The script is shown below:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/sh</span>
        <span style="color: #007800;">remote</span>=$<span style="color: #000000;">1</span>
        <span style="color: #007800;">o</span>=.git<span style="color: #000000; font-weight: bold;">/</span>remote_cache.<span style="color: #007800;">$remote</span>
        <span style="color: #007800;">n</span>=<span style="color: #007800;">$o</span>.new<span style="color: #007800;">$$</span>
        git ls-remote <span style="color: #007800;">$remote</span> <span style="color: #000000; font-weight: bold;">&amp;</span>gt;<span style="color: #007800;">$n</span>
        <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #660033;">-f</span> <span style="color: #007800;">$o</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>
        <span style="color: #000000; font-weight: bold;">then</span>
                <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #c20cb9; font-weight: bold;">diff</span> <span style="color: #007800;">$o</span> <span style="color: #007800;">$n</span> <span style="color: #000000; font-weight: bold;">&amp;</span>gt;<span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>null
                <span style="color: #000000; font-weight: bold;">then</span>
                        <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;No Changes&quot;</span>
                <span style="color: #000000; font-weight: bold;">else</span>
                        <span style="color: #c20cb9; font-weight: bold;">mv</span> <span style="color: #007800;">$n</span> <span style="color: #007800;">$o</span>
                        <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Updated&quot;</span>
                <span style="color: #000000; font-weight: bold;">fi</span>
        <span style="color: #000000; font-weight: bold;">else</span>
                <span style="color: #c20cb9; font-weight: bold;">mv</span> <span style="color: #007800;">$n</span> <span style="color: #007800;">$o</span>
                <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;New remote remembered...&quot;</span>
        <span style="color: #000000; font-weight: bold;">fi</span></pre></div></div>

<p>If the return value from this script is &#8220;Updated&#8221; then changes from Git are pulled, Gradle build scripts are run, and the app container(Tomcat) is restarted. Using Hudson&#8217;s wonderful API&#8217;s, you can check whether the latest build of the entire project is successful or not. If it is successful, we can either take Hudson&#8217;s build artifact, or build the project again and deploy it.  Also, a small little utility extracts the log information, date and time of the push and presents it on the App itself. At any point in time, if you want to know what version of the App is actually deployed, you can see a version page which displays deployment time and commit log. Screen shot below.</p>
<div id="attachment_500" class="wp-caption aligncenter" style="width: 310px"><a href="http://riteshnayak.com/blog/wp-content/uploads/Selection_002.png"><img class="size-medium wp-image-500" title="Version infomration of the Continuously deployed Application" src="http://riteshnayak.com/blog/wp-content/uploads/Selection_002-300x71.png" alt="Version infomration of the Continuously deployed Application" width="300" height="71" /></a><p class="wp-caption-text">Click to Enlarge - Version info of the App</p></div>
<p>This has been my first experiment with Continuous deployment, I still need to understand and solve the migrations issue. Next? More experiments with Chef and Puppet coming up.</p>
]]></content:encoded>
			<wfw:commentRss>http://riteshnayak.com/blog/2011/01/30/continuous-deployment-my-first-experience/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bookmarklets are as bad as software on a CD</title>
		<link>http://riteshnayak.com/blog/2009/12/19/bookmarklets-are-as-bad-as-software-on-a-cd/</link>
		<comments>http://riteshnayak.com/blog/2009/12/19/bookmarklets-are-as-bad-as-software-on-a-cd/#comments</comments>
		<pubDate>Sat, 19 Dec 2009 07:57:54 +0000</pubDate>
		<dc:creator>Ritesh</dc:creator>
				<category><![CDATA[Architecture - Design]]></category>
		<category><![CDATA[Tips,Tricks and code]]></category>

		<guid isPermaLink="false">http://riteshnayak.com/blog/?p=467</guid>
		<description><![CDATA[Bookmarklets are funny pieces of software. Even though its primarily used in the web browser, mainly to perform small nifty tasks, its one resource that you have no control over after its deployed. Unlike Mozilla addon&#8217;s that prompt for an update, general websites which update when refreshed, bookmarklets are almost as archaic as delivering software [...]]]></description>
			<content:encoded><![CDATA[<p>Bookmarklets are funny pieces of software. Even though its primarily used in the web browser, mainly to perform small nifty tasks, its one resource that you have no control over after its deployed. Unlike Mozilla addon&#8217;s that prompt for an update, general websites which update when refreshed, bookmarklets are almost as archaic as delivering software over a CD. Lets take an example of a badly designed bookmarklet: The example below is the Press This bookmarklet distributed by wordpress initially. ( I have changed some of the values of course)</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;">javascript<span style="color: #339933;">:</span>
   <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>navigator.<span style="color: #660066;">userAgent</span>.<span style="color: #660066;">indexOf</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'Safari'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">%</span>20<span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;=%</span>200<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
         Q<span style="color: #339933;">=</span>getSelection<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span><span style="color: #000066; font-weight: bold;">else</span><span style="color: #009900;">&#123;</span>
    Q<span style="color: #339933;">=</span>document.<span style="color: #660066;">selection</span><span style="color: #339933;">?</span>document.<span style="color: #660066;">selection</span>.<span style="color: #660066;">createRange</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">text</span><span style="color: #339933;">:</span>document.<span style="color: #660066;">getSelection</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
   location.<span style="color: #660066;">href</span><span style="color: #339933;">=</span><span style="color: #3366CC;">'http://wordpress.php?username=blah&amp;amp;text='</span><span style="color: #339933;">+</span>encodeURIComponent<span style="color: #009900;">&#40;</span>Q<span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span><span style="color: #3366CC;">'&amp;amp;popupurl='</span><span style="color: #339933;">+</span>encodeURIComponent<span style="color: #009900;">&#40;</span>location.<span style="color: #660066;">href</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>You will see that this is calling a RESTful implementation of some service with query parameters and the whole code is stored and rendered from inside the bookmarklet. Lets leave the security aspects of this implementation aside, that will require another post in itself. Such a bookmark is a nightmare waiting to happen. Imagine the trouble you would face if you changed the implementation tomorrow. You will have to write to ensure backward compatibility or take the user to a page where he/she can upgrade to the newest version of the bookmarklet. This is a bad way of delivering software.  </p>
<p> Ideally, the bookmarklet in accordance with a shortcut/bookmark must mainly be a pointer to the actual web resource. Even for trivial bookmarklets, make sure you follow this design principle because you might want to do something different or more advanced later on. I am sure you have come across situations where you realized the bookmarklet you wrote didn&#8217;t work on a browser like Opera or Safari. It may be too late to correct it later on if people have already installed it on their browsers. </p>
<p>Lets now take a bookmarklet that loads the code to be executed from a script on the web. This is now the preferred means of deploying bookmarklets as it puts the control back into the hands of the web developer. This example is from the Friendfeed bookmarklet that lets you share things on FriendFeed.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"> javascript<span style="color: #339933;">:</span><span style="color: #000066; font-weight: bold;">void</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
    var<span style="color: #339933;">%</span>20e<span style="color: #339933;">=</span>document.<span style="color: #660066;">createElement</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'script'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    e.<span style="color: #660066;">setAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'type'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'text/javascript'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    e.<span style="color: #660066;">setAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'src'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'http://someserver.com/bookmarkletcode.js'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   document.<span style="color: #660066;">body</span>.<span style="color: #660066;">appendChild</span><span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span></pre></td></tr></table></div>

<p>All this bookmarklet does is to append a new script tag in your html page and assigns the source to the bookmarklet source. The difference now is that there is no code on the client side that is tied to an implementation. You can change the code in the bookmarkletcode.js as and when you feel necessary and be assured that the people using your bookmarklet will always use the latest version. </p>
]]></content:encoded>
			<wfw:commentRss>http://riteshnayak.com/blog/2009/12/19/bookmarklets-are-as-bad-as-software-on-a-cd/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Design Patterns Quick Reference</title>
		<link>http://riteshnayak.com/blog/2009/05/26/design-patterns-quick-reference/</link>
		<comments>http://riteshnayak.com/blog/2009/05/26/design-patterns-quick-reference/#comments</comments>
		<pubDate>Tue, 26 May 2009 10:10:30 +0000</pubDate>
		<dc:creator>Ritesh</dc:creator>
				<category><![CDATA[Architecture - Design]]></category>
		<category><![CDATA[Tips,Tricks and code]]></category>

		<guid isPermaLink="false">http://riteshnayak.com/blog/?p=447</guid>
		<description><![CDATA[I am back to designing some software and want to use all my knowledge of Object Orientation and patterns to tackle common problems with design. I found this great reference for the most commonly used design patterns that I must share. It lists all of the core design patterns, all 23 of them,  listed in [...]]]></description>
			<content:encoded><![CDATA[<p>I am back to designing some software and want to use all my knowledge of Object Orientation and patterns to tackle common problems with design. I found this great reference for the most commonly used design patterns that I must share. It lists all of the core design patterns, all 23 of them,  listed in the gang of four book. If you know what this is, take a print out of this and revisit your designs. Thanks to Mark Turansky for the <a href="http://blog.markturansky.com/archives/32" target="_blank">original upload</a>.</p>
<table border="0">
<tbody>
<tr>
<td>
<p><div id="attachment_449" class="wp-caption alignnone" style="width: 236px"><a href="http://riteshnayak.com/blog/wp-content/uploads/designpatterns2_sm.jpg"><img class="size-medium wp-image-449" title="designpatterns2_sm" src="http://riteshnayak.com/blog/wp-content/uploads/designpatterns2_sm-226x300.jpg" alt="Design Patterns card 2" width="226" height="300" /></a><p class="wp-caption-text">Design Patterns card 2</p></div></td>
<td>
<p><div id="attachment_448" class="wp-caption alignnone" style="width: 238px"><a href="http://riteshnayak.com/blog/wp-content/uploads/designpatterns1_sm.jpg"><img class="size-medium wp-image-448" title="designpatterns1_sm" src="http://riteshnayak.com/blog/wp-content/uploads/designpatterns1_sm-228x300.jpg" alt="Design patterns card 1" width="228" height="300" /></a><p class="wp-caption-text">Design patterns card 1</p></div></td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://riteshnayak.com/blog/2009/05/26/design-patterns-quick-reference/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Limitations and Challenges in Cloud Computing for Applications</title>
		<link>http://riteshnayak.com/blog/2009/04/13/limitations-and-challenges-in-cloud-computing-for-applications/</link>
		<comments>http://riteshnayak.com/blog/2009/04/13/limitations-and-challenges-in-cloud-computing-for-applications/#comments</comments>
		<pubDate>Mon, 13 Apr 2009 14:06:04 +0000</pubDate>
		<dc:creator>Ritesh</dc:creator>
				<category><![CDATA[Architecture - Design]]></category>
		<category><![CDATA[Tips,Tricks and code]]></category>
		<category><![CDATA[Trends-Predictions-Inferences]]></category>
		<category><![CDATA[Unsolved problems]]></category>

		<guid isPermaLink="false">http://riteshnayak.com/blog/?p=441</guid>
		<description><![CDATA[I was supposed to be involved in a discussion about cloud computing at Cloudcamp Bangalore, but due to other commitments, I could not attend the event. I had a small writeup about the limitations and challenges in Application clouds. Here is the full text of it.
Cloud Computing is a way of providing dynamically scalable and [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p><em>I was supposed to be involved in a discussion about cloud computing at Cloudcamp Bangalore, but due to other commitments, I could not attend the event. I had a small writeup about the limitations and challenges in Application clouds. Here is the full text of it.</em></p></blockquote>
<p>Cloud Computing is a way of providing dynamically scalable and available resources such as computation, storage etc as a service to users who can use it to deploy their applications and data. Cloud Computing can handle data in both the public and the private domain. But this seemingly harmless way of thinking about building applications has its own set of issues.I am primarily referring to application cloud providers, the kind where you deploy your applications. Not storage and service clouds. Google AppEngine would be a good example for the cloud that I am describing. I note some of them here :</p>
<p><strong>From the Users perspective:</strong></p>
<ol>
<li>New unstructured and non standard paradigm of programming: Each cloud has its own supported programming language and syntax requirements for programming, though most of these clouds expose the typical hashtable based cache and datastore interfaces. There is an urgent need for standardization of interfaces and methods of programming them. One of the reasons why shared hosting environments work great is because , as a programmer, I know that I can move my PHP/PERL code to another server and it will work without too much of a fuss. Moving from one of the dozen odd cloud providers to another requires considerable developmental efforts, not to forget time (for businesses, this could spell doom).  A look back at history shows languages like SQL, C etc being standardized to stop exactly this sort of undesirable proliferation.</li>
<li>Restrictions on the programming model : For cloud based applications to be highly available, they must be easy to dynamically mirror on multiple machines. Once these applications are mirrored, they can be served on demand by load balancing servers which makes them highly available and the user doesn&#8217;t face delays in being serviced. This is an old trick used by busy websites from the early days of web publishing but these solutions were custom built for websites. So, extending this concept to cloud based platforms, servicing thousands of applications, mandates the platform providers to automate this task of replication and mirroring. This job is easier said than done. This process can be made seamless when the program stores as little state information as possible. By state, I mean transactional variables, static variables, variables in the context of the entire application etc. These things are almost a given in traditional programming environments but are very hard to come by in cloud based environments. The unnatural way of dealing with this situation is using the datastore or the cache to store state of an application. There are a lot of restrictions like lack of privileges to install third party libraries, no access to file system to write files etc ( which forces you to use the datastore and pay for it)</li>
<li>A good local debugging experience: A good local development environment, debugging experience is a must for programming on the cloud. Most cloud providers do not provide good local development environments. There is also a lack of good IDE&#8217;s that can help with programming and debugging programs written for the cloud. The providers that do provide a local debug experience, do not simulate real cloud like conditions. Both from my personal experience and from conversations with other developers, I have come to realize that most people face problems when moving code from their local development servers to the actual cloud. This is only due to inconsistencies in the behavior of the local dev env compared to the cloud.</li>
<li>Appropriate metrics and documentation of programming best practices : On a cloud, since a user pays for almost every CPU cycle, appropriate metrics on usage of processing time and memory must be presented to the users. Typically a profile of the application with function names and their corresponding time taken, memory used, processing cycles used will definitely help the developer tune his/her code to optimize on usage of processing power. The best solution for this is for cloud providers to abstract common code patterns into optimal libraries so that the users can be assured that they are running the most optimal code for a certain operation. An example of this is Apache PIG, which gives a scripting like interface to Apache Hadoop&#8217;s HDFS for data analysis. Also, Most cloud providers do not provide enough statistics and also profiling capabilities.</li>
</ol>
<p><strong>From the providers perspective:</strong></p>
<p>Here I look at challenges that cloud providers have to face:</p>
<ol>
<li>Ensuring availability of the cloud: This proves to be crucial as Clouds host critical business applications, for whom, downtime would mean monetary losses. Effective monitoring and load balancing solutions are to be built. Most clouds employ virtualization technology to get the most out of any resource. In such cases, tools should be written to figure out a resource hog early and move the application to a more powerful grid or a machine, so that the other users get their share of the cloud without delays.</li>
<li>Ensuring Consistency: Both the data and code is replicated on the cloud and maintaining consistency of data is extremely crucial. This is the reason why most transactional updates are not allowed on the cloud. Example: sequence objects, which are almost a given in traditional databases are not provided, probably because maintaining state across machines for such statements is non trivial. Problems like distributed updates, locking, partitioning, sharding etc  arise when dealing with data. Such constructs are to be provided to the users as most of it is given in the non cloud deployment space.<br />
Most datastores provided by cloud vendors (except the ones that provide cloud based database services) do not support relational models. Which means all object relations have to be programmatically established. This could always lead to bad code, unnecessary joins, cascading problems and tons of other problems that developers faced before working with relational datastores.</li>
<li>Program verification : One of the biggest worries about deploying applications on the cloud is the correctness of the program in execution. Erroneous conditions, like infinite loops, can not only put the machine at the risk of being overloaded and unavailable, but also cost the user a significant amount of money. Tools like static analysis should be used to analyze code uploaded on the cloud and it should be checked for infinite loops, possible race conditions,  null references, unreachable code etc. The code uploaded should also be optimized or suggestions should be provided to the users about how they could optimize code to best utilize the available resources.</li>
</ol>
<p><strong>Conclusion </strong>: The cloud should become a complete nonrestrictive platform for applications. There should be no restrictions on the constructs, functionality and privileges on the cloud. Also, it should be dead simple to move everyday applications onto the cloud without too much of rework. This could mean writing migration utilities, import/export options and other artifacts that make the transition to a cloud much easier.  This will prove essential as most live applications, at least currently, do not run on a cloud and helping them migrate easily will mean more revenue and adoption.</p>
]]></content:encoded>
			<wfw:commentRss>http://riteshnayak.com/blog/2009/04/13/limitations-and-challenges-in-cloud-computing-for-applications/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Redesigning interfaces: what facebook and delicious got right</title>
		<link>http://riteshnayak.com/blog/2008/08/01/redesigning-interfaces-what-facebook-and-delicious-got-right/</link>
		<comments>http://riteshnayak.com/blog/2008/08/01/redesigning-interfaces-what-facebook-and-delicious-got-right/#comments</comments>
		<pubDate>Fri, 01 Aug 2008 12:04:01 +0000</pubDate>
		<dc:creator>Ritesh</dc:creator>
				<category><![CDATA[Architecture - Design]]></category>

		<guid isPermaLink="false">http://riteshnayak.com/blog/2008/08/01/redesigning-interfaces-what-facebook-and-delicious-got-right/</guid>
		<description><![CDATA[I have like two new interface changes in the recent past. One being the new Facebook interface and more recently (ie today) the del.icio.us page. Both these interfaces have one thing in common, putting the most essential information out where you would need them and more importantly break through the clutter. 
&#160;Lets take the example [...]]]></description>
			<content:encoded><![CDATA[<p>I have like two new interface changes in the recent past. One being the new Facebook interface and more recently (ie today) the del.icio.us page. Both these interfaces have one thing in common, putting the most essential information out where you would need them and more importantly break through the clutter. </p>
<p>&nbsp;Lets take the example of facebook. The apps killed the facebook profile page. There were days when a single page would take 15 minutes to load thanks to the 50 odd apps that people had added to their profiles. Facebook&#8217;s new design rocks coz they have removed the clutter. Facebook&#8217;s usp, the newfeed, is what is shown as the profile , which is nice considering you get to see what the person you are seeing is upto recently. The apps have moved to a completely new page which means, no clutter <img src='http://riteshnayak.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  Also the profile information, which people hardly change is gone into another page. Another cool addition I saw is the &#8220;What are you doing now ?&#8221; is highlighted and big. Given the run twitter is having with its fans, Im sure facebook realizes that micotexting about yourself is the rage right now and integrates that at the head of your homepage. Pretty ingenious if you think about it. Not all redesigns work , for ex , I hated the analytics redesign for the first few days and so was the redesign of wordpress but regular usage and some groking made me very comfortable with the interface. When you are redesigning interfaces especially for sites like flickr, facebook then it becomes essential that you get a value add and Facebook certainly nailed this one. </p>
<p>&nbsp;Now lets go back to del.icio.us. Firstly the dots are off and you can access it as delicious.com, which saves me the trouble of explaining people the position of the dots in the url. I like the old del.icio.us and its UI. It was very basic, no frill, plain text based UI. The reason was probably the speed which it would work. But one thing that annoyed me was the clutter.The URL, Description, tags, other taggers, edit&nbsp; and remove links etc were fit into a really small space; the new UI had to break this clutter.&nbsp; The other problem was the tag cloud on the right. The older version would buch up tags and it would be difficult to spot the tags if you had more than say 200 which is common for most delicious uses. The new UI does a wonderful job of reducing the clutter. All the above mentioned items of the URL are still present in the same space and look darling. The tag cloud has also become more navigable and the social aspect of the site is utilized superbly if you see your networks page. </p>
<p>&nbsp;I am now looking at some of the properties that I have built that can possibly be redesigned for better usage.<br />
<!--adsense--><br />
   <!-- technorati tags begin -->
<p style="font-size:10px;text-align:right;">Tags: <a href="http://technorati.com/tag/interfaces" rel="tag">interfaces</a>, <a href="http://technorati.com/tag/redesign" rel="tag">redesign</a>, <a href="http://technorati.com/tag/%20facebook" rel="tag"> facebook</a>, <a href="http://technorati.com/tag/%20delicious" rel="tag"> delicious</a></p>
<p><!-- technorati tags end --></p>
]]></content:encoded>
			<wfw:commentRss>http://riteshnayak.com/blog/2008/08/01/redesigning-interfaces-what-facebook-and-delicious-got-right/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>3rd Party Application Integration &#8211; Implications</title>
		<link>http://riteshnayak.com/blog/2008/06/30/3rd-party-application-integration-implications/</link>
		<comments>http://riteshnayak.com/blog/2008/06/30/3rd-party-application-integration-implications/#comments</comments>
		<pubDate>Mon, 30 Jun 2008 09:02:13 +0000</pubDate>
		<dc:creator>Ritesh</dc:creator>
				<category><![CDATA[Architecture - Design]]></category>

		<guid isPermaLink="false">http://riteshnayak.com/blog/2008/06/30/3rd-party-application-integration-implications/</guid>
		<description><![CDATA[Quite recently there have been many apps that have added the ability for third party applications to plug into the main app. Some examples include Myspace, facebook, iGoogle, Okut and currently Yahoo Search ( thanks to SearchMonkey). The intent is to improve the usefulness of the main application in turn make these otherwise undiscovered third [...]]]></description>
			<content:encoded><![CDATA[<p>Quite recently there have been many apps that have added the ability for third party applications to plug into the main app. Some examples include Myspace, facebook, iGoogle, Okut and currently Yahoo Search ( thanks to SearchMonkey). The intent is to improve the usefulness of the main application in turn make these otherwise undiscovered third party applications popular. The third party applications thrive on the popularity and traffic of the mother app. The popularity of third party apps have spawned an entire eco-system of app builders who target exactly these platforms and hope to cash in on the phenomenon. Social applications are green pastures for such application builders, who hope to reach a large audience by utilizing this community as a service.<br />
&nbsp;Now most of these apps are pretty alright, but most of them just break and compromise the entire user experience. Facebook is currently the site that is facing the app overload problem. Too many apps clutter and spoil the entire facebook experience.<br />
&nbsp;<br />
&nbsp;The other problem is that most mother applications are huge in their own right and drive a lot of traffic. In that case there should be some guarantee that the plugins also scale equally. This is a problem I have faced after integrating searchmonkey applications on Yahoo Search and also some apps in Facebook. Unanticipated loads on third party apps wreck the app and most of them dont scale and all they do is spoil the UX of the app as a consequence. My StumbleUpon addition to Yahoo Search just didnt work the first few days and I could only read a &#8220;This plugin is not available right now&#8221; message. In another instance, I integrated an app on my blog and the problem was that due to the right sidebar, my content wouldn&#8217;t load until the third party app loaded and when it didnt, the blog would serve up nothing. There is no way for the mother app to figure out whether the third party app is available and running. If it isnt available then dont publish it onto the clients interface, thereby retaining the users experience.</p>
<p>&nbsp;In fact, for any third party application, there must be some scalability requirements enforced and only when they meet such requirements should they be allowed to publish. An alternative would be for the mother app to build its own cloud and make sure that the 3rd party application uses that cloud so that its highly available ( Case in point Google&#8217;s App Engine &#8211; Use for widgets). Or, there must be some load test designed when the 3rd party app registers with the mother app ( ex : Automated load tests on sites like TopCoder ). An even more elegant way of figuring out scalability problems would be to statically analyze the submitted code to check for bottlenecks and other possible leaky parts of the code and then reach a decision whether to allow for the code to run or not. Until such rigorous checks and constraints are not enforced, third party apps will keep ruining our experience. </p>
<p><!--adsense#center--><br />
    <!-- technorati tags begin -->
<p style="font-size:10px;text-align:right;">Tags: <a href="http://technorati.com/tag/cloud" rel="tag">cloud</a>, <a href="http://technorati.com/tag/facebook%20appliation" rel="tag">facebook appliation</a>, <a href="http://technorati.com/tag/%20third%20party%20applications" rel="tag"> third party applications</a>, <a href="http://technorati.com/tag/%20static%20analysis%20" rel="tag"> static analysis </a></p>
<p><!-- technorati tags end --></p>
]]></content:encoded>
			<wfw:commentRss>http://riteshnayak.com/blog/2008/06/30/3rd-party-application-integration-implications/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Are days of the RDBMS numbered ?</title>
		<link>http://riteshnayak.com/blog/2007/12/19/are-days-of-the-rdbms-numbered/</link>
		<comments>http://riteshnayak.com/blog/2007/12/19/are-days-of-the-rdbms-numbered/#comments</comments>
		<pubDate>Wed, 19 Dec 2007 14:55:20 +0000</pubDate>
		<dc:creator>Ritesh</dc:creator>
				<category><![CDATA[Architecture - Design]]></category>
		<category><![CDATA[Trends-Predictions-Inferences]]></category>
		<category><![CDATA[rant]]></category>

		<guid isPermaLink="false">http://riteshnayak.com/blog/2007/12/19/are-days-of-the-rdbms-numbered/</guid>
		<description><![CDATA[Most programmers know databases and its importance. Thanks to the new generation of software as a service and web services, traditional RDBMS&#8217;s are sparingly used and the number is bound to deteriorate further as enterprises adopt the Saas platform.
Data has far outgrown the domains of just text. Today we talk of mutlimedia data, urls, semantic [...]]]></description>
			<content:encoded><![CDATA[<p>Most programmers know databases and its importance. Thanks to the new generation of software as a service and web services, traditional RDBMS&#8217;s are sparingly used and the number is bound to deteriorate further as enterprises adopt the Saas platform.</p>
<p>Data has far outgrown the domains of just text. Today we talk of mutlimedia data, urls, semantic data and many more application specific formats. Information on the Web is in JSON, REST , XML , <a href="http://rnayak.wordpress.com/2007/01/03/what-are-microformats-and-how-are-they-the-future/" target="_blank" title="Microformats">Microformats</a> etc. With this vareity in data formats and representations comes the inherent need for flexibility in storage and querying of such information.  Almost all database users know of the conceptual modelling required for the design of any database, the key principle being that more tighter the model, more efficient the database. The integrity of the database is only as good as the integrity of the data. But you cannot talk of data integrity with the kind of formats available today.</p>
<p>Clearly markup data dominates the web . Though databases have developed features to better support , store and validate markup data , the initial design of databases was never to store the wide variety of loosely organized data. Querying of such markup data is fruitless and so is the attempt to index, sort , aggregate this data. To develop a custom database capable of all the above mentioned operations could be a solution, but the given the non standardized nature of this data and its probability of change, you would have a tough time scouring the web to search for changes. Plus these databases will not be <a href="http://rnayak.wordpress.com/2007/12/05/towards-semantic-interoperability/" target="_blank">semantically inter operable</a>.</p>
<p>Developers are taking notice of a new scheme of storing data, I call it the bucket store. The design is roughly the same as that of a hash table, where data blocks are stored in buckets and hashes are used to index or refer to these buckets. A little improvisation in terms of adding upper layers like domains, groups and so on to complement the schema, table in a database is done to make the data easily classifiable. The advantage with this scheme is heterogeneity in data formats and the absence of constraints.</p>
<p>Several products are offering such services at dirt cheap prices. Take Amazon’s <a href="http://www.amazon.com/S3-AWS-home-page-Money/b/ref=sc_fe_l_2?ie=UTF8&amp;node=16427261&amp;no=3435361&amp;me=A36L942TSJ2AJA" target="_blank">S3</a> or the recently launched <a href="http://aws.amazon.com/simpledb">Simpledb</a> or <a href="http://couchdb.org/" target="_blank">CouchDb</a> which offers a host it yourself version of this storage. Amazon S3 has businesses running on top of it; of the many I can recall <a href="http://slideshare.net" target="_blank">Slideshare</a> running on S3. With the advent of more mashups and <span> </span>heterogeneous data being churned out by the web more of such non DBMS related storage options will be employed. Given that this paradigm does implement all the enterprise important features like security, access control , backups, transactions<span>  </span>etc and mature modeling methodologies that can rival the ER are proposed , I don’t see any problem in this becoming the most viable and cost effective option for data storage.</p>
<p><!--adsense#center--></p>
]]></content:encoded>
			<wfw:commentRss>http://riteshnayak.com/blog/2007/12/19/are-days-of-the-rdbms-numbered/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Comet paradigm implementation</title>
		<link>http://riteshnayak.com/blog/2007/08/03/comet-paradigm-implementation/</link>
		<comments>http://riteshnayak.com/blog/2007/08/03/comet-paradigm-implementation/#comments</comments>
		<pubDate>Fri, 03 Aug 2007 05:11:59 +0000</pubDate>
		<dc:creator>Ritesh</dc:creator>
				<category><![CDATA[Architecture - Design]]></category>
		<category><![CDATA[Tips,Tricks and code]]></category>
		<category><![CDATA[Web 2.0]]></category>

		<guid isPermaLink="false">http://riteshnayak.com/blog/2007/08/03/comet-paradigm-implementation/</guid>
		<description><![CDATA[There are a lot of schools of thought when it comes to the comet paradigm. There are some who think of comet as a technology in itself that can change the way the web works, while others think its nothing more than another buzzword alongside Ajax and Web2.0. I think, in essence , the latter [...]]]></description>
			<content:encoded><![CDATA[<p>There are a lot of schools of thought when it comes to the<strong> <a href="http://alex.dojotoolkit.org/?p=545" title="Comet - Low latency connection" target="_blank">comet paradigm</a>.</strong> There are some who think of comet as a technology in itself that can change the way the web works, while others think its nothing more than another buzzword alongside Ajax and Web2.0. I think, in essence , the latter is more appropriate.</p>
<p>Comet is essentially an design principle which aims at achieving true push technology using http. <strong>Comet is not a technology in itself</strong>,  <a href="http://cometd.com/" title="cometd server">cometd </a>is an implementation effort to make such a paradigm possible, but comet itself isnt a technology. For real time systems and other applications like stock tickers you don&#8217;t need an entire page refresh, its enough if you can get the updated values in your respective places. Ajax seemed to be the answer for sometime with browsers asynchronously requesting for changes and then updating the same in DOM. The problem with  Ajax was the polling, since the job was asynchronous, there was a interative pattern of asynchronous requests and replies. Even though there wasn&#8217;t any change in the server values, the client would request repeatedly to check if the values changed, which led to the server being overloaded. <strong>The solution was to push the updates to a client without the client requesting for it</strong>. Sorta like the good old days of socket programming.</p>
<p>There are many solutions to this problem, each one with its own set of advantages and disadvantages but I shall explain a single implementation that I worked on. Its called the Long Looping method.</p>
<p><img src="http://alex.dojotoolkit.org/wp-content/Comet.png" height="745" width="507" /></p>
<p><strong> Long Looping Method :</strong></p>
<p>This method involves making a request to the server which in itself will reply only when there was a change. Your browser will keep showing you the loading icon coz the server hasn&#8217;t replied as yet. The server end can achieve the desired result by either suspending a request to a thread that will wait till notified or a putting the request through an infinite loop. Once there is a change of state on the server the loop ends and the reply sent. The client receives the reply and immediately sends another request for further changes and so on.</p>
<p>In this way you can see that, there is always a low latency http connection between the client browser and the server. The delay in state changes to the server is very low and will definitely be ten orders better than the regular ajax looping method.</p>
]]></content:encoded>
			<wfw:commentRss>http://riteshnayak.com/blog/2007/08/03/comet-paradigm-implementation/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Collaborative apps and Collective human intelligence</title>
		<link>http://riteshnayak.com/blog/2007/07/17/collaborative-apps-and-collective-human-intelligence/</link>
		<comments>http://riteshnayak.com/blog/2007/07/17/collaborative-apps-and-collective-human-intelligence/#comments</comments>
		<pubDate>Tue, 17 Jul 2007 08:03:34 +0000</pubDate>
		<dc:creator>Ritesh</dc:creator>
				<category><![CDATA[Architecture - Design]]></category>
		<category><![CDATA[Trends-Predictions-Inferences]]></category>
		<category><![CDATA[Web 2.0]]></category>
		<category><![CDATA[rant]]></category>

		<guid isPermaLink="false">http://riteshnayak.com/blog/2007/07/17/collaborative-apps-and-collective-human-intelligence/</guid>
		<description><![CDATA[Collaborative apps have been around for quite sometime now, but they have been lurking very close the corporate apps which can be used primarily in a business scenario. A simple example of the same could be the productivity 2.0 apps like Zoho or Google Docs. The only other breed of collaborative app has been games, [...]]]></description>
			<content:encoded><![CDATA[<p>Collaborative apps have been around for quite sometime now, but they have been lurking very close the corporate apps which can be used primarily in a business scenario. A simple example of the same could be the productivity 2.0 apps like Zoho or Google Docs. The only other breed of collaborative app has been games, which is a again a huge draw. Its true that this genre of applications is still finding its foothold on the web and as time progresses you will find killer new applications that will explore new possibilities with colloborative apps.</p>
<p>I had written about Amazon&#8217;s Mechanical Turk and how it used the power of collaboration combined with automated project management to get arduous work done from people. Taking and extending on the same paradigm are newer applications that try and achieve some good from these collaborative applications. Its like the Seti project which uses your computational resource when idle, these applications use the power of human intelligence to contribute to a greater cause.</p>
<p>Take <a href="http://www.galaxyzoo.org/" target="_blank">GalaxyZoo </a>for example.  A project from Oxford, the site aims at using the power of collective human intelligence to aid in pattern recognition. Users are given images of spirals and ellipses to recognise and defragment. The images in essence are images from deep space and the project aims at mapping a virtual universe using GalaxyZoo.</p>
<p>Similarly you have <a href="http://clickworkers.arc.nasa.gov/top" target="_blank">clickWorkers </a>from NASA, a project that aims at identifying craters on Mars. Another useful outcome from these breed of apps is the ability to help in digitizing scanned text or old books. <a href="http://www.pgdp.net/c/" target="_blank">Distributed Proofreaders</a> and <a href="http://recaptcha.net/" target="_blank">ReCaptcha</a> both provide simple to read captchas that form parts of old books that were garbled up by OCR&#8217;s while being digitized. Users help in recognizing these garbled , machine unreadable  text in the form of captcha&#8217;s and the user input is then given back to the system.</p>
<p><a href="http://images.google.com/imagelabeler/" target="_blank"><img src="http://images.google.com/imagelabeler/logo.gif" height="55" width="150" /> </a>Another interesting collaborative app is the Google Image Labeler. This attempts to solve a problem of tagging images , a usually boring task is made interesting by allowing users to pair up and brainstorm over words that they can come up with for images. Points are given as an added bonus and to keep the game interesting.</p>
<p>There are many other projects that are currently incubating in research labs which are toying with concepts that use this form of collective human intelligence. The challenge will be to streamline these apps into everyday applications and make them more inherent and not be looked at as an overhead. Take for example digg, they ask for captcha auths on submitting a new story. Rather than projects like recaptcha, why not have these captcha&#8217;s fit into sites like digg .  That way, the the number of captcha&#8217;s served up and translated will be more and will seem more useful to do.</p>
]]></content:encoded>
			<wfw:commentRss>http://riteshnayak.com/blog/2007/07/17/collaborative-apps-and-collective-human-intelligence/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Getting Familiar with Google Gears</title>
		<link>http://riteshnayak.com/blog/2007/07/05/getting-familiar-with-google-gears/</link>
		<comments>http://riteshnayak.com/blog/2007/07/05/getting-familiar-with-google-gears/#comments</comments>
		<pubDate>Thu, 05 Jul 2007 09:38:34 +0000</pubDate>
		<dc:creator>Ritesh</dc:creator>
				<category><![CDATA[Architecture - Design]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Trends-Predictions-Inferences]]></category>
		<category><![CDATA[Web 2.0]]></category>
		<category><![CDATA[socionets]]></category>

		<guid isPermaLink="false">http://riteshnayak.com/blog/2007/07/05/getting-familiar-with-google-gears/</guid>
		<description><![CDATA[Google Gears was released recently as an effort to promote offline web. I have written time and again about this genre of web applications and have spoken about the advancements like the Dojo Offline Toolkit, AIR  and the new Silverlight that try to blemish the line between web and desktop applications.
Google Gears is designed [...]]]></description>
			<content:encoded><![CDATA[<p>Google Gears was released recently as an effort to promote offline web. I have written time and again about this genre of web applications and have spoken about the advancements like the Dojo Offline Toolkit, AIR  and the new Silverlight that try to blemish the line between web and desktop applications.</p>
<p>Google Gears is designed ingeniously. Gears is an activex plugin on IE and an XPI on firefox(installables) . Gears then works in your browser for any applications designed to use the gears technology. The foremost application that uses gears is Google Reader, which can store and retrieve almost 2000 articles. The transition between online and offline web is supposed to be seamless, as in one taking over when the connectivity is out and the other when its back. In reader, you have to explicitly make the shift from online to offline, something like the work offline option in IE.</p>
<p>The core essentially consists of three modules :</p>
<ul>
<li>  <strong>Local Server Module</strong> : Creates a local server like emulator in which you can cache urls javascript, image etc. The ResourceStore module is used to capture resources that have to be accesed using a URL. ie supposing you were visiting my homepage, the resources like my resume or my portfolio , that need to be accessed via URL&#8217;s can be cached. The other variant is the ManagedResourceStore which automatically updates the cached information. In each case the URL&#8217;s and the cache in general has to be specified in a manifest file. The LocalServer intercepts HTTP/HTTPS requests and serves them from the cache if URL is cached in a ResourceStore or ManagedResourceStore (which is enabled) and the cookie of that information is present. This happens irrespective of the network connection.</li>
<li>  <strong>Local Database</strong> : This module is taken as an enhancement to <a href="http://www.sqlite.org/index.html" target="_blank">SQLite </a>, the micro database in C that can be configured and run in under 250Kb of memory. The gears javascript library provides method to create a new local database and also allows from complete <a href="http://www.sqlite.org/lang.html" target="_blank">SQLite SQL operations</a>.</li>
<li><strong>Worker Pool</strong> : Almost every web developer has come across the long running script -&gt; continue or break dialog. This usually happens due to an infinite loop in javascript or sometimes a very intensive calculation. The downside to this is that UI becomes non responsive and no action can happen on the front end of the app. The worker pool helps the cause by running these operations in the background. People familiar with thick app programming can relate this to threading, but at the javascript level. But unlike threads the workers do not share state information. The workers can communicate with each other by passing message strings or use JSON.</li>
</ul>
<p>This advancement not only makes offline web possible but also allows for a new breed of applications to be born. Applications  that need a server only to sync and not to compute or perform functionality. Think of a MyBlogLog offline for example, you visit a blog where you have a MyBlogLog reader that you have already encountered before the system tells you about your past encounters and on what pages. A distributed social network of sorts!!</p>
]]></content:encoded>
			<wfw:commentRss>http://riteshnayak.com/blog/2007/07/05/getting-familiar-with-google-gears/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Social Design and the Opaque value problem</title>
		<link>http://riteshnayak.com/blog/2007/07/02/social-design-and-the-opaque-value-problem/</link>
		<comments>http://riteshnayak.com/blog/2007/07/02/social-design-and-the-opaque-value-problem/#comments</comments>
		<pubDate>Mon, 02 Jul 2007 09:43:52 +0000</pubDate>
		<dc:creator>Ritesh</dc:creator>
				<category><![CDATA[Architecture - Design]]></category>
		<category><![CDATA[Suggested Reading]]></category>
		<category><![CDATA[Unsolved problems]]></category>
		<category><![CDATA[socionets]]></category>

		<guid isPermaLink="false">http://riteshnayak.com/blog/2007/07/02/social-design-and-the-opaque-value-problem/</guid>
		<description><![CDATA[I read this post by Joshua Porter about the value of social networks and the opaque value problem and it got me thinking. Why and for what do we actually use web based services.
The fact that we don’t understand what value others get from social web apps is part of the paradigm of social software. [...]]]></description>
			<content:encoded><![CDATA[<p>I read <a href="http://bokardo.com/archives/the-opaque-value-problem/" target="_blank">this post by Joshua Porter about the value of social networks and the opaque value problem</a> and it got me thinking. Why and for what do we actually use web based services.</p>
<blockquote><p><em>The fact that we don’t understand what value others get from social web apps is part of the paradigm of social software. The key is that each person has their own social lives, their own social circle, and thus their own social values. What is important to their social life will almost certainly be unimportant to us because we have our own to worry about.</em></p>
<p><em>Think of it this way. Each person has their own social network. Chances are that social network overlaps very little with yours. If, say, that person wanted recommendations for watching a movie, they might turn to their social network, which is made up of their family, friends, and colleagues. They would ask these people, the people they know and trust, what movies they recommend. </em></p>
<p><em>Now, would you turn to the same social network for movie recommendations? Of course not. You trust the people you know…<em>your</em> social network, and so any of the chatter from their social network has no value for you. It’s meaningless chatter. Just like most people’s Tweets on Twitter.  In a larger sense, this <strong>opaque value problem</strong> affects most social software. Twitter, MySpace, Facebook, most social software is built around providing personalized, socially-focused conversation. It’s person-centered and as a result is difficult for anybody but that person to really appreciate: the value becomes opaque in this way. Designing social software is going to be very difficult. The designers won’t be able to put themselves into a position of someone who wants to keep up to date with their social network, which is something that all of these sites are doing.</em></p></blockquote>
<p>What the excerpt from the original blog clearly states is that a person using a social software has his/her own reasons to do so. The fact that the others don&#8217;t know what value the other person sees in a social network is the entire basis behind social software. I may log into myspace to chat with my peer group, but I dont know what my friend X does in her network, so what do I do ? I snoop around their profiles and walls to get a glimpse of their world coz her value from the network is opaque to me .</p>
<p>The goal of social software is evolve from this paradigm to a more productive one. Efforts are on to make social software enter the productivity space and that too with good success. Based on all of these observations, how do you design for a social concept. How do we actually add value to the users ? Its not easy to please everyone, but at least if the majority is kept happy, you can be sure of winning product.</p>
]]></content:encoded>
			<wfw:commentRss>http://riteshnayak.com/blog/2007/07/02/social-design-and-the-opaque-value-problem/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rules for high performance websites</title>
		<link>http://riteshnayak.com/blog/2007/06/07/rules-for-high-performance-websites/</link>
		<comments>http://riteshnayak.com/blog/2007/06/07/rules-for-high-performance-websites/#comments</comments>
		<pubDate>Thu, 07 Jun 2007 06:57:36 +0000</pubDate>
		<dc:creator>Ritesh</dc:creator>
				<category><![CDATA[Architecture - Design]]></category>
		<category><![CDATA[Suggested Reading]]></category>
		<category><![CDATA[rant]]></category>

		<guid isPermaLink="false">http://riteshnayak.com/blog/2007/06/07/rules-for-high-performance-websites/</guid>
		<description><![CDATA[My recent interest in building scalable applications has led me to learn a lot of simple yet effective programming and deployment techniques, to scale and deliver web apps with ease. Its not rocket science to build for scalability but it certainly gets challenging when your app really scales you come across problems about your environment, [...]]]></description>
			<content:encoded><![CDATA[<p>My recent interest in building scalable applications has led me to learn a lot of simple yet effective programming and deployment techniques, to scale and deliver web apps with ease. Its not rocket science to build for scalability but it certainly gets challenging when your app really scales you come across problems about your environment, unknown to you. Take for example our servers, since we host on shared environments our servers flush their memory contents every 24 hours or so. This is done to keep the discarded objects and dangling pointers from filling up the memory. But when did I figure this out, post deployment &#8211; what followed next was an analysis of all the problems that we were to face because of this new found wisdom. Truly, most of our so called cool functionality came crashing down like a hailstorm ( truth behind why Instant Messaging never got off the ground on <a href="http://samparkh.com" target="_blank">Samparkh</a> ). We did try to tailor the code and make it work, and it did too, but a problem like this requires a visit back to the drawing board. The next time we know better than to code with assumptions ; most of us aren&#8217;t lucky enough to know all about our deployment environments, so we make do with assumptions.</p>
<p>That was a lesson, no harm done, no money lost. But there are some applications that have to be delivered to be robust , scalable and always available. I found <a href="http://stevesouders.com/examples/rules.php" target="_blank">this article</a> which highlights some rules for high performance website. I suggest you visit this site and read about these rules, its worth it .</p>
<ul style="padding-top: 0px; margin-top: 4px; list-style-type: none; list-style-image: none; list-style-position: outside">
<li> <a href="http://stevesouders.com/examples/rule-min-http.php" class="noline">Rule 1 &#8211; Make Fewer HTTP Requests</a></li>
<li> <a href="http://stevesouders.com/examples/rule-cdn.php" class="noline">Rule 2 &#8211; Use a Content Delivery Network</a></li>
<li> <a href="http://stevesouders.com/examples/rule-expires.php" class="noline">Rule 3 &#8211; Add an Expires Header</a></li>
<li> <a href="http://stevesouders.com/examples/rule-gzip.php" class="noline">Rule 4 &#8211; Gzip Components</a></li>
<li> <a href="http://stevesouders.com/examples/rule-css-top.php" class="noline">Rule 5 &#8211; Put CSS at the Top</a></li>
<li> <a href="http://stevesouders.com/examples/rule-js-bottom.php" class="noline">Rule 6 &#8211; Move Scripts to the Bottom</a></li>
<li> <a href="http://stevesouders.com/examples/rule-expr.php" class="noline">Rule 7 &#8211; Avoid CSS Expressions</a></li>
<li> <a href="http://stevesouders.com/examples/rule-inline.php" class="noline">Rule 8 &#8211; Make JavaScript and CSS External</a></li>
<li> <a href="http://stevesouders.com/examples/rule-dns.php" class="noline">Rule 9 &#8211; Reduce DNS Lookups</a></li>
<li> <a href="http://stevesouders.com/examples/rule-minify.php" class="noline">Rule 10 &#8211; Minify JavaScript</a></li>
<li> <a href="http://stevesouders.com/examples/rule-redir.php" class="noline">Rule 11 &#8211; Avoid Redirects</a></li>
<li> <a href="http://stevesouders.com/examples/rule-js-dupes.php" class="noline">Rule 12 &#8211; Remove Duplicate Scripts</a></li>
<li> <a href="http://stevesouders.com/examples/rule-etags.php" class="noline">Rule 13 &#8211; Turn Off ETags</a></li>
<li> <a href="http://stevesouders.com/examples/rule-ajax.php" class="noline">Rule 14 &#8211; Make AJAX Cacheable and Small</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://riteshnayak.com/blog/2007/06/07/rules-for-high-performance-websites/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Infrastructure as a service</title>
		<link>http://riteshnayak.com/blog/2007/04/17/infrastructure-as-a-service/</link>
		<comments>http://riteshnayak.com/blog/2007/04/17/infrastructure-as-a-service/#comments</comments>
		<pubDate>Tue, 17 Apr 2007 12:28:42 +0000</pubDate>
		<dc:creator>Ritesh</dc:creator>
				<category><![CDATA[Architecture - Design]]></category>
		<category><![CDATA[Web 2.0]]></category>
		<category><![CDATA[gyaan]]></category>
		<category><![CDATA[rant]]></category>

		<guid isPermaLink="false">http://riteshnayak.com/blog/2007/04/17/infrastructure-as-a-service/</guid>
		<description><![CDATA[I just read an article from the web2.0 expo where Jeff Bezos of Amazon gave a talk on how Amazons S3 service , which essentially allows you to use Amazon&#8217;s servers as  your data store, crossed 2 Billion stored objects. For a meager sum of money you get the scalability and the reliability of [...]]]></description>
			<content:encoded><![CDATA[<p>I just read an article from the web2.0 expo where Jeff Bezos of Amazon gave a talk on how <a href="http://aws.amazon.com/s3" target="_blank">Amazons S3 service</a> , which essentially allows you to use Amazon&#8217;s servers as  your data store, crossed 2 Billion stored objects. For a meager sum of money you get the scalability and the reliability of Amazons servers, basically the same architecture Amazons own services are based on. Thats where he announced &#8220;<span style="color: #3333ff">Infrastructure as a service has arrived</span>&#8221;</p>
<p>I did some research on S3 sometime back when I intended to use it for some project, and found it really compelling to use. There were lot of problems reported by users and some outages also which hampered lot of sites who depended completely on S3. There is also the problem that your traditional taxonomic structure that you were working on will now be replaced by a Hashtable like datastore that you essentially query. I found it a great way to store shared media, photos and other non text based information and rightly so. S3 fits in as a replacement to a database in the more traditional sense, but it has its own limitations, but its power nevertheless.<br />
So what is this IAAS( see title) , according to me its the <a href="http://feeds.feedburner.com/%7Er/OmMalik/%7E3/108156740/" target="_blank">death of the network engineer</a>.Gone are those days when you would rent our servers and rope in DBA&#8217;s and Network engg who would manage the hardware and availability part of your application. You want unlimited computational scalability? try <a href="http://www.mediatemple.net/webhosting/gs/" target="_blank">mediaTemple&#8217;s Grid server</a>, want unlimited datastore? try <a href="http://aws.amazon.com/s3" target="_blank">S3</a>, want scalable content delivery? try <a href="http://www.akamai.com/html/technology/edgeplatform.html" target="_blank">Akamai Edge</a>. Infrastructure management is at an all time low in the 2.0 era, especially since technology is more easily available , manageable and scalable. Infrastructure is also turning into another SOA where pre built components define how you develop and deploy your applications and you don&#8217;t have to worry about downtimes, reliability, scalability and other metrics that are considered important for any web service.<br />
Whenever such disparate elements contribute to a unified cause the next step isÂ  consolidation. But will it ever happen ? these service providers bank on the fact that you need these systems to run your application, otherwise you wouldn&#8217;t need a database or a blade server. Have services like S3 given companies like oracle a run for their money? Will there be a similar offering from the other majors?<br />
Picture Oracle providing database hosting on their enterprise level infrastructure for a minimal cost. Updates and upgrades done automatically, maintenance not a pain anymore. Its a space worth debating on and worth watching out for.</p>
]]></content:encoded>
			<wfw:commentRss>http://riteshnayak.com/blog/2007/04/17/infrastructure-as-a-service/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Web Application Security &#8211; Part 1</title>
		<link>http://riteshnayak.com/blog/2007/04/12/web-application-security-part-1/</link>
		<comments>http://riteshnayak.com/blog/2007/04/12/web-application-security-part-1/#comments</comments>
		<pubDate>Thu, 12 Apr 2007 06:19:22 +0000</pubDate>
		<dc:creator>Ritesh</dc:creator>
				<category><![CDATA[Architecture - Design]]></category>
		<category><![CDATA[gyaan]]></category>

		<guid isPermaLink="false">http://riteshnayak.com/blog/2007/04/12/web-application-security-part-1/</guid>
		<description><![CDATA[Making web apps secure has been an effort ever since the advent of web
applications. The strange mix of technologies interwoven with the complexities of each one of them hasn&#8217;t encouraged the setting up of standards for these. Scripting hacks, Cookie hacks, cross site scripting, malicious users and other common problems plague web applications. If all [...]]]></description>
			<content:encoded><![CDATA[<p>Making web apps secure has been an effort ever since the advent of web<br />
applications. The strange mix of technologies interwoven with the complexities of each one of them hasn&#8217;t encouraged the setting up of standards for these. Scripting hacks, Cookie hacks, cross site scripting, malicious users and other common problems plague web applications. If all these aren&#8217;t enough, you have denial of service and other scalability problems. There are just a handful of best practices and tips that you could follow to make your web applications more secure. I shall list some elements down from my experiences.<br />&nbsp;<br />&nbsp;&nbsp; <b>1</b>. <b>Validate all data that goes that goes to the server</b><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Make sure you validate all the data that goes through the browser, it could be forms you are submitting with critical data or some event like clicking a link. Make sure your dataset that the server receives is what it is intended to receive. In case of bot threats, use captcha&#8217;s and simple questions that require human intelligence and natural language processing. By validating data, you are just saving yourself that many less attacks on your server. </p>
<p>&nbsp; <b>2.&nbsp; Use your JS wisely </b><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  I have seen a lot of apps currently using a wealth of js libraries, and since your js needs url to access, the XMLHttpRequest object with its url is wide open for the entire world to see. You dont even need to look at the source , with a sniffer like firebug, you can see all the async requests made, with the url and the response. Scripting attacks are the most prevalent of the security attacks and people can do wonders with malicious scripts. The trick here would be to confuse the hackers. <a href="http://en.wikipedia.org/wiki/Obfuscate">Obfuscate</a> the scripts wherever you can, there are good JS obfuscating libraries available. Be advised , obfuscation is usually irreversible , so use it wisely. Use POST instead of GET for async requests and make sure its the right person requesting the data. You could probably generate a sessionid of sorts on the server end and pass it to the browsers as a key to use for any further requests. And please, don&#8217;t rely on cookies, they can only go this far. </p>
<p>&nbsp; <b>3. Follow the MVC methodology</b><br />&nbsp; &nbsp; &nbsp; it usually helps in abstracting the finer points of the application. Separating out the data, logic and accessibility will usually give you more control on what goes where and a lot of server side validation. </p>
<p>&nbsp; <b>4. SQL Injection </b><br />&nbsp;&nbsp; I understood the <a href="http://www.unixwiz.net/techtips/sql-injection.html">complexity behind these attacks</a> only recently. A seemingly simple line of DB code could prove disastrous for applications. Always use good wrappers around your db code. Many good SQL Helper libraries help you against such attacks and the overhead is adding another server side library, which is not so big considering it can save your application.</p>
<p>&nbsp;There is also the new generation of security threats thanks to Ajax and is open ways. But there are safer alternatives being developed like <a href="http://json.org/JSONRequest.html">JSONRequest </a>which abstracts the JSON based calls&nbsp; and provides a safe way of making sync calls. </p>
<p>&nbsp; I shall write more about web based security when I get time.</p>
]]></content:encoded>
			<wfw:commentRss>http://riteshnayak.com/blog/2007/04/12/web-application-security-part-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hadoop &#8211; Open source DFS and Cluster technology</title>
		<link>http://riteshnayak.com/blog/2007/04/06/hadoop-open-source-dfs-and-cluster-technology/</link>
		<comments>http://riteshnayak.com/blog/2007/04/06/hadoop-open-source-dfs-and-cluster-technology/#comments</comments>
		<pubDate>Fri, 06 Apr 2007 05:25:08 +0000</pubDate>
		<dc:creator>Ritesh</dc:creator>
				<category><![CDATA[Architecture - Design]]></category>
		<category><![CDATA[Web 2.0]]></category>

		<guid isPermaLink="false">http://riteshnayak.com/blog/2007/04/06/hadoop-open-source-dfs-and-cluster-technology/</guid>
		<description><![CDATA[
I remember studying Advanced computer architecture and parallel computers in college. Just the sheer size and complexity of the book gave me nightmares. But lately, I have become interested in the field of Scalable programming, application clustering and parallelization. One of the reasons, I lost out qualifying for the Google Code Jam was because my [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://lucene.apache.org/hadoop/" target="_blank"><img src="http://lucene.apache.org/hadoop/images/hadoop-logo.jpg" height="71" width="300" /></a></p>
<p>I remember studying Advanced computer architecture and parallel computers in college. Just the sheer size and complexity of the book gave me nightmares. But lately, I have become interested in the field of Scalable programming, application clustering and parallelization. One of the reasons, I lost out qualifying for the Google Code Jam was because my algorithm wouldn&#8217;t scale, the logic was pretty correct though. And now, after almost two years of my tryst with building a web app and watching it crash before ourÂ  very eyes has given me the understanding of why its so important to build good scalable applications.</p>
<p>Now scalability can happen at many layers, the code, the design / architecture and also hardware, the last one being the easiest  &#8211; more power. But the first and more importantly the second make up for all the pain. Developing scalable code has been discussed a million times with lots of tricks on efficient memory usage,controlling memory leaks, serialization and the critical section problem but those scale only to a certain point.</p>
<p>At barcamp, the <a href="http://bangalore.yahoo.com/rand.html" target="_blank">Yahoo</a> team presented <a href="http://lucene.apache.org/hadoop/" target="_blank">Hadoop</a>. A distributed file system plus a parallelization  framework that can be built for very computation intensive applications. The framework provides api&#8217;s that you can use to parallelize your tasks, store in a distributed way and more. There has been an upsurge in people developing processor and memory intensive applications, mainly due to the growth of concepts like crawling, semantic web etc. The 2.0 moguls who are trying to build new age crawlers, and indexers with a niche like social media, photos or videos will be the ones actually interested in these frameworks.</p>
<p>So how easy is it? Take a big bunch of machines with a 2GHZ processors ( considered outdated) ; must not cost you more than 6-8k a piece, add to each box 2 * 40 Gb hardisks, That you can pick up for almost 1k a piece. Install a stable flavor of Linux , put them on a network and your done!! So a 7 processor server grid with almost 1/2 Tb of storage will cost you in the order of Rs 60,000 , the price of a good laptop. Also for those who have startups, the hardware is already there, you just need the right software. You can use your existing resources to run a massive computation engine, typically in the nights when there is no work being done.</p>
<p>There is respite for folks who use windows, MS has made it extremely easy to achieve grid computing with their <a href="http://www.microsoft.com/windowsserver2003/ccs/overview.mspx" target="_blank">Compute Cluster Product</a>. Whats more, its MS so it will be easy to install, with a lot of documentation and visual studio plugins for execution, profiling and debugging. Comes at a price though, but the results that it can achieve are tremendous.</p>
<p>Its almost like we have come full circle, we go on from these core concepts in the pre web era and now we are back to where we started with these. For more resources on cluster computing go here</p>
<p><a href="http://www.clustermonkey.net/" target="_blank">Â  http://www.clustermonkey.net/</a></p>
<p><a href="http://www.beowulf.org/community/index.html" target="_blank">http://www.beowulf.org/community/index.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://riteshnayak.com/blog/2007/04/06/hadoop-open-source-dfs-and-cluster-technology/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tips on Usability</title>
		<link>http://riteshnayak.com/blog/2007/04/01/tips-on-usability/</link>
		<comments>http://riteshnayak.com/blog/2007/04/01/tips-on-usability/#comments</comments>
		<pubDate>Sun, 01 Apr 2007 10:47:08 +0000</pubDate>
		<dc:creator>Ritesh</dc:creator>
				<category><![CDATA[Architecture - Design]]></category>
		<category><![CDATA[Tips,Tricks and code]]></category>
		<category><![CDATA[gyaan]]></category>

		<guid isPermaLink="false">http://riteshnayak.com/blog/2007/04/01/tips-on-usability/</guid>
		<description><![CDATA[This was the presentation given on usability of websites , there are some basic tips that you must read.
1 . anticipate what the users expect and provide those features.
2.  Autonomy : giving the users a sense of mastery. and providing status messages.
3. don&#8217;t rely only on colors , many are color blind
4. consistent commands [...]]]></description>
			<content:encoded><![CDATA[<p>This was the presentation given on usability of websites , there are some basic tips that you must read.</p>
<p>1 . anticipate what the users expect and provide those features.<br />
2.  Autonomy : giving the users a sense of mastery. and providing status messages.<br />
3. don&#8217;t rely only on colors , many are color blind<br />
4. consistent commands and shortcuts. don&#8217;t change usage patterns and standard shortcuts</p>
<p>In house consistency and maintaining the template across your application<br />
common icons<br />
use inconsistency when necessary, like when you need more marketing attention. change the login space to somewhere else<br />
5. worry about users productivity , not yours, give easily manageable patterns.<br />
6. clear help messages. use the keywords first and emphasize<br />
7. explorable interfaces with colorful icons and images.<br />
give users stable perpetual cues for the sense of home<br />
make actions reversible, example gmails messages.<br />
8. Fitt&#8217;s law : the time to acquire a target is a function of the distance to and the size of the target.<br />
corners of the screen are the most easily accessed.<br />
large objects, images for important actions.<br />
9. push latency to the background and reduce latency<br />
visual feedback &#8211; for background activities, typically for ajax writebacks and DOM changes.<br />
Indicate the potential length of the wait, if you can .<br />
8. metaphors.<br />
9 . imporve readability y using contrasting fonts and colors.<br />
8. track the state of users behavior.<br />
10. give visual navigation wherever possible.</p>
<p>this was a live blog. my first live blog.</p>
]]></content:encoded>
			<wfw:commentRss>http://riteshnayak.com/blog/2007/04/01/tips-on-usability/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Navigation management in Ajax Apps</title>
		<link>http://riteshnayak.com/blog/2007/02/25/navigation-management-in-ajax-apps/</link>
		<comments>http://riteshnayak.com/blog/2007/02/25/navigation-management-in-ajax-apps/#comments</comments>
		<pubDate>Sun, 25 Feb 2007 18:04:35 +0000</pubDate>
		<dc:creator>Ritesh</dc:creator>
				<category><![CDATA[Architecture - Design]]></category>
		<category><![CDATA[Web 2.0]]></category>

		<guid isPermaLink="false">http://riteshnayak.com/blog/2007/02/25/navigation-management-in-ajax-apps/</guid>
		<description><![CDATA[[digg=http://digg.com/programming/Navigation_in_Ajax_Apps]There are a lot problems that Ajaxifying a site presents and one of them is navigation control. Bookmarking and the back button functionality namely the user behavior when using a browser have been around since the early days of the browser. With the advent of Rich applications and more Ajax, the concept of browser navigation [...]]]></description>
			<content:encoded><![CDATA[<p>[digg=http://digg.com/programming/Navigation_in_Ajax_Apps]There are a lot problems that Ajaxifying a site presents and one of them is navigation control. Bookmarking and the back button functionality namely the user behavior when using a browser have been around since the early days of the browser. With the advent of Rich applications and more Ajax, the concept of browser navigation is challenged. <a href="http://gmail.com" target="_blank">Gmail </a>did a god job of navigation control, though I still remember struggling during its early days wondering why the back button wouldnt work.</p>
<p>Whilst coding some of my infant steps in Ajax, I looked around for hacks to the back and the refresh button functionality but was unable to find any <img src='http://riteshnayak.com/blog/wp-includes/images/smilies/icon_sad.gif' alt=':-(' class='wp-smiley' />  . Thankfully I did read some useful pointers about hacks on the navigation front from <a href="http://www.onjava.com/pub/a/onjava/2005/10/26/ajax-handling-bookmarks-and-back-button.html" target="_blank">Brad Neuberg</a>( thanks <a href="http://yuiblog.com/" target="_blank">YUI blog</a> for getting me back to <a href="http://www.onjava.com/pub/a/onjava/2005/10/26/ajax-handling-bookmarks-and-back-button.html" target="_blank">this article</a>). Even a old school article about <a href="http://dev2dev.bea.com/pub/a/2006/01/ajax-back-button.html" target="_blank">how not to disrupt user behavior when developing Rich apps</a>.</p>
<p>But there is hope in the horizon and a new addition to the recently released YUI v2.2.0 intends to do just that. The new version of YUI has<a href="http://developer.yahoo.com/yui/history/" target="_blank"> browser history manager</a>, a simple library that helps in developing rich apps, all ajaxified, yet maintaining the traditional behaviors like bookmarks and navigation. Its still experimental, but worth a look if you are trying to break that browser history barrier.</p>
<p><a href="http://http://developer.yahoo.com/yui/download/" target="_blank"><img src="http://us.i1.yimg.com/us.yimg.com/i/ydn/yuiweb/download_1.gif" height="23" width="108" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://riteshnayak.com/blog/2007/02/25/navigation-management-in-ajax-apps/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Internationalization of websites</title>
		<link>http://riteshnayak.com/blog/2007/02/24/internationalization-of-websites/</link>
		<comments>http://riteshnayak.com/blog/2007/02/24/internationalization-of-websites/#comments</comments>
		<pubDate>Sat, 24 Feb 2007 13:22:50 +0000</pubDate>
		<dc:creator>Ritesh</dc:creator>
				<category><![CDATA[Architecture - Design]]></category>
		<category><![CDATA[rant]]></category>

		<guid isPermaLink="false">http://riteshnayak.com/blog/2007/02/24/internationalization-of-websites/</guid>
		<description><![CDATA[Update : Google Desktop, Google&#8217;s Blogger have been updated to support 29 languages. Blogger even lets you blog in hindi by converting english letter equivalents to hindi letters on the fly.
Almost all of my favorite websites, be it flickr, meebo or more recently gdocs, have been internationalized to more than one language. As internet defines [...]]]></description>
			<content:encoded><![CDATA[<p><em>Update : Google Desktop, Google&#8217;s Blogger have been updated to support 29 languages. Blogger even lets you blog in hindi by converting english letter equivalents to hindi letters on the fly.</em></p>
<p>Almost all of my favorite websites, be it <a href="http://flickr.com" target="_blank">flickr</a>, <a href="http://meebo.com" target="_blank">meebo</a> or more recently <a href="http://docs.google.com" target="_blank">gdocs</a>, have been internationalized to more than one language. As internet defines a truly global network, it just makes sense that a popular service must support more languages for people in countries like Russia, Germany or France to use.</p>
<p>Though most of these internationalization happens through wikis and tools, I don&#8217;t think they really cling on to the colloquial essence of the language, which is generally more acceptable. The problem lies in the dual paradigm that in most languages in inherent, one being the speaking or more familiar part of the language and the other being the official part of the language. Take any Indian language for example, I know Tamil and am fluent in conversing, but I cannot understand a single word in any of the news channel. The language on news channel is more of the official type, with official words, one that you would find in government forms or letters. Its understood most of the languages have this dual paradigm and most website functionalities point towards the official language. Clearly people cannot connect to that language on the official level, try localizing your phone and you will find yourself struggling to change the setting back.</p>
<p>Isn&#8217;t it a waste of time internationalizing a site and not allowing relevant people to relate to it? I see this becoming a profession for many a people , as internationalization becomes a necessity for any site. The trick will be to develop it with a sound understanding of the local (s)language and provide more familiar words than to confuse a person with official gibberish. Even developing applications will require forethought about internationalization and certain design patterns have to be applied to display and internationalize a site with least possible effort. I am aware of such patterns and methodologies but haven&#8217;t really seen them being standardized or used appropriately. Its catching on and pretty fast !!</p>
]]></content:encoded>
			<wfw:commentRss>http://riteshnayak.com/blog/2007/02/24/internationalization-of-websites/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Microsoft Launches Windows Multipoint CTP</title>
		<link>http://riteshnayak.com/blog/2007/02/07/microsoft-launches-windows-multipoint-ctp/</link>
		<comments>http://riteshnayak.com/blog/2007/02/07/microsoft-launches-windows-multipoint-ctp/#comments</comments>
		<pubDate>Wed, 07 Feb 2007 12:02:30 +0000</pubDate>
		<dc:creator>Ritesh</dc:creator>
				<category><![CDATA[Architecture - Design]]></category>
		<category><![CDATA[Web News]]></category>

		<guid isPermaLink="false">http://riteshnayak.com/blog/2007/02/07/microsoft-launches-windows-multipoint-ctp/</guid>
		<description><![CDATA[Collaboration is the future, more and more apps are going the collaborative way with people finding new uses for almost every other collaborative app, take Jot for example. Well when there are so many innovations happening in the web front, progress certainly hasn&#8217;t stopped on the desktop front. Microsoft has just released Multipoint CTP, A [...]]]></description>
			<content:encoded><![CDATA[<p>Collaboration is the future, more and more apps are going the collaborative way with people finding new uses for almost every other collaborative app, take Jot for example. Well when there are so many innovations happening in the web front, progress certainly hasn&#8217;t stopped on the desktop front. Microsoft has just <a href="http://www.microsoft.com/presspass/features/2006/dec06/12-14MultiPoint.mspx">released Multipoint CTP</a>, A novel concept in which multiple users can use multiple mouses on a single computer.</p>
<p>Educators and teachers in under developed countries suffer a poor a student to PC ratio and this technology will enable them to make any students work together on a single PC. All you have to do is buy USB slots and more mice, the technology will provide distinct colored mouse pointers ont eh screen for each mouse. Students can then work on a collborative enviroment, porbably on a quiz, a puzzle, a paintingÂ  or a game of some sort.</p>
<p>A SDK is also ready to let people harness this technology and is available for download here. If you feel your application is something that can work better in such an environment then go ahead. The scheduled release date is sometime in May.</p>
<p><img src="http://www.microsoft.com/presspass/images/features/2006/12-14kidswinmultipoint_sm.jpg" /></p>
]]></content:encoded>
			<wfw:commentRss>http://riteshnayak.com/blog/2007/02/07/microsoft-launches-windows-multipoint-ctp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

