<?xml version="1.0" encoding="ISO-8859-1"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title>Srikanth Nori</title>
<description>Site.BlogIt-Admin</description>
<link>http://www.srikanthnv.net/index.php?n=Site.BlogIt-Admin?action=rss</link>
<lastBuildDate>Sat, 25 May 2013 23:33:00 GMT</lastBuildDate>
<item>
<author>srikanth</author>
<link>http://www.srikanthnv.net/index.php?n=Blog.Configuration-Files?when=2013-02-18T02:58:39Z</link>
<title>Blog / Configuration Files</title>
<dc:date>2013-02-18T02:57:00Z</dc:date>
<pubDate>Mon, 18 Feb 2013 02:57:00 GMT</pubDate>
<description><![CDATA[<p>I've just put up all the config files I use at <a class='urllink' href='https://github.com/srikanthnv/Config' rel='nofollow'>https://github.com/srikanthnv/Config</a>.
</p>
<p class='vspace'>I'm not particularly proud of the .vimrcs. They're a giant mess, as of now. I should clean them up into one good one soon. 
</p>
]]></description></item>
<item>
<author>srikanth</author>
<link>http://www.srikanthnv.net/index.php?n=Blog.Site-updates?when=2013-02-18T02:56:39Z</link>
<title>Blog / Site updates</title>
<dc:date>2013-02-18T02:54:00Z</dc:date>
<pubDate>Mon, 18 Feb 2013 02:54:00 GMT</pubDate>
<description><![CDATA[<p>In case anyone's noticed, I changed a couple of things.
</p>
<p class='vspace'>I just realized that all the comments were chock full of spam, so I erased all of them and I've put a captcha in place. Sorry about that.
</p>
<p class='vspace'>There's also a git script thingy running in the background to upload my entire site to a remote git server. If anyone's interested, let me know and I can put the script up. It's pretty trivial, though.
</p>
]]></description></item>
<item>
<author>srikanth</author>
<link>http://www.srikanthnv.net/index.php?n=Blog.Visually-navigate-through-dependencies-between-RFCs?when=2013-02-11T21:30:02Z</link>
<title>Blog / Visually navigate through dependencies between RFCs</title>
<dc:date>2013-02-08T18:37:00Z</dc:date>
<pubDate>Fri, 08 Feb 2013 18:37:00 GMT</pubDate>
<description><![CDATA[<p>Here's a small side project I've been working on for the past couple of days. Hopefully, this is almost done.
</p>
<p class='vspace'><a class='urllink' href='http://www.srikanthnv.net/rfc_viz/' rel='nofollow'>http://www.srikanthnv.net/rfc_viz/</a> 
</p>
<p class='vspace'>Visually Navigate through the dependencies between RFCs
</p>
]]></description></item>
<item>
<author>srikanth</author>
<link>http://www.srikanthnv.net/index.php?n=Blog.Git-cheatsheet?when=2013-02-18T02:53:54Z</link>
<title>Blog / git cheatsheet</title>
<dc:date>2012-09-06T01:18:00Z</dc:date>
<pubDate>Thu, 06 Sep 2012 01:18:00 GMT</pubDate>
<description><![CDATA[<p>Here's a cheatsheet of a few git commands I find useful. Nothing revolutionary, just the absolute basics:
</p>
<p class='vspace'><span style='font-size:144%'>Client commands</span>
</p>
<p class='vspace'>Setup
</p><pre> git config --global user.name "Firstname Lastname"
 git config --global user.email "user@example.com"
</pre><p class='vspace'><a name='break' id='break'></a>
</p>
<p class='vspace'>Clone a new remote repository
</p><pre> git clone git_user_on_server@this.is.server.net: /full/path/to/repository/on/server.git local_directory
</pre><p class='vspace'>Clone a new remote repository WITHOUT any files
</p><pre> git clone --no-checkout git_user_on_server@this.is.server.net: /path/on/server.git local_directory
</pre><p class='vspace'>Create a new local branch
</p><pre> git branch -b new_local_branch_name
</pre><p class='vspace'>Delete an existing local branch
</p><pre> git branch -d local_branch_name
</pre><p class='vspace'>Delete local branch and lose all unmerged changes
</p><pre> git branch -D local_branch_name
</pre><p class='vspace'>Create new local branch to track a remote branch
</p><pre> git checkout --track -b new_local_branch_name remotes/origin/remote_branch_name
</pre><p class='vspace'>Switch to a branch
</p><pre> git checkout branchname
</pre><p class='vspace'>Push existing local branch to remote
</p><pre> git checkout branchname
 git push branchname new_remote_branch_name
</pre><p class='vspace'>Delete branch from remote (you have to discard local commits manually)
</p><pre> git push branchname :remote_branch_name
</pre><p class='vspace'>List all local branches
</p><pre> git branch -l
</pre><p class='vspace'>List all remote branches
</p><pre> git branch -r
</pre><p class='vspace'>List all branches
</p><pre> git branch -a
</pre><p class='vspace'>Switch to a remote branch
</p><pre> git checkout remotes/origin/branchname
</pre><p class='vspace'>Diff with last committed version:
</p><pre> git diff ./path/to/file.c
</pre><p class='vspace'>Overwrite with last committed version:
</p><pre> git checkout ./path/to/file.c
</pre><p class='vspace'>Add file to index (must be committed later)
</p><pre> git add ./path/to/new/file.c
</pre><p class='vspace'>Remove file from index (must be committed later)
</p><pre> git rm ./path/to/old/file.c
</pre><p class='vspace'>Check status of repository
</p><pre> git status
</pre><p class='vspace'>Commit changes
</p><pre> git commit

 # Commit with commit message inline
 git commit -m "commit message"
</pre><p class='vspace'>Push committed changes from local to remote
</p><pre> git push origin &lt;branchname&gt;
</pre><p class='vspace'>Discard local commits and resync with remote
</p><pre> git reset HEAD ./path/to/file.c
</pre><p class='vspace'>Graph branches
</p><pre> git log --graph --all
 git log --graph --format=oneline --all
</pre><p class='vspace'><span style='font-size:144%'>Server commands</span>
</p>
<p class='vspace'>Create a git 'remote' repository
</p><pre> sudo su - gituser
 cd git/root/dir
 mkdir repo.git
 cd repo.git
 git --bare init
 git config core.sharedrepository 1
 git config receive.denyNonFastforwards true
 find objects -type d -exec chmod 02770 {} \;
</pre><p class='vspace'>Mirror a bare remote repository to another remote repository
</p><pre> sudo su - gituser
 cd git/root/dir
 git clone --mirror user@remote-repo
</pre><p class='vspace'>Periodically update the mirrored repository
</p><pre> git fetch --all [-q]
</pre><p class='vspace'>Check if a repository is 'bare' or not
</p><pre> git rev-parse --is-bare-repository
</pre>
]]></description></item>
<item>
<author>srikanth</author>
<link>http://www.srikanthnv.net/index.php?n=Blog.Alternatives-to-the-Raspberry-Pi?when=2012-05-16T05:14:35Z</link>
<title>Blog / Alternatives to the Raspberry Pi</title>
<dc:date>2012-05-16T03:49:00Z</dc:date>
<pubDate>Wed, 16 May 2012 03:49:00 GMT</pubDate>
<description><![CDATA[<p>If you have been involved in amateur electronics in any way at all, or even just visited tech blogs/aggregators of late, you have probably heard of the <a class='urllink' href='http://www.raspberrypi.org/' rel='nofollow'>Raspberry Pi</a>. This amazing little device (now shipping for $35, eventually targeted to ship for $25) took the world by storm. Retailers were <a class='urllink' href='http://arstechnica.com/gadgets/2012/02/raspberry-pi-retailers-toppled-by-demand-as-35-linux-computer-launches/' rel='nofollow'>completely overwhelmed</a>, and The first <a class='urllink' href='http://arstechnica.com/gadgets/2012/04/delivery-begins-for-first-units-of-raspberry-pis-35-linux-computer/' rel='nofollow'>shipments finally went out</a> last month.
</p>
<p class='vspace'>
</p><hr />
<p class='vspace'><span style='font-size:120%'><strong>Money!</strong></span>
</p>
<p class='vspace'>Its popularity, of course, comes with good reason: The cost barrier for getting involved with embedded device programming has traditionally been pretty high. Getting involved with desktop development, web design, etc is pretty simple. All you need is motivation and time. Even getting involved with mobile app development is simple if you already have a smartphone. Plus, all these fields have a strong developer community so getting help and getting started is quite straightforward.
</p>
<p class='vspace'>The Raspberry Pi promises to change all that. The RPi foundation decided to price the boards at a ridiculously affordable rate. A USD 25/INR 1250 board is quite within the reach of people like me: i.e. It's something I could've afforded it back when I was in high school/college in India (if only it had been around back then!).  Opening up this industry to the entire world is going to be an absolute game changer. Developers the world over have already started coming up with really cool things, like a <a class='urllink' href='http://www.raspberrypi.org/archives/1185' rel='nofollow'>mind-controlled Lego NXT robot</a>! I, for one, can't wait to see what else people are going to think up.
</p>
<p class='vspace'><span style='font-size:120%'><strong>Community?</strong></span>
</p>
<p class='vspace'>That said, at the moment I am being cautious. What will really make a difference is going to be a strong developer community. Also, hopefully a lot of schools and colleges the world over are going to get students involved with development. I think the real growth of this device is going to kick off once the current demand for devices is met and enough people get involved in the entire field to create that community.
</p>
<div class='vspace'></div><hr />
<p class='vspace'>The Raspberry Pi is not the 'first' ever to do this kind of thing. Many organizations have tried to create such cheap devices and a lot of those exist in the market today. None of them are quite as cheap as the RPi of course but they do exist and can be very useful in their specific markets. 
</p>
<p class='vspace'>In fact, and now we get to the actual point of this article, I personally believe that having just "one device" for the whole world isn't really going to help. I'd love to see people start off with the RPi and then move on to other alternatives that are more suited to the application at hand. 
</p>
<p class='vspace'><span style='font-size:120%'><strong>Finally, the Alternatives</strong></span>
</p>
<p class='vspace'>Here are a few such alternatives to the Raspberry Pi. Most of these are targeted towards specific applications, which I've tried to describe. These are roughly in chronological order of when I heard of them, so the order is basically meaningless. 
</p>
<p class='vspace'>If you know of more, please email me (srikanthnv[at]gmail[dot]com) or leave a comment here and I'll add them to the list:
</p>
<p class='vspace'><span style='font-size:144%'><strong><a class='urllink' href='http://www.gumstix.org/' rel='nofollow'>Gumstix</a></strong></span>
</p>
<p class='vspace'>Not similar in terms of price, but very similar in terms of size. I first heard of this device way back in 2004 on <a class='urllink' href='http://developers.slashdot.org/story/04/01/28/1645213/a-linux-machine-for-your-collar' rel='nofollow'>slashdot</a>, when the editors really wanted to stick these device in your collar.  A tiny x86 device that could do all sorts of things that were almost unimaginable. 
</p>
<p class='vspace'>The Gumstix suite of devices is now huge and has all kinds of applications ranging from hobby stuff to education and infrastructure.
</p>
<p class='vspace'><span style='font-size:144%'><strong><a class='urllink' href='http://www.arduino.cc/' rel='nofollow'>Arduino</a></strong></span>
</p>
<p class='vspace'>Seemingly the favourite of people with artistic inclinations - this device has become very famous as the best way to interface the "real world" with computers.
</p>
<p class='vspace'><span style='font-size:144%'><strong><a class='urllink' href='http://beagleboard.org/' rel='nofollow'>Beagle Board</a></strong></span>
</p>
<p class='vspace'>The Beagle Board has a powerful OMAP 3 processor, making this ideal for multimedia applications - including entertainment, vision, robotics, etc. The Beagle Board did make a huge change in getting people involved with embedded. The $150 price was still high, but a far cry from the $500+ EVMs that were traditionally available. In a way this was the original Raspberry Pi.
</p>
<p class='vspace'>The <a class='urllink' href='http://beagleboard.org/bone' rel='nofollow'>BeagleBone</a> is a pared-down variant of the Beagleboard. At $90, this is definitely more approachable for beginners.
</p>
<p class='vspace'><span style='font-size:144%'><strong><a class='urllink' href='http://pandaboard.org/' rel='nofollow'>Panda Board</a></strong></span>
</p>
<p class='vspace'>Beagle board on steroids. Features the OMAP4 and the board of choice for HD entertainment, stereo/3d vision applications, etc.
</p>
]]></description></item>
<item>
<author>srikanth</author>
<link>http://www.srikanthnv.net/index.php?n=Blog.Installing-TinyOS-from-the-TinyProd-repositories?when=2013-03-01T21:52:44Z</link>
<title>Blog / Installing TinyOS from the TinyProd repositories</title>
<dc:date>2012-02-14T23:56:00Z</dc:date>
<pubDate>Tue, 14 Feb 2012 23:56:00 GMT</pubDate>
<description><![CDATA[<p>Instructions for setting up the latest TinyOS from the tinyprod repositories on Ubuntu 11.10.
</p>
<p class='vspace'>Updated on 1st March 2013
</p>
<p class='vspace'>
</p>
<p class='vspace'>These instructions are modified from the ones here to reflect what I actually did:
</p><ul><li><a class='urllink' href='http://tinyprod.net/repos/debian/' rel='nofollow'>http://tinyprod.net/repos/debian/</a>
</li><li><a class='urllink' href='http://docs.tinyos.net/tinywiki/index.php/Installing_TinyOS_from_Source_on_Fedora_13_64bit' rel='nofollow'>http://docs.tinyos.net/tinywiki/index.php/Installing_TinyOS_from_Source_on_Fedora_13_64bit</a>
</li></ul><p class='vspace'><strong>Environment</strong>
</p>
<p class='vspace'>I'm using: 
</p><ul><li><a class='urllink' href='http://www.trendsigma.net/vmware/lubuntu1110t.html' rel='nofollow'>Lubuntu 11.10 virtual machine</a>, running under VMWare
</li></ul><pre class='escaped'>user@lubuntu:/$ cat /etc/lsb-release

DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=11.10
DISTRIB_CODENAME=oneiric
DISTRIB_DESCRIPTION="Ubuntu 11.10"@@

user@lubuntu:/$ uname -a

Linux lubuntu 3.0.0-12-generic #20-Ubuntu SMP Fri Oct 7 
14:50:42 UTC 2011 i686 i686 i386 GNU/Linux</pre>
<div class='vspace'></div><ul><li>Linux Mint
</li></ul><pre class='escaped'>$ cat /etc/lsb-release 
DISTRIB_ID=LinuxMint
DISTRIB_RELEASE=14
DISTRIB_CODENAME=nadia
DISTRIB_DESCRIPTION="Linux Mint 14 Nadia"
$ uname -a
Linux &lt;host&gt; 3.5.0-17-generic #28-Ubuntu SMP Tue Oct 9 19:31:23 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux</pre>
<p class='vspace'><strong>Prerequisites</strong>
</p>
<p class='vspace'>Make sure you have the following packages installed, if you don't, install them with:
</p><pre class='escaped'>
sudo apt-get install automake gcc g++ gcc-multilib g++-multilib python2.7-dev
</pre>
<p class='vspace'><strong>Setup instructions</strong>
</p>
<div class='vspace'></div><ul><li>Remove the previously installed tinyos packages:
</li></ul><div class='indent'><pre class='escaped'>
sudo dpkg -P `dpkg -l nesc '*tinyos*' | grep ^ii | awk '{ print $2 }' | xargs
</pre>
</div><ul><li>Add the following lines to /etc/apt/sources.list:
</li></ul><div class='indent'><pre class='escaped'>
deb http://tinyprod.net/repos/debian squeeze 
deb http://tinyprod.net/repos/debian msp430-46 main
</pre>
</div><ul><li>Install the new tinyos packages:
</li></ul><div class='indent'><pre class='escaped'>sudo apt-get update
sudo apt-get install nesc msp430-tinyos avr-tinyos tinyos-tools</pre>
</div><ul><li>Install subversion:
</li></ul><div class='indent'><pre class='escaped'>
sudo apt-get install subversion</pre>
</div><ul><li>Go to the directory where you want to get the TinyOS source
</li></ul><div class='indent'><pre class='escaped'>
cd /opt</pre>
</div><ul><li>Download the source and set dir name as you would like
</li></ul><div class='indent'><pre class='escaped'>svn checkout http://tinyos-main.googlecode.com/svn/trunk/ tinyos-main-read-only
mv tinyos-main-read-only tinyos-rev5889</pre>
</div><ul><li>Set up your environment - create a file called tinyos.sh with these commands adapted appropriately
</li></ul><div class='indent'><pre class='escaped'>#!/bin/sh
export TOSROOT=/opt/tinyos-rev5889
export TOSDIR=$TOSROOT/tos
export CLASSPATH=$TOSROOT/support/sdk/java/tinyos.jar:.
export MAKERULES=$TOSROOT/support/make/Makerules</pre>
</div><ul><li>Source this file to setup your environment
</li></ul><div class='indent'><pre class='escaped'>
. tinyos.sh</pre>
</div><ul><li>Build the tinyos tools
</li></ul><div class='indent'><pre class='escaped'>
cd $TOSROOT/tools/
./Bootstrap
cd platforms/mica/uisp;./bootstrap; cd $TOSROOT/tools/
./configure
make
sudo make install</pre>
</div><p class='vspace'>..and that's it! You should be good to go.
</p>
<p class='vspace'><strong>Bugs?</strong>
</p>
<p class='vspace'>Found issues with this guide? Let me know and I'll fix it. srikanthnv[at]gmail[dot]com
</p>
]]></description></item>
<item>
<author>srikanth</author>
<link>http://www.srikanthnv.net/index.php?n=Blog.Hacking-in-Cembedded-devices-tips-and-tricks?when=2012-02-10T22:03:23Z</link>
<title>Blog / Hacking in C/embedded devices - tips and tricks</title>
<dc:date>2012-02-10T21:37:00Z</dc:date>
<pubDate>Fri, 10 Feb 2012 21:37:00 GMT</pubDate>
<description><![CDATA[<p>This is a running collection of tips and tricks that I've picked up over time in C/C++ development on many devices. I expect this will be a live document that I will add to as I continue to work.
</p>
<div class='vspace'></div><h3>Who is this for?</h3>
<ul><li>General C developers
</li><li>Devs working in small (2-10) member teams
</li><li>Devs working with code that was handed down to them
</li><li>Devs working on embedded devices
</li></ul><div class='vspace'></div><h3>Who is this not for?</h3>
<ul><li>"Enterprise" scale software developers. Really - you probably need a lot more than this.
</li></ul><div class='vspace'></div><h3>The Info</h3>
<ul><li><strong>General C</strong>
<ul><li>C lets you obfuscate a lot of things - ranging from file names to variable names. Often times, code that is heavily optimized can be cryptic to read. As a rule of thumb, always prefer understandability over optimization. You are likely to rewrite/refactor code a million times - you will waste more time trying to figure out cryptic looking code than you will gain in efficiency.
</li><li>NEVER, EVER typecast. Every typecast is a disaster-during-development waiting to happen. 
</li></ul><div class='vspace'></div></li><li><strong>Software process/architecture</strong>
<ul><li>Always start with use cases. Understand your entire system later - first you need to understand how your users will interact with your system. Document them in detail.
</li><li>Whatever task you've set out to do, you probably don't know how to do it - yet. You will learn over time and any design you start out with will probably go wrong.  My advice: prototype. Always put together a quick-and-dirty demo before you sit down to iron out an architecture.
</li><li>Iron out an architecture. After you finish setting out the demo, step  back and create a design with a block diagram and clear APIs of each and every block. Double/triple-check your APIs for consistency. Use the use cases
</li><li>Create tests from your use cases first, and then add test cases from your architecture. Test for positive cases first. Maintain a regression test suite. If you think you don't have the time to do this - you will pay for it later.
</li><li>Schedule code reviews and stick to them. PLEASE.
</li><li>Maintain an issue tracker - preferably one that's integrated with your version control and e-mail system. Also ensure that reviews are part of your check-in process.
</li><li>Set aside time periodically to create a "getting started" guide - the guide should be good enough to get a complete newbie up to speed with development on your system.
</li></ul><div class='vspace'></div></li><li><strong>General Coding</strong>
<ul><li>Design, publish, and maintain a coding standard. If you don't want to roll your own then just steal the <a class='urllink' href='http://www.kernel.org/doc/Documentation/CodingStyle' rel='nofollow'>linux kernel coding guidelines</a>. 
</li></ul><div class='vspace'></div></li><li><strong>Dev/debug environments</strong>
<ul><li>Automate, automate, automate! C can become a very unmanageable beast if things are left to manual intervention. Make sure you can automate as many things as humanly possible. Everything from checkouts to builds to checkins to deployment to debugging - everything can be automated to some extent. Rule of thumb - if you do something more than 5 times, then you have a candidate for automation.
</li><li>Use an IDE! Do not attempt to use vim/emacs unless you have no other option. As a hardcore vim-junkie, I can tell you that you will save a huge amount of time if you figure out how to get an IDE to work with your code. Ideally, see if you can get Eclipse running for you, somehow.
</li><li>DO NOT start raw code development until you have a debugger. New platform? The first thing you should port (after porting your Linux Kernel onto it) is gdb!.
</li><li>Make sure your debug cycle is not overly complicated. You shouldn't have to take 20 minutes to test a single-line code change. Set up your environments such that you can deploy/test code in seconds. Do this EARLY in your development cycle.
</li></ul><div class='vspace'></div></li><li><strong>Hardware/setup</strong>
<ul><li>Make sure your entire team is either using the same hardware, or clearly knows the difference between their units. You may end up spending hours to figure out why only Raju Coder sees a bug and you don't if you don't do this. 
</li><li>Save the hardware! Use ESD protection and be careful with your devices. 
</li></ul></li></ul>
]]></description></item>
<item>
<author>srikanth</author>
<link>http://www.srikanthnv.net/index.php?n=Blog.Scribe?when=2012-02-10T21:31:18Z</link>
<title>Blog / Scribe</title>
<dc:date>2012-02-10T21:28:00Z</dc:date>
<pubDate>Fri, 10 Feb 2012 21:28:00 GMT</pubDate>
<description><![CDATA[<p>Check this out - me and a few other people put together a cool service called <a class='urllink' href='http://bit.ly/webscribe' rel='nofollow'>Scribe</a>! Scribe adds real-time speech transcription to a web-based video conferencing system.
</p>
<div class='vspace'></div><div class='indent'>We designed Scribe to enhance the conferencing experience for users collaborating across the world. With speech transcription, Scribe opens up a huge world of possibilities ranging from automatic text mining to event tracking and "minutes of the meeting" generation.
</div><p class='vspace'>See more at the <a class='urllink' href='http://bit.ly/webscribe' rel='nofollow'>Scribe</a> website.
</p>
]]></description></item>
<item>
<author>srikanth</author>
<link>http://www.srikanthnv.net/index.php?n=Blog.Engineering-and-programming-contests-list?when=2012-02-10T21:32:17Z</link>
<title>Blog / Engineering and programming contests list</title>
<dc:date>2012-01-05T06:50:00Z</dc:date>
<pubDate>Thu, 05 Jan 2012 06:50:00 GMT</pubDate>
<description><![CDATA[<p>A list of the engineering, design, etc contests that I know of here, for future reference.
</p>
<p class='vspace'>This focuses on contests that are among one or more of the following categories
</p><ul><li>Students/Corporates/non-students
</li><li>Allow international participation
</li><li>Have some kind of prize associated with them
</li></ul><p>
</p>
<p class='vspace'><span style='font-size:144%'>Engineering</span>
</p><ul><li><a class='urllink' href='http://www.ieeechangetheworld.org/' rel='nofollow'>IEEE Presidents Change the World competition</a>
</li><li><a class='urllink' href='http://www.systemseng.cornell.edu/intel/' rel='nofollow'>Intel/Cornell embedded design cup</a>
</li><li><a class='urllink' href='http://disneyimaginations.com/' rel='nofollow'>Disney Imagineering</a>
</li></ul><p class='vspace'><span style='font-size:144%'>Hack-a-thon style</span>
</p><ul><li><a class='urllink' href='http://trojanhack.co' rel='nofollow'>Trojan Hack</a>
</li></ul><p class='vspace'><span style='font-size:144%'>Programming</span>
</p><ul><li><a class='urllink' href='http://icpc.baylor.edu' rel='nofollow'>ACM ICPC</a> - The mother of all coding competitions and probably the single toughest and most prestigious in the world.
</li><li><a class='urllink' href='http://codesprint.interviewstreet.com' rel='nofollow'>CodeSprint</a>
</li><li><a class='urllink' href='https://www.facebook.com/hackercup' rel='nofollow'>Facebook Hacker Cup</a>
</li></ul><p class='vspace'><span style='font-size:120%'>Training/Practice for programming contests</span>
</p><ul><li><a class='urllink' href='http://acm.uva.es/problemset/' rel='nofollow'>UVA problem sets</a> 
</li><li><a class='urllink' href='http://projecteuler.net/' rel='nofollow'>Project Euler</a>
</li><li><a class='urllink' href='http://www.topcoder.com/' rel='nofollow'>TopCoder</a>
</li></ul><div class='vspace'></div>
]]></description></item>
<item>
<author>srikanth</author>
<link>http://www.srikanthnv.net/index.php?n=Blog.Summaries-BCP?when=2011-11-09T01:37:28Z</link>
<title>Blog / Paper summaries - BCP</title>
<dc:date>2011-11-09T01:03:00Z</dc:date>
<pubDate>Wed, 09 Nov 2011 01:03:00 GMT</pubDate>
<description><![CDATA[<h3>Intro</h3>
<p>This is a brief summary of <a class='urllink' href='http://anrg.usc.edu/~scott/papers/ipsn10.pdf' rel='nofollow'>"Routing Without Routes: The Backpressure Collection Protocol"</a>. 
</p>
<div class='vspace'></div><h3>Background</h3>
<p>Traditional routing protocols, such as <a class='urllink' href='http://en.wikipedia.org/wiki/Link-state_routing_protocol' rel='nofollow'>link state</a> or <a class='urllink' href='http://en.wikipedia.org/wiki/Distance-vector_routing_protocol' rel='nofollow'>distance vector</a> routing protocols work by explicitly calculating a route in the network from one node to another. 
</p>
<p class='vspace'>While these protocols work very well (as proven by the fact that they are deeply established in today's networks), they are not the "ideal" protocols for all network topologies. Specifically, they do not necessarily provide a globally optimum distribution of congestion in many-to-one transmission topologies, often leading to possible bottlenecks. 
</p>
<p class='vspace'>BCP is an implementation of Backpressure Routing - a completely different routing mechanism - for wireless sensor networks. BCP implements backpressure routing on wireless sensors to try to achieve the globally optimum distribution of traffic across the sensor network.
</p><div> <img width='600px' src='http://www.srikanthnv.net/uploads/Blog/bcp.png' alt='' title='' /></div>
<p>
The core concept behind Backpressure routing is simple. Consider a network where all the nodes (sources) are trying to send data to one of the nodes (a sink). This is a typical data collection application. Assuming all nodes are transmitting data at roughly equal rates and are overall transmitting data "faster" than the sink can process, it will soon reach a state where data is backlogged at each of the nodes. Also, the farther away a node is from the sink the more data is likely backlogged at that node.
</p>
<p class='vspace'>Now, if a congested node tries to send more and more data along the same path, it might cause congestion bottlenecks - leading to dropped packets. 
</p>
<p class='vspace'>However, instead, if the node sends data to a less-congested neighbour, who in-turn passes it on to a less-congested neighbour, and so on - chances are that the load will get evenly distributed over the network, and then data will eventually reach the sink. Any node that gets too heavily backlogged will be applying a "backpressure", and will not accept more data to forward.
</p>
<p class='vspace'>This is a bit of an over-simplification of Backpressure. A more rigorous mathematical treatment of this stochastic network optimization can be found under the general class of "Utility Optimal Lyapunov Networking" algorithms.
</p>
<div class='vspace'></div><h3>Overview of operation</h3>
<p>The "business logic" of BCP is elegantly simple.
</p><ul><li>Each node that has data to send calculates a weightage to each of its neighbours. It then sends to the best neighbour based on that weightage
<ul><li>The weightage is calculated as a combination of the link quality between the two nodes, and the queue size of that node. This is a critical part of BCP's operation. Details are in the paper.
</li><li>Nodes learn their neighbours backlogs by "snooping". Nodes listen to all nearby packet transmissions that contain the backlog. Nodes also disseminate their backlog so that other nodes can pick them up.
</li></ul></li></ul><p class='vspace'><strong>Work in progress</strong>
</p>
]]></description><dc:contributor>srikanth</dc:contributor>
</item>
</channel>
</rss>
