<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CUcDSX4yeCp7ImA9WhRbEUg.&quot;"><id>tag:blogger.com,1999:blog-9122784</id><updated>2012-02-02T08:54:38.090+05:30</updated><category term="Personal" /><category term="Social" /><category term="SQL" /><category term=".Net" /><category term="ClickOnce" /><category term="general" /><category term="Computing" /><category term="regex" /><category term="css" /><category term="Git" /><category term="User Experience" /><category term="Operating Systems" /><category term="Editors" /><category term="html" /><category term="Planning" /><category term="Networking" /><category term="Tools" /><category term="IronRuby" /><category term="MobileComputing" /><category term="Coding Practices" /><category term="Industrial Automation" /><category term="CodeCSharp" /><category term="Events" /><category term="Professional Life" /><category term=".NET 2.0" /><title>Sriharsha Vardhan</title><subtitle type="html">&lt;i&gt;[The views expressed on this website/blog are mine alone and do not necessarily reflect the views of my employer.]&lt;/i&gt;</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://sriharshavardhan.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://sriharshavardhan.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/9122784/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Sriharsha Vardhan</name><uri>https://profiles.google.com/100795286323098096475</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-WSRPdIrYars/AAAAAAAAAAI/AAAAAAAAAnQ/IB8E9VyRHns/s512-c/photo.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>166</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/SriharshaVardhan" /><feedburner:info uri="sriharshavardhan" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;D0IDSX4_fip7ImA9WhRWEEQ.&quot;"><id>tag:blogger.com,1999:blog-9122784.post-9217628509449052092</id><published>2011-12-28T19:17:00.000+05:30</published><updated>2011-12-28T23:36:18.046+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-28T23:36:18.046+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="html" /><category scheme="http://www.blogger.com/atom/ns#" term="css" /><title>adopting sass with Sinatra</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
I have been working on an embedded web application with Sinatra. I took enough care to keep css files clean and compact. But it is getting tougher with ever growing style sheets to be vigilant at all times. I heard about sass and less but never felt I would need such tools to handle styles. Today I could learn basics of Saas.&lt;br /&gt;
And now I regret for not adopting to such good frameworks from the beginning.&lt;br /&gt;
&lt;br /&gt;
Though less offers dynamic stylesheets, 32kb javascript is too much of a burden for my embedded&amp;nbsp;application.&lt;br /&gt;
As such I run a rake script to minify and compress markup and javascripts. I thought sass would be a better choice. I could simply run script to convert scss files to css.&lt;br /&gt;
&lt;br /&gt;
But it would not be so much so convenient during development to convert these scss files every now and then to css. But thanks to Rack and Sinatra it was really easy to integrate sass with existing app. &amp;nbsp;Here goes sinatra file.&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;span class="Include"&gt;require&lt;/span&gt; &lt;span class="Delimiter"&gt;'&lt;/span&gt;&lt;span class="String"&gt;sinatra&lt;/span&gt;&lt;span class="Delimiter"&gt;'&lt;/span&gt;
&lt;span class="Include"&gt;require&lt;/span&gt; &lt;span class="Delimiter"&gt;'&lt;/span&gt;&lt;span class="String"&gt;sass&lt;/span&gt;&lt;span class="Delimiter"&gt;'&lt;/span&gt;

get &lt;span class="Delimiter"&gt;'&lt;/span&gt;&lt;span class="String"&gt;/stylesheets/:name.css&lt;/span&gt;&lt;span class="Delimiter"&gt;'&lt;/span&gt; &lt;span class="Statement"&gt;do&lt;/span&gt;
  content_type &lt;span class="Delimiter"&gt;'&lt;/span&gt;&lt;span class="String"&gt;text/css&lt;/span&gt;&lt;span class="Delimiter"&gt;'&lt;/span&gt;, &lt;span class="Constant"&gt;:charset&lt;/span&gt; =&amp;gt; &lt;span class="Delimiter"&gt;'&lt;/span&gt;&lt;span class="String"&gt;utf-8&lt;/span&gt;&lt;span class="Delimiter"&gt;'&lt;/span&gt;
  filename = &lt;span class="Delimiter"&gt;"&lt;/span&gt;&lt;span class="Delimiter"&gt;#{&lt;/span&gt;params[&lt;span class="Constant"&gt;:name&lt;/span&gt;]&lt;span class="Delimiter"&gt;}&lt;/span&gt;&lt;span class="Delimiter"&gt;"&lt;/span&gt;
  render &lt;span class="Constant"&gt;:scss&lt;/span&gt;, filename.to_sym, &lt;span class="Constant"&gt;:layout&lt;/span&gt; =&amp;gt; &lt;span class="Boolean"&gt;false&lt;/span&gt;, &lt;span class="Constant"&gt;:views&lt;/span&gt; =&amp;gt; &lt;span class="Delimiter"&gt;'&lt;/span&gt;&lt;span class="String"&gt;./public/stylesheets&lt;/span&gt;&lt;span class="Delimiter"&gt;'&lt;/span&gt;
&lt;span class="Statement"&gt;end&lt;/span&gt;

get &lt;span class="Delimiter"&gt;'&lt;/span&gt;&lt;span class="String"&gt;/&lt;/span&gt;&lt;span class="Delimiter"&gt;'&lt;/span&gt; &lt;span class="Statement"&gt;do&lt;/span&gt;
  erb &lt;span class="Constant"&gt;:index&lt;/span&gt;
&lt;span class="Statement"&gt;end&lt;/span&gt;
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&amp;nbsp;Normally we don't need to write a get routine for resources in public folder. But in this case sass looks at "views" folder for scss files. Also during development it would be better if we could test actual css. Thus converting these scss files to css makes more sense. Now I can keep styles in more modular way using nice features of saas. Following two underscore files makes them&amp;nbsp;modular&amp;nbsp;as saas wont generate css for them&lt;br /&gt;
when they are imported.&lt;br /&gt;
&lt;br /&gt;
_s1.scss&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;span class="Special"&gt;#&lt;/span&gt;&lt;span class="Identifier"&gt;fullname&lt;/span&gt; &lt;span class="Function"&gt;{&lt;/span&gt;
  p:first-&lt;span class="Type"&gt;child&lt;/span&gt; &lt;span class="Function"&gt;{&lt;/span&gt;
    color : grey;
  &lt;span class="Function"&gt;}&lt;/span&gt;

  p:last-&lt;span class="Type"&gt;child&lt;/span&gt; &lt;span class="Function"&gt;{&lt;/span&gt;
    color : lightgrey;
  &lt;span class="Function"&gt;}&lt;/span&gt;
&lt;span class="Function"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;br /&gt;
_s2.scss
&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;span class="Special"&gt;#&lt;/span&gt;&lt;span class="Identifier"&gt;communication&lt;/span&gt; &lt;span class="Function"&gt;{&lt;/span&gt;
  p:first-&lt;span class="Type"&gt;child&lt;/span&gt; &lt;span class="Function"&gt;{&lt;/span&gt;
    color : red;
  &lt;span class="Function"&gt;}&lt;/span&gt;

  p:last-&lt;span class="Type"&gt;child&lt;/span&gt; &lt;span class="Function"&gt;{&lt;/span&gt;
    color : lightgrey;
  &lt;span class="Function"&gt;}&lt;/span&gt;
&lt;span class="Function"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
also theme.scss can be made with functions and using mixins&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
theme.scss
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre&gt;@function  contact_padding(&lt;span class="Identifier"&gt;$n&lt;/span&gt;) &lt;span class="Function"&gt;{&lt;/span&gt;
  @return (&lt;span class="Identifier"&gt;$n&lt;/span&gt; &lt;span class="Statement"&gt;*&lt;/span&gt; 3) &lt;span class="Special"&gt;+&lt;/span&gt; px;
&lt;span class="Function"&gt;}&lt;/span&gt;


&lt;span class="PreProc"&gt;@mixin&lt;/span&gt; contact(&lt;span class="Identifier"&gt;$bw&lt;/span&gt;, &lt;span class="Identifier"&gt;$bc&lt;/span&gt;) &lt;span class="Function"&gt;{&lt;/span&gt;
  &lt;span class="StorageClass"&gt;padding&lt;/span&gt;:contact_padding(&lt;span class="Identifier"&gt;$bw&lt;/span&gt;);
  &lt;span class="StorageClass"&gt;border&lt;/span&gt;: &lt;span class="Identifier"&gt;$bw&lt;/span&gt;+px &lt;span class="Type"&gt;solid&lt;/span&gt; &lt;span class="Identifier"&gt;$bc&lt;/span&gt;;
  &lt;span class="StorageClass"&gt;font-size&lt;/span&gt;:&lt;span class="Number"&gt;20px&lt;/span&gt;;
  &lt;span class="StorageClass"&gt;font-weight&lt;/span&gt;:&lt;span class="Type"&gt;bold&lt;/span&gt;;
&lt;span class="Function"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span style="color: #999999;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
Now all these are imported to common.scss as&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
common.scss&lt;/div&gt;
&lt;div&gt;
&lt;pre&gt;&lt;span class="Include"&gt;@import "s1", "s2", "theme";&lt;/span&gt;

&lt;span class="Special"&gt;.&lt;/span&gt;&lt;span class="Type"&gt;theme1&lt;/span&gt; &lt;span class="Function"&gt;{&lt;/span&gt;
  &lt;span class="PreProc"&gt;@include&lt;/span&gt; contact(&lt;span class="Number"&gt;2&lt;/span&gt;,orange);
&lt;span class="Function"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
Now when common.css is linked in html, sinatra does all hard work of importing and converting &amp;nbsp;before rendering css files.&lt;/div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
&lt;!--
pre { font-family: monospace; color: #ffffff; background-color: #002240; }
.sourcecode { font-family: monospace; color: #ffffff; background-color: #002240; }
.lnr { color: #7587a6; background-color: #000000; }
.Identifier { color: #7587a6; font-weight: bold; }
.String { color: #3ad900; }
.Type { color: #80ffbb; font-weight: bold; }
.PreProc { color: #8b864e; }
.Statement { color: #ff9d00; font-weight: bold; }
.Function { color: #ffad51; font-weight: bold; }
.Comment { color: #999999; font-style: italic; }
--&gt;
&lt;/style&gt;
&lt;br /&gt;
&lt;div class="sourcecode"&gt;
&lt;pre&gt;&lt;span class="Comment"&gt;&amp;lt;!DOCTYPE HTML&amp;gt;&lt;/span&gt;
&lt;span class="Function"&gt;&amp;lt;&lt;/span&gt;&lt;span class="Statement"&gt;html&lt;/span&gt;&lt;span class="Function"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="Function"&gt;&amp;lt;&lt;/span&gt;&lt;span class="Statement"&gt;head&lt;/span&gt;&lt;span class="Function"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="PreProc"&gt;    &lt;/span&gt;&lt;span class="Function"&gt;&amp;lt;&lt;/span&gt;&lt;span class="Statement"&gt;link&lt;/span&gt;&lt;span class="Function"&gt; &lt;/span&gt;&lt;span class="Type"&gt;rel&lt;/span&gt;&lt;span class="Function"&gt;=&lt;/span&gt;&lt;span class="String"&gt;"stylesheet"&lt;/span&gt;&lt;span class="Function"&gt; &lt;/span&gt;&lt;span class="Type"&gt;type&lt;/span&gt;&lt;span class="Function"&gt;=&lt;/span&gt;&lt;span class="String"&gt;"text/css"&lt;/span&gt;&lt;span class="Function"&gt; &lt;/span&gt;&lt;span class="Type"&gt;href&lt;/span&gt;&lt;span class="Function"&gt;=&lt;/span&gt;&lt;span class="String"&gt;"stylesheets/common.css"&lt;/span&gt;&lt;span class="Function"&gt; /&amp;gt;&lt;/span&gt;&lt;span class="PreProc"&gt;    &lt;/span&gt;
&lt;span class="PreProc"&gt;  &lt;/span&gt;&lt;span class="Identifier"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="Statement"&gt;head&lt;/span&gt;&lt;span class="Identifier"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="Function"&gt;&amp;lt;&lt;/span&gt;&lt;span class="Statement"&gt;body&lt;/span&gt;&lt;span class="Function"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="Function"&gt;&amp;lt;&lt;/span&gt;&lt;span class="Statement"&gt;div&lt;/span&gt;&lt;span class="Function"&gt; &lt;/span&gt;&lt;span class="Type"&gt;class&lt;/span&gt;&lt;span class="Function"&gt;=&lt;/span&gt;&lt;span class="String"&gt;"theme1"&lt;/span&gt;&lt;span class="Function"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="Function"&gt;&amp;lt;&lt;/span&gt;&lt;span class="Statement"&gt;div&lt;/span&gt;&lt;span class="Function"&gt; &lt;/span&gt;&lt;span class="Type"&gt;id&lt;/span&gt;&lt;span class="Function"&gt;=&lt;/span&gt;&lt;span class="String"&gt;"fullname"&lt;/span&gt;&lt;span class="Function"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="Function"&gt;&amp;lt;&lt;/span&gt;&lt;span class="Statement"&gt;p&lt;/span&gt;&lt;span class="Function"&gt;&amp;gt;&lt;/span&gt;Sriharsha&lt;span class="Identifier"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="Statement"&gt;p&lt;/span&gt;&lt;span class="Identifier"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="Function"&gt;&amp;lt;&lt;/span&gt;&lt;span class="Statement"&gt;p&lt;/span&gt;&lt;span class="Function"&gt;&amp;gt;&lt;/span&gt;Vardhan&lt;span class="Identifier"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="Statement"&gt;p&lt;/span&gt;&lt;span class="Identifier"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="Identifier"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="Statement"&gt;div&lt;/span&gt;&lt;span class="Identifier"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="Function"&gt;&amp;lt;&lt;/span&gt;&lt;span class="Statement"&gt;div&lt;/span&gt;&lt;span class="Function"&gt; &lt;/span&gt;&lt;span class="Type"&gt;id&lt;/span&gt;&lt;span class="Function"&gt;=&lt;/span&gt;&lt;span class="String"&gt;"communication"&lt;/span&gt;&lt;span class="Function"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="Function"&gt;&amp;lt;&lt;/span&gt;&lt;span class="Statement"&gt;p&lt;/span&gt;&lt;span class="Function"&gt;&amp;gt;&lt;/span&gt;Email: mail@mydomain.net&lt;span class="Identifier"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="Statement"&gt;p&lt;/span&gt;&lt;span class="Identifier"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="Function"&gt;&amp;lt;&lt;/span&gt;&lt;span class="Statement"&gt;p&lt;/span&gt;&lt;span class="Function"&gt;&amp;gt;&lt;/span&gt;Mobile: +91 0101 010 101&lt;span class="Identifier"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="Statement"&gt;p&lt;/span&gt;&lt;span class="Identifier"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="Identifier"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="Statement"&gt;div&lt;/span&gt;&lt;span class="Identifier"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="Identifier"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="Statement"&gt;div&lt;/span&gt;&lt;span class="Identifier"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="Identifier"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="Statement"&gt;body&lt;/span&gt;&lt;span class="Identifier"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="Identifier"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="Statement"&gt;html&lt;/span&gt;&lt;span class="Identifier"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
Hope this makes it easy to get started.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9122784-9217628509449052092?l=sriharshavardhan.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/NtKar1fhSP0vTfELy7wRsnxPBX8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/NtKar1fhSP0vTfELy7wRsnxPBX8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/NtKar1fhSP0vTfELy7wRsnxPBX8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/NtKar1fhSP0vTfELy7wRsnxPBX8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/SriharshaVardhan/~4/JnI8H0kAYNc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sriharshavardhan.blogspot.com/feeds/9217628509449052092/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9122784&amp;postID=9217628509449052092" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9122784/posts/default/9217628509449052092?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9122784/posts/default/9217628509449052092?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SriharshaVardhan/~3/JnI8H0kAYNc/adopting-saas-with-sinatra.html" title="adopting sass with Sinatra" /><author><name>Sriharsha Vardhan</name><uri>https://profiles.google.com/100795286323098096475</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-WSRPdIrYars/AAAAAAAAAAI/AAAAAAAAAnQ/IB8E9VyRHns/s512-c/photo.jpg" /></author><thr:total>0</thr:total><georss:featurename>Bengaluru, Karnataka, India</georss:featurename><georss:point>12.9715987 77.5945627</georss:point><georss:box>12.724026199999999 77.2787057 13.2191712 77.91041969999999</georss:box><feedburner:origLink>http://sriharshavardhan.blogspot.com/2011/12/adopting-saas-with-sinatra.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUMNRnczfip7ImA9WhRWEEg.&quot;"><id>tag:blogger.com,1999:blog-9122784.post-1443297860788633007</id><published>2011-12-26T11:12:00.001+05:30</published><updated>2011-12-28T11:54:57.986+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-28T11:54:57.986+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="html" /><category scheme="http://www.blogger.com/atom/ns#" term="css" /><title>HTML5 arrows</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
I am trying to create bar graphs with html5. As part of that I needed forward and backward arrows.&lt;br /&gt;
&lt;br /&gt;
I tried to get arrows marked out of html and css3. Here is the result &lt;a href="http://jsfiddle.net/harsha/2aq7R/1/embedded/result"&gt;http://jsfiddle.net/harsha/2aq7R/1/embedded/result&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Just started with arrow head. This wont show up anything as border is&amp;nbsp;transparent&amp;nbsp;is all sides.&lt;br /&gt;
&lt;br /&gt;
&lt;span class="whitespace" style="color: #666666; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="css-select-op" style="color: #666666; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;.&lt;/span&gt;&lt;span class="css-selector" style="color: #666666; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;arrow_head&amp;nbsp;&lt;/span&gt;&lt;span class="css-punctuation" style="color: #666666; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;{&lt;/span&gt;&lt;br /&gt;
&lt;span class="whitespace" style="color: #666666; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="css-identifier" style="font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;width&lt;/span&gt;&lt;span class="css-punctuation" style="color: #666666; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;:&amp;nbsp;&lt;/span&gt;&lt;span class="css-unit" style="color: #228811; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;0px&lt;/span&gt;&lt;span class="css-punctuation" style="color: #666666; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;;&amp;nbsp;&lt;/span&gt;&lt;span class="css-identifier" style="font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;border-width&lt;/span&gt;&lt;span class="css-punctuation" style="color: #666666; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;:&amp;nbsp;&lt;/span&gt;&lt;span class="css-unit" style="color: #228811; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;20px&lt;/span&gt;&lt;span class="css-punctuation" style="color: #666666; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;;&amp;nbsp;&lt;/span&gt;&lt;span class="css-identifier" style="font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;border-style&lt;/span&gt;&lt;span class="css-punctuation" style="color: #666666; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;:&amp;nbsp;&lt;/span&gt;&lt;span class="css-value" style="color: #770088; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;solid&lt;/span&gt;&lt;span class="css-punctuation" style="color: #666666; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span class="whitespace" style="color: #666666; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="css-identifier" style="font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;border-color&lt;/span&gt;&lt;span class="css-punctuation" style="color: #666666; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;:&amp;nbsp;&lt;/span&gt;&lt;span class="css-value" style="color: #770088; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;transparent&amp;nbsp;&lt;/span&gt;&lt;span class="css-value" style="color: #770088; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;transparent&amp;nbsp;&lt;/span&gt;&lt;span class="css-value" style="color: #770088; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;transparent&amp;nbsp;&lt;/span&gt;&lt;span class="css-value" style="color: #770088; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;transparent&lt;/span&gt;&lt;span class="css-punctuation" style="color: #666666; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="whitespace" style="color: #666666; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="css-punctuation" style="color: #666666; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Now to get top arrow effect let us show up bottom border.&lt;br /&gt;
&lt;span class="whitespace" style="color: #666666; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="css-select-op" style="color: #666666; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;.&lt;/span&gt;&lt;span class="css-selector" style="color: #666666; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;top_arrow&amp;nbsp;&lt;/span&gt;&lt;span class="css-punctuation" style="color: #666666; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;{&lt;/span&gt;&lt;br /&gt;
&lt;span class="whitespace" style="color: #666666; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="css-identifier" style="font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;border-bottom-color&lt;/span&gt;&lt;span class="css-punctuation" style="color: #666666; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;:&amp;nbsp;&lt;/span&gt;&lt;span class="css-colorcode" style="color: #004499; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;#E9E9E9&lt;/span&gt;&lt;span class="css-punctuation" style="color: #666666; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="whitespace" style="color: #666666; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="css-punctuation" style="color: #666666; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;}&lt;/span&gt;
&lt;br /&gt;
&lt;span style="color: #666666; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;"&gt;&lt;span style="font-size: 12px; line-height: 15px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
Similarly to get down arrow let us open up top border&lt;br /&gt;
&lt;span class="whitespace" style="color: #666666; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="css-select-op" style="color: #666666; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;.&lt;/span&gt;&lt;span class="css-selector" style="color: #666666; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;down_arrow&amp;nbsp;&lt;/span&gt;&lt;span class="css-punctuation" style="color: #666666; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;{&lt;/span&gt;&lt;br /&gt;
&lt;span class="whitespace" style="color: #666666; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="css-identifier" style="font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;border-top-color&lt;/span&gt;&lt;span class="css-punctuation" style="color: #666666; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;:&amp;nbsp;&lt;/span&gt;&lt;span class="css-colorcode" style="color: #004499; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;#E9E9E9&lt;/span&gt;&lt;span class="css-punctuation" style="color: #666666; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="whitespace" style="color: #666666; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="css-punctuation" style="color: #666666; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;span class="css-punctuation" style="color: #666666; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="css-punctuation"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div style="color: black; font-family: 'Times New Roman'; font-size: medium; line-height: normal;"&gt;
to get right arrow let us open up left border&lt;/div&gt;
&lt;span class="whitespace" style="color: #666666; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="css-select-op" style="color: #666666; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;.&lt;/span&gt;&lt;span class="css-selector" style="color: #666666; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;right_arrow&amp;nbsp;&lt;/span&gt;&lt;span class="css-punctuation" style="color: #666666; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;{&lt;/span&gt;&lt;br /&gt;
&lt;span class="whitespace" style="color: #666666; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="css-identifier" style="font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;border-left-color&lt;/span&gt;&lt;span class="css-punctuation" style="color: #666666; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;:&amp;nbsp;&lt;/span&gt;&lt;span class="css-colorcode" style="color: #004499; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;#E9E9E9&lt;/span&gt;&lt;span class="css-punctuation" style="color: #666666; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="whitespace" style="color: #666666; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="css-punctuation" style="color: #666666; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="whitespace" style="color: #666666; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;&lt;span style="color: black; font-family: 'Times New Roman'; font-size: small; line-height: normal;"&gt;to get left arrow let us open up right border&lt;/span&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="whitespace" style="color: #666666; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="css-select-op" style="color: #666666; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;.&lt;/span&gt;&lt;span class="css-selector" style="color: #666666; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;left_arrow&amp;nbsp;&lt;/span&gt;&lt;span class="css-punctuation" style="color: #666666; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;{&lt;/span&gt;&lt;br /&gt;
&lt;span class="whitespace" style="color: #666666; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="css-identifier" style="font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;border-right-color&lt;/span&gt;&lt;span class="css-punctuation" style="color: #666666; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;:&amp;nbsp;&lt;/span&gt;&lt;span class="css-colorcode" style="color: #004499; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;#E9E9E9&lt;/span&gt;&lt;span class="css-punctuation" style="color: #666666; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="whitespace" style="color: #666666; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="css-punctuation" style="color: #666666; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;span class="css-punctuation" style="color: #666666; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
Now arrow body is pure border with fixed height and width. so to get right arrow&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span class="whitespace" style="font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="xml-punctuation" style="font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;&amp;lt;&lt;/span&gt;&lt;span class="xml-tagname" style="color: #aa00bb; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;div&amp;nbsp;&lt;/span&gt;&lt;span class="xml-attname" style="color: blue; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;style&lt;/span&gt;&lt;span class="xml-punctuation" style="font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;=&lt;/span&gt;&lt;span class="xml-attribute" style="color: #228811; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;"float:right"&lt;/span&gt;&lt;span class="xml-punctuation" style="font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="whitespace" style="font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="xml-punctuation" style="font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;&amp;lt;&lt;/span&gt;&lt;span class="xml-tagname" style="color: #aa00bb; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;div&amp;nbsp;&lt;/span&gt;&lt;span class="xml-attname" style="color: blue; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;style&lt;/span&gt;&lt;span class="xml-punctuation" style="font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;=&lt;/span&gt;&lt;span class="xml-attribute" style="color: #228811; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;"width:20px; height:20px; background:#E9E9E9; float:left; margin-top:10px"&lt;/span&gt;&lt;span class="xml-punctuation" style="font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;&amp;gt;&lt;/span&gt;&lt;span class="xml-punctuation" style="font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;&lt;span class="xml-tagname" style="color: #aa00bb; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;div&lt;/span&gt;&lt;span class="xml-punctuation" style="font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;&amp;gt;&lt;/span&gt;&lt;br style="font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;" /&gt;&lt;span class="whitespace" style="font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="xml-punctuation" style="font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;&amp;lt;&lt;/span&gt;&lt;span class="xml-tagname" style="color: #aa00bb; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;div&amp;nbsp;&lt;/span&gt;&lt;span class="xml-attname" style="color: blue; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;class&lt;/span&gt;&lt;span class="xml-punctuation" style="font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;=&lt;/span&gt;&lt;span class="xml-attribute" style="color: #228811; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;"arrow_head right_arrow"&amp;nbsp;&lt;/span&gt;&lt;span class="xml-attname" style="color: blue; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;style&lt;/span&gt;&lt;span class="xml-punctuation" style="font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;=&lt;/span&gt;&lt;span class="xml-attribute" style="color: #228811; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;"float:left"&lt;/span&gt;&lt;span class="xml-punctuation" style="font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;&amp;gt;&lt;/span&gt;&lt;span class="xml-punctuation" style="font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;&lt;span class="xml-tagname" style="color: #aa00bb; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;div&lt;/span&gt;&lt;span class="xml-punctuation" style="font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;&amp;gt;&lt;/span&gt;&lt;br style="font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;" /&gt;&lt;span class="whitespace" style="font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="xml-punctuation" style="font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;&lt;span class="xml-tagname" style="color: #aa00bb; font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;div&lt;/span&gt;&lt;span class="xml-punctuation" style="font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="xml-punctuation" style="font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="xml-punctuation" style="font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;&lt;span style="font-family: 'Times New Roman'; font-size: small; line-height: normal;"&gt;Similarly all sides can be offset as shown below&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="xml-punctuation" style="font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;&lt;span style="font-family: 'Times New Roman'; font-size: small; line-height: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="xml-punctuation" style="font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;&lt;span class="xml-doctype"&gt;&lt;span class="xml-doctype"&gt;HTML&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="xml-punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="xml-tagname" style="color: #aa00bb;"&gt;html&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="whitespace"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="xml-tagname" style="color: #aa00bb;"&gt;body&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="whitespace"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="xml-tagname" style="color: #aa00bb;"&gt;div&amp;nbsp;&lt;/span&gt;&lt;span class="xml-attname" style="color: blue;"&gt;style&lt;/span&gt;&lt;span class="xml-punctuation"&gt;=&lt;/span&gt;&lt;span class="xml-attribute" style="color: #228811;"&gt;"background:gray; width:300px; padding: 10px; height:40px"&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="whitespace"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="xml-tagname" style="color: #aa00bb;"&gt;div&amp;nbsp;&lt;/span&gt;&lt;span class="xml-attname" style="color: blue;"&gt;style&lt;/span&gt;&lt;span class="xml-punctuation"&gt;=&lt;/span&gt;&lt;span class="xml-attribute" style="color: #228811;"&gt;"float:left"&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="whitespace"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="xml-tagname" style="color: #aa00bb;"&gt;div&amp;nbsp;&lt;/span&gt;&lt;span class="xml-attname" style="color: blue;"&gt;class&lt;/span&gt;&lt;span class="xml-punctuation"&gt;=&lt;/span&gt;&lt;span class="xml-attribute" style="color: #228811;"&gt;"arrow_head left_arrow"&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&lt;span class="xml-tagname" style="color: #aa00bb;"&gt;div&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="whitespace"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="xml-tagname" style="color: #aa00bb;"&gt;div&amp;nbsp;&lt;/span&gt;&lt;span class="xml-attname" style="color: blue;"&gt;style&lt;/span&gt;&lt;span class="xml-punctuation"&gt;=&lt;/span&gt;&lt;span class="xml-attribute" style="color: #228811;"&gt;"width:20px; height:20px; background:#E9E9E9; margin-left:40px; margin-top:-30px"&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&lt;span class="xml-tagname" style="color: #aa00bb;"&gt;div&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="whitespace"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&lt;span class="xml-tagname" style="color: #aa00bb;"&gt;div&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="whitespace"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="xml-tagname" style="color: #aa00bb;"&gt;div&amp;nbsp;&lt;/span&gt;&lt;span class="xml-attname" style="color: blue;"&gt;style&lt;/span&gt;&lt;span class="xml-punctuation"&gt;=&lt;/span&gt;&lt;span class="xml-attribute" style="color: #228811;"&gt;"float:right"&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="whitespace"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="xml-tagname" style="color: #aa00bb;"&gt;div&amp;nbsp;&lt;/span&gt;&lt;span class="xml-attname" style="color: blue;"&gt;style&lt;/span&gt;&lt;span class="xml-punctuation"&gt;=&lt;/span&gt;&lt;span class="xml-attribute" style="color: #228811;"&gt;"width:20px; height:20px; background:#E9E9E9; float:left; margin-top:10px"&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&lt;span class="xml-tagname" style="color: #aa00bb;"&gt;div&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="whitespace"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="xml-tagname" style="color: #aa00bb;"&gt;div&amp;nbsp;&lt;/span&gt;&lt;span class="xml-attname" style="color: blue;"&gt;class&lt;/span&gt;&lt;span class="xml-punctuation"&gt;=&lt;/span&gt;&lt;span class="xml-attribute" style="color: #228811;"&gt;"arrow_head right_arrow"&amp;nbsp;&lt;/span&gt;&lt;span class="xml-attname" style="color: blue;"&gt;style&lt;/span&gt;&lt;span class="xml-punctuation"&gt;=&lt;/span&gt;&lt;span class="xml-attribute" style="color: #228811;"&gt;"float:left"&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&lt;span class="xml-tagname" style="color: #aa00bb;"&gt;div&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="whitespace"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&lt;span class="xml-tagname" style="color: #aa00bb;"&gt;div&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="whitespace"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&lt;span class="xml-tagname" style="color: #aa00bb;"&gt;div&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="whitespace"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="xml-tagname" style="color: #aa00bb;"&gt;br&amp;nbsp;&lt;/span&gt;&lt;span class="xml-punctuation"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="whitespace"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="xml-tagname" style="color: #aa00bb;"&gt;div&amp;nbsp;&lt;/span&gt;&lt;span class="xml-attname" style="color: blue;"&gt;style&lt;/span&gt;&lt;span class="xml-punctuation"&gt;=&lt;/span&gt;&lt;span class="xml-attribute" style="color: #228811;"&gt;"background:gray; width:300px; padding: 10px; height:40px"&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="whitespace"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="xml-tagname" style="color: #aa00bb;"&gt;div&amp;nbsp;&lt;/span&gt;&lt;span class="xml-attname" style="color: blue;"&gt;style&lt;/span&gt;&lt;span class="xml-punctuation"&gt;=&lt;/span&gt;&lt;span class="xml-attribute" style="color: #228811;"&gt;"float:left; margin-top:-20px"&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="whitespace"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="xml-tagname" style="color: #aa00bb;"&gt;div&amp;nbsp;&lt;/span&gt;&lt;span class="xml-attname" style="color: blue;"&gt;class&lt;/span&gt;&lt;span class="xml-punctuation"&gt;=&lt;/span&gt;&lt;span class="xml-attribute" style="color: #228811;"&gt;"arrow_head top_arrow"&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&lt;span class="xml-tagname" style="color: #aa00bb;"&gt;div&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="whitespace"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="xml-tagname" style="color: #aa00bb;"&gt;div&amp;nbsp;&lt;/span&gt;&lt;span class="xml-attname" style="color: blue;"&gt;style&lt;/span&gt;&lt;span class="xml-punctuation"&gt;=&lt;/span&gt;&lt;span class="xml-attribute" style="color: #228811;"&gt;"width:20px; height:20px; background:#E9E9E9;&amp;nbsp;&amp;nbsp;margin-left:10px"&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&lt;span class="xml-tagname" style="color: #aa00bb;"&gt;div&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="whitespace"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&lt;span class="xml-tagname" style="color: #aa00bb;"&gt;div&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="whitespace"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="xml-tagname" style="color: #aa00bb;"&gt;div&amp;nbsp;&lt;/span&gt;&lt;span class="xml-attname" style="color: blue;"&gt;style&lt;/span&gt;&lt;span class="xml-punctuation"&gt;=&lt;/span&gt;&lt;span class="xml-attribute" style="color: #228811;"&gt;"float:right"&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="whitespace"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="xml-tagname" style="color: #aa00bb;"&gt;div&amp;nbsp;&lt;/span&gt;&lt;span class="xml-attname" style="color: blue;"&gt;style&lt;/span&gt;&lt;span class="xml-punctuation"&gt;=&lt;/span&gt;&lt;span class="xml-attribute" style="color: #228811;"&gt;"width:20px; height:20px; background:#E9E9E9; margin-left:10px"&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&lt;span class="xml-tagname" style="color: #aa00bb;"&gt;div&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="whitespace"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="xml-tagname" style="color: #aa00bb;"&gt;div&amp;nbsp;&lt;/span&gt;&lt;span class="xml-attname" style="color: blue;"&gt;class&lt;/span&gt;&lt;span class="xml-punctuation"&gt;=&lt;/span&gt;&lt;span class="xml-attribute" style="color: #228811;"&gt;"arrow_head down_arrow"&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&lt;span class="xml-tagname" style="color: #aa00bb;"&gt;div&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="whitespace"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&lt;span class="xml-tagname" style="color: #aa00bb;"&gt;div&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="whitespace"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&lt;span class="xml-tagname" style="color: #aa00bb;"&gt;div&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="whitespace"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&lt;span class="xml-tagname" style="color: #aa00bb;"&gt;body&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="xml-punctuation"&gt;&lt;span class="xml-tagname" style="color: #aa00bb;"&gt;html&lt;/span&gt;&lt;span class="xml-punctuation"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="xml-punctuation" style="font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;&lt;span class="xml-punctuation"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="xml-punctuation" style="font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;&lt;span class="xml-punctuation"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="xml-punctuation" style="font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;&lt;span style="font-family: 'Times New Roman'; font-size: small; line-height: normal;"&gt;And here is the css&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="xml-punctuation" style="font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;&lt;span style="font-family: 'Times New Roman'; font-size: small; line-height: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="xml-punctuation" style="font-family: Inconsolata, Monaco, Consolas, 'Andale Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; line-height: 15px;"&gt;&lt;span class="whitespace" style="color: #666666;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="css-select-op" style="color: #666666;"&gt;.&lt;/span&gt;&lt;span class="css-selector" style="color: #666666;"&gt;arrow_head&amp;nbsp;&lt;/span&gt;&lt;span class="css-punctuation" style="color: #666666;"&gt;{&lt;/span&gt;&lt;br style="color: #666666;" /&gt;&lt;span class="whitespace" style="color: #666666;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="css-identifier"&gt;width&lt;/span&gt;&lt;span class="css-punctuation" style="color: #666666;"&gt;:&amp;nbsp;&lt;/span&gt;&lt;span class="css-unit" style="color: #228811;"&gt;0px&lt;/span&gt;&lt;span class="css-punctuation" style="color: #666666;"&gt;;&amp;nbsp;&lt;/span&gt;&lt;span class="css-identifier"&gt;border-width&lt;/span&gt;&lt;span class="css-punctuation" style="color: #666666;"&gt;:&amp;nbsp;&lt;/span&gt;&lt;span class="css-unit" style="color: #228811;"&gt;20px&lt;/span&gt;&lt;span class="css-punctuation" style="color: #666666;"&gt;;&amp;nbsp;&lt;/span&gt;&lt;span class="css-identifier"&gt;border-style&lt;/span&gt;&lt;span class="css-punctuation" style="color: #666666;"&gt;:&amp;nbsp;&lt;/span&gt;&lt;span class="css-value" style="color: #770088;"&gt;solid&lt;/span&gt;&lt;span class="css-punctuation" style="color: #666666;"&gt;;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br style="color: #666666;" /&gt;&lt;span class="whitespace" style="color: #666666;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="css-identifier"&gt;border-color&lt;/span&gt;&lt;span class="css-punctuation" style="color: #666666;"&gt;:&amp;nbsp;&lt;/span&gt;&lt;span class="css-value" style="color: #770088;"&gt;transparent&amp;nbsp;&lt;/span&gt;&lt;span class="css-value" style="color: #770088;"&gt;transparent&amp;nbsp;&lt;/span&gt;&lt;span class="css-value" style="color: #770088;"&gt;transparent&amp;nbsp;&lt;/span&gt;&lt;span class="css-value" style="color: #770088;"&gt;transparent&lt;/span&gt;&lt;span class="css-punctuation" style="color: #666666;"&gt;;&lt;/span&gt;&lt;br style="color: #666666;" /&gt;&lt;span class="whitespace" style="color: #666666;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="css-punctuation" style="color: #666666;"&gt;}&lt;/span&gt;&lt;br style="color: #666666;" /&gt;&lt;span class="whitespace" style="color: #666666;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="css-select-op" style="color: #666666;"&gt;.&lt;/span&gt;&lt;span class="css-selector" style="color: #666666;"&gt;top_arrow&amp;nbsp;&lt;/span&gt;&lt;span class="css-punctuation" style="color: #666666;"&gt;{&lt;/span&gt;&lt;br style="color: #666666;" /&gt;&lt;span class="whitespace" style="color: #666666;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="css-identifier"&gt;border-bottom-color&lt;/span&gt;&lt;span class="css-punctuation" style="color: #666666;"&gt;:&amp;nbsp;&lt;/span&gt;&lt;span class="css-colorcode" style="color: #004499;"&gt;#E9E9E9&lt;/span&gt;&lt;span class="css-punctuation" style="color: #666666;"&gt;;&lt;/span&gt;&lt;br style="color: #666666;" /&gt;&lt;span class="whitespace" style="color: #666666;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="css-punctuation" style="color: #666666;"&gt;}&lt;/span&gt;&lt;br style="color: #666666;" /&gt;&lt;span class="whitespace" style="color: #666666;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="css-select-op" style="color: #666666;"&gt;.&lt;/span&gt;&lt;span class="css-selector" style="color: #666666;"&gt;down_arrow&amp;nbsp;&lt;/span&gt;&lt;span class="css-punctuation" style="color: #666666;"&gt;{&lt;/span&gt;&lt;br style="color: #666666;" /&gt;&lt;span class="whitespace" style="color: #666666;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="css-identifier"&gt;border-top-color&lt;/span&gt;&lt;span class="css-punctuation" style="color: #666666;"&gt;:&amp;nbsp;&lt;/span&gt;&lt;span class="css-colorcode" style="color: #004499;"&gt;#E9E9E9&lt;/span&gt;&lt;span class="css-punctuation" style="color: #666666;"&gt;;&lt;/span&gt;&lt;br style="color: #666666;" /&gt;&lt;span class="whitespace" style="color: #666666;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="css-punctuation" style="color: #666666;"&gt;}&lt;/span&gt;&lt;br style="color: #666666;" /&gt;&lt;span class="whitespace" style="color: #666666;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="css-select-op" style="color: #666666;"&gt;.&lt;/span&gt;&lt;span class="css-selector" style="color: #666666;"&gt;right_arrow&amp;nbsp;&lt;/span&gt;&lt;span class="css-punctuation" style="color: #666666;"&gt;{&lt;/span&gt;&lt;br style="color: #666666;" /&gt;&lt;span class="whitespace" style="color: #666666;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="css-identifier"&gt;border-left-color&lt;/span&gt;&lt;span class="css-punctuation" style="color: #666666;"&gt;:&amp;nbsp;&lt;/span&gt;&lt;span class="css-colorcode" style="color: #004499;"&gt;#E9E9E9&lt;/span&gt;&lt;span class="css-punctuation" style="color: #666666;"&gt;;&lt;/span&gt;&lt;br style="color: #666666;" /&gt;&lt;span class="whitespace" style="color: #666666;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="css-punctuation" style="color: #666666;"&gt;}&lt;/span&gt;&lt;br style="color: #666666;" /&gt;&lt;span class="whitespace" style="color: #666666;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="css-select-op" style="color: #666666;"&gt;.&lt;/span&gt;&lt;span class="css-selector" style="color: #666666;"&gt;left_arrow&amp;nbsp;&lt;/span&gt;&lt;span class="css-punctuation" style="color: #88ff88; font-weight: bold;"&gt;{&lt;/span&gt;&lt;br style="color: #666666;" /&gt;&lt;span class="whitespace" style="color: #666666;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="css-identifier"&gt;border-right-color&lt;/span&gt;&lt;span class="css-punctuation" style="color: #666666;"&gt;:&amp;nbsp;&lt;/span&gt;&lt;span class="css-colorcode" style="color: #004499;"&gt;#E9E9E9&lt;/span&gt;&lt;span class="css-punctuation" style="color: #666666;"&gt;;&lt;/span&gt;&lt;br style="color: #666666;" /&gt;&lt;span class="whitespace" style="color: #666666;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="css-punctuation" style="color: #88ff88; font-weight: bold;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9122784-1443297860788633007?l=sriharshavardhan.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/HjqGCZD3dzM8jVQ4TZ78m5CE5U8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HjqGCZD3dzM8jVQ4TZ78m5CE5U8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/HjqGCZD3dzM8jVQ4TZ78m5CE5U8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HjqGCZD3dzM8jVQ4TZ78m5CE5U8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/SriharshaVardhan/~4/GPfPv80gSqQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sriharshavardhan.blogspot.com/feeds/1443297860788633007/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9122784&amp;postID=1443297860788633007" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9122784/posts/default/1443297860788633007?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9122784/posts/default/1443297860788633007?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SriharshaVardhan/~3/GPfPv80gSqQ/html5-arrows.html" title="HTML5 arrows" /><author><name>Sriharsha Vardhan</name><uri>https://profiles.google.com/100795286323098096475</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-WSRPdIrYars/AAAAAAAAAAI/AAAAAAAAAnQ/IB8E9VyRHns/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://sriharshavardhan.blogspot.com/2011/12/html5-arrows.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkEGQn0zeip7ImA9WhdUF08.&quot;"><id>tag:blogger.com,1999:blog-9122784.post-8363471750633213054</id><published>2011-10-04T15:00:00.000+05:30</published><updated>2011-10-04T15:00:23.382+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-04T15:00:23.382+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Tools" /><title>Uncrustify  - Source Code Beautifier</title><content type="html">Just came across a powerful&amp;nbsp;tool for code&amp;nbsp;beautification.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://uncrustify.sourceforge.net/"&gt;http://uncrustify.sourceforge.net/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Features&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Ident code, aligning on parens, assignments, etc&lt;/li&gt;
&lt;li&gt;Align on '=' and variable definitions&lt;/li&gt;
&lt;li&gt;Align structure initializers&lt;/li&gt;
&lt;li&gt;Align #define stuff&lt;/li&gt;
&lt;li&gt;Align backslash-newline stuff&lt;/li&gt;
&lt;li&gt;Reformat comments (a little bit)&lt;/li&gt;
&lt;li&gt;Fix inter-character spacing&lt;/li&gt;
&lt;li&gt;Add or remove parens on return statements&lt;/li&gt;
&lt;li&gt;Add or remove braces on single-statement if/do/while/for statements&lt;/li&gt;
&lt;li&gt;Supports embedded SQL 'EXEC SQL' stuff&lt;/li&gt;
&lt;li&gt;Highly configurable - 400 configurable options as of version 0.58&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9122784-8363471750633213054?l=sriharshavardhan.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/P86xdRfMgf4FMf4EvoScj45VBWo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/P86xdRfMgf4FMf4EvoScj45VBWo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/P86xdRfMgf4FMf4EvoScj45VBWo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/P86xdRfMgf4FMf4EvoScj45VBWo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/SriharshaVardhan/~4/hC8MH4B2qog" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sriharshavardhan.blogspot.com/feeds/8363471750633213054/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9122784&amp;postID=8363471750633213054" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9122784/posts/default/8363471750633213054?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9122784/posts/default/8363471750633213054?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SriharshaVardhan/~3/hC8MH4B2qog/uncrustify-source-code-beautifier.html" title="Uncrustify  - Source Code Beautifier" /><author><name>Sriharsha Vardhan</name><uri>https://profiles.google.com/100795286323098096475</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-WSRPdIrYars/AAAAAAAAAAI/AAAAAAAAAnQ/IB8E9VyRHns/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://sriharshavardhan.blogspot.com/2011/10/uncrustify-source-code-beautifier.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEACQn86cSp7ImA9WhdUE0o.&quot;"><id>tag:blogger.com,1999:blog-9122784.post-4380206416038450614</id><published>2011-09-30T14:22:00.000+05:30</published><updated>2011-09-30T14:22:43.119+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-30T14:22:43.119+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Git" /><title>gitignore skipping folder hierarchy</title><content type="html">I was just trying to setup a new git repository for existing code base. Tree is something like this (names changed but structure retained)&lt;br /&gt;
&lt;br /&gt;
├───apps&lt;br /&gt;
│ &amp;nbsp; ├───bin&lt;br /&gt;
│ &amp;nbsp; │ &amp;nbsp; ├───x64&lt;br /&gt;
│ &amp;nbsp; │ &amp;nbsp; │ &amp;nbsp; ├───Debug&lt;br /&gt;
│ &amp;nbsp; │ &amp;nbsp; │ &amp;nbsp; └───Release&lt;br /&gt;
│ &amp;nbsp; │ &amp;nbsp; └───x86&lt;br /&gt;
│ &amp;nbsp; │ &amp;nbsp; &amp;nbsp; &amp;nbsp; ├───Debug&lt;br /&gt;
│ &amp;nbsp; │ &amp;nbsp; &amp;nbsp; &amp;nbsp; └───Release&lt;br /&gt;
│ &amp;nbsp; └───libs&lt;br /&gt;
│ &amp;nbsp; &amp;nbsp; &amp;nbsp; ├───Debug&lt;br /&gt;
│ &amp;nbsp; &amp;nbsp; &amp;nbsp; └───Release&lt;br /&gt;
└───libs&lt;br /&gt;
&lt;br /&gt;
.gitignore&lt;br /&gt;
&lt;br /&gt;
Now my intention is to setup &lt;a href="http://help.github.com/ignore-files/"&gt;.gitignore&lt;/a&gt; file with following assumptions&lt;br /&gt;
1) libs at root and files below should be ignored&lt;br /&gt;
2) libs below apps and all files below should be considered for tracking&lt;br /&gt;
3) Debug and Release folders under apps\bin\x86|x64 should be ignored&lt;br /&gt;
4) Debug and Release folders under apps\libs should be considered for tracking&lt;br /&gt;
&lt;br /&gt;
Help file of git ignore doesn't provide much help about placeholders and skip tokens. Though I wish a regex option could be ideal.

After some hit and trial I could come up with following .gitignore file&lt;br /&gt;
&lt;br /&gt;
/libs&lt;br /&gt;
*/bin/*/Debug&lt;br /&gt;
*/bin/*/Release&lt;br /&gt;
&lt;br /&gt;
With this when I add and check for status I get desired result.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$git add .&lt;br /&gt;
&lt;br /&gt;
$git status&lt;br /&gt;
# On branch master&lt;br /&gt;
#&lt;br /&gt;
# Initial commit&lt;br /&gt;
#&lt;br /&gt;
# Changes to be committed:&lt;br /&gt;
# &amp;nbsp; (use "git rm --cached &lt;file&gt;..." to unstage)&lt;/file&gt;&lt;br /&gt;
#&lt;br /&gt;
# &amp;nbsp; &amp;nbsp; &amp;nbsp; new file: &amp;nbsp; .gitignore&lt;br /&gt;
# &amp;nbsp; &amp;nbsp; &amp;nbsp; new file: &amp;nbsp; apps/apps1.txt&lt;br /&gt;
# &amp;nbsp; &amp;nbsp; &amp;nbsp; new file: &amp;nbsp; apps/libs/Debug/appslibsdebug.txt&lt;br /&gt;
# &amp;nbsp; &amp;nbsp; &amp;nbsp; new file: &amp;nbsp; apps/libs/Release/appslibsrelease.txt&lt;br /&gt;
# &amp;nbsp; &amp;nbsp; &amp;nbsp; new file: &amp;nbsp; apps/libs/appslibs1.txt&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9122784-4380206416038450614?l=sriharshavardhan.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/wXe9vYCYJwUgYj-GqUqf0C1QPFM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wXe9vYCYJwUgYj-GqUqf0C1QPFM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/wXe9vYCYJwUgYj-GqUqf0C1QPFM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wXe9vYCYJwUgYj-GqUqf0C1QPFM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/SriharshaVardhan/~4/l4O-pJTlP04" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sriharshavardhan.blogspot.com/feeds/4380206416038450614/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9122784&amp;postID=4380206416038450614" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9122784/posts/default/4380206416038450614?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9122784/posts/default/4380206416038450614?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SriharshaVardhan/~3/l4O-pJTlP04/gitignore-skipping-folder-hierarchy.html" title="gitignore skipping folder hierarchy" /><author><name>Sriharsha Vardhan</name><uri>https://profiles.google.com/100795286323098096475</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-WSRPdIrYars/AAAAAAAAAAI/AAAAAAAAAnQ/IB8E9VyRHns/s512-c/photo.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://sriharshavardhan.blogspot.com/2011/09/gitignore-skipping-folder-hierarchy.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEECQXk4eSp7ImA9WhdXFUg.&quot;"><id>tag:blogger.com,1999:blog-9122784.post-7848605275750090846</id><published>2011-08-29T00:07:00.000+05:30</published><updated>2011-08-29T00:07:40.731+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-29T00:07:40.731+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Social" /><title>Systemic disorders and juvenile instincts</title><content type="html">As I am going through different content being published about Anna's movement, I am observing a peculiar attitude with highly informed and networked groups of people. Lack of moderation on social media in developing countries like india is instilling systemic disorder and juvenile delinquency in these groups.&lt;br /&gt;
&lt;br /&gt;
Though number of people involved in these groups my not be so high, intensity of this disorder could be quite alarming. These groups got exuberant communication skills but due to juvenile instincts they get latched onto unavailing discussions. They get so much so involved with their incessant discussions they actually fall into the trap of  becoming perverse.  Now when you bring them to a table together with others they start feeling themselves as aliens. As I said, numbers may not be so high but the intensity is quite alarming. &lt;br /&gt;
&lt;br /&gt;
These groups attract teenagers instantly as everything revolves around bashing something that is popular so as to reward themselves as smarter than popular ones.  Actually they get caught in that illusion. But the amount of time they spend and the intensity with which they dissolve themselves in those illusions leads to dangerous systemic disorder. Now I suspect, what we are observing in UK today could be traced back to some sort of disorder of this nature. Repercussions could be completely different but the extent of ability to create harm could be same. Of course I am not a qualified psycho analyst or a seasoned speaker on the subject but I am sensing along these lines. Really hoping for some competent authority to study on this aspect and disprove me. &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9122784-7848605275750090846?l=sriharshavardhan.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/oV5Ecpije7W0-Rf3X5iZnMWMctw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/oV5Ecpije7W0-Rf3X5iZnMWMctw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/oV5Ecpije7W0-Rf3X5iZnMWMctw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/oV5Ecpije7W0-Rf3X5iZnMWMctw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/SriharshaVardhan/~4/wqYidZsFD4I" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sriharshavardhan.blogspot.com/feeds/7848605275750090846/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9122784&amp;postID=7848605275750090846" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9122784/posts/default/7848605275750090846?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9122784/posts/default/7848605275750090846?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SriharshaVardhan/~3/wqYidZsFD4I/systemic-disorders-and-juvenile.html" title="Systemic disorders and juvenile instincts" /><author><name>Sriharsha Vardhan</name><uri>https://profiles.google.com/100795286323098096475</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-WSRPdIrYars/AAAAAAAAAAI/AAAAAAAAAnQ/IB8E9VyRHns/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://sriharshavardhan.blogspot.com/2011/08/systemic-disorders-and-juvenile.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkMGRHk-eip7ImA9WhdXFEs.&quot;"><id>tag:blogger.com,1999:blog-9122784.post-1194691981009311121</id><published>2011-08-27T23:37:00.000+05:30</published><updated>2011-08-27T23:37:05.752+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-27T23:37:05.752+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Social" /><title>Is ballot process immutable?</title><content type="html">Those who agitate against a misconducting priest are not against GOD. Indian constitution is devine, no one is objecting it's greatness. But what to do when priest is misconducting? Unfortunately constitution with its divinity and parliament as sacred legislative house cannot themselves offer governance to any society. There got be a functional government made up of competent people, capable of being representative as well as authoritative to uphold traditions of a particular parliamentary system. &lt;br /&gt;
&lt;br /&gt;
And the process of selecting such competent people is crucial to make this system work for any society. Such process can't be mere a competency assessment test or proportional representation. First of all this got to be peaceful and then workable, innovative and above of all mutable. Democracy suggests majority vote as one of the mechanisms through which this process can be exercised peacefully. Founding fathers of our nation suggested a workable solution in the form of a ballot which in fact was a popular form of practice prevailed at that time. And in last 60+ years the only improvement we could do is to convert a paper ballet to an electronic one. But we somehow caught in an impression that this process is immutable. Voting system can't be the only possible solution for this process.&lt;br /&gt;
&lt;br /&gt;
Current day advances in network technology can offer more practical solutions for this problem. And the scope of the solution need not limit to electing but could also include selecting the candidates for election. And how can we make selection of a candidate a continuous process and election a periodic process say once in every 5 years?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9122784-1194691981009311121?l=sriharshavardhan.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/TnkXUEf0i12uL9iPJyb_EJJmvYQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/TnkXUEf0i12uL9iPJyb_EJJmvYQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/TnkXUEf0i12uL9iPJyb_EJJmvYQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/TnkXUEf0i12uL9iPJyb_EJJmvYQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/SriharshaVardhan/~4/d3JCfu5vCPE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sriharshavardhan.blogspot.com/feeds/1194691981009311121/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9122784&amp;postID=1194691981009311121" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9122784/posts/default/1194691981009311121?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9122784/posts/default/1194691981009311121?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SriharshaVardhan/~3/d3JCfu5vCPE/is-ballot-process-immutable.html" title="Is ballot process immutable?" /><author><name>Sriharsha Vardhan</name><uri>https://profiles.google.com/100795286323098096475</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-WSRPdIrYars/AAAAAAAAAAI/AAAAAAAAAnQ/IB8E9VyRHns/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://sriharshavardhan.blogspot.com/2011/08/is-ballot-process-immutable.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUQGQH4_cSp7ImA9WhdXEU8.&quot;"><id>tag:blogger.com,1999:blog-9122784.post-1528472111591848143</id><published>2011-08-24T00:52:00.000+05:30</published><updated>2011-08-24T00:52:01.049+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-24T00:52:01.049+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Social" /><title>Where were these maestros?</title><content type="html">Now a days I am getting to know about so many people who are suggesting far superior methods than what Anna is following to fight against corruption in this country. &lt;br /&gt;
&lt;br /&gt;
I don't know that there are so many knowledgeable people in this country who can suggest about intelligent ways to fight against corruption.&lt;br /&gt;
&lt;br /&gt;
But it is quite unfortunate that I could hear and rather know about them only when a 70+ year old man makes a so called dangerous move.&lt;br /&gt;
&lt;br /&gt;
Yesterday, few fellow country men, under the influence of alcohol, came to Ramlila ground and tried to create ruckus. Police came and took them away. I have high respect for them because they had to consume alcohol to behave abnormally. As influence of alcohol lasts for only few hours. I have no concern getting along those fellow citizens as soon as they come out of that influence. &lt;br /&gt;
&lt;br /&gt;
But I am highly afraid about these intellectual maestros who don't need to consume anything to be abnormal. And there is no hope that they will ever come out of an influence which makes them feel that they can do better than anybody else in this country. Dear friends though I admire your courage and confidence towards that supremacy, I would humbly request you to take that first step towards making yourself acceptable by being dignified when presenting views about fellow countrymen who are also trying to do good for this country at their capacity. May be the methods may not sound reasonable to you, but I hope there is no difference of opinion on objective. &lt;br /&gt;
&lt;br /&gt;
When you goto Palika bazar and ask for price of a picture, seller may quote 2000. And you may negotiate for 300. Deal could satisfy either party. It happens indeed. What I meant to say is quoting 2000 may sound stupid, but as a seller he/she knows what makes a negotiator happy. When you deal with government you would indeed place riders which govt. want to negotiate so that the middle ground becomes reasonable for either party. Of course if you are a habituated buyer in showrooms you wouldn't have come across such experiences. &lt;br /&gt;
&lt;br /&gt;
But is this the way we want our systems to be forever? Of course no, but let every fellow countrymen make some way ahead to their capacity.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9122784-1528472111591848143?l=sriharshavardhan.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/gq66gt0oFp7acBbq0OVbXcAzP4c/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/gq66gt0oFp7acBbq0OVbXcAzP4c/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/gq66gt0oFp7acBbq0OVbXcAzP4c/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/gq66gt0oFp7acBbq0OVbXcAzP4c/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/SriharshaVardhan/~4/TYqUgpCsK38" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sriharshavardhan.blogspot.com/feeds/1528472111591848143/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9122784&amp;postID=1528472111591848143" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9122784/posts/default/1528472111591848143?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9122784/posts/default/1528472111591848143?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SriharshaVardhan/~3/TYqUgpCsK38/where-were-these-maestros.html" title="Where were these maestros?" /><author><name>Sriharsha Vardhan</name><uri>https://profiles.google.com/100795286323098096475</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-WSRPdIrYars/AAAAAAAAAAI/AAAAAAAAAnQ/IB8E9VyRHns/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://sriharshavardhan.blogspot.com/2011/08/where-were-these-maestros.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkcNR3k8cSp7ImA9WhdXEEk.&quot;"><id>tag:blogger.com,1999:blog-9122784.post-5031360441608225113</id><published>2011-08-23T00:38:00.000+05:30</published><updated>2011-08-23T00:38:16.779+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-23T00:38:16.779+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Social" /><title>Who owns civil society?</title><content type="html">Don't know who owns civil society? Problem lies with media refering any group of civilians as civil society. Looks like media must draft a guideline on eligibility to mention any group as civil society by consulting experts like Aruna Roy, Arundhati Roy etc..&lt;br /&gt;
&lt;br /&gt;
If thy are all fighting for better society, don't they have some diligence that soldiers follow. Fight headon with points of conflict on subject of discussion which in this case is a bill. Why make provocative statements about methods and modus operandi? Let people exercise their freedom and do what they deem appropriate for a situation as long as it is peaceful and non-violent.&lt;br /&gt;
&lt;br /&gt;
It's completely inappropriate to label Anna's movement as a dangerous phenomenon breeding impatience in the youth of this country. Anyway no need to substantiate that, as readers can distinguish it obviously.  &lt;br /&gt;
&lt;br /&gt;
Now I don't know if I would get classified as mass, though I have no concern over it, if I say that I don't mind supporting any cause that makes this country better including Anna's movement. Tomorrow if anyone else asks me to support their form of fight, either in the form of a movement or discussion or whatever that could be, I would support it if I see a clear benefit for this country. For that matter I would do so for every other cause to the extent feasible for me.&lt;br /&gt;
&lt;br /&gt;
Everyone got their freedom of speech, but as a soldier fight with spirit against enemy, which in this case is corruption, rather than a tool and method used by other soldiers. Everyone cannot afford sophisticated ammunition, but if a latti is handy, what is wrong if anyone chooses to defend the community using a latti? Do you say they are not defending community and they can not claim themselves as community? &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9122784-5031360441608225113?l=sriharshavardhan.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/n_NlPS8ZADHJpsyukyZ1jVTCcXM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/n_NlPS8ZADHJpsyukyZ1jVTCcXM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/n_NlPS8ZADHJpsyukyZ1jVTCcXM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/n_NlPS8ZADHJpsyukyZ1jVTCcXM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/SriharshaVardhan/~4/f3yf3iX5u38" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sriharshavardhan.blogspot.com/feeds/5031360441608225113/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9122784&amp;postID=5031360441608225113" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9122784/posts/default/5031360441608225113?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9122784/posts/default/5031360441608225113?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SriharshaVardhan/~3/f3yf3iX5u38/who-owns-civil-society.html" title="Who owns civil society?" /><author><name>Sriharsha Vardhan</name><uri>https://profiles.google.com/100795286323098096475</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-WSRPdIrYars/AAAAAAAAAAI/AAAAAAAAAnQ/IB8E9VyRHns/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://sriharshavardhan.blogspot.com/2011/08/who-owns-civil-society.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkYBRX4-eip7ImA9WhdRFkw.&quot;"><id>tag:blogger.com,1999:blog-9122784.post-8359846351206910748</id><published>2011-08-06T13:39:00.000+05:30</published><updated>2011-08-06T13:39:14.052+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-06T13:39:14.052+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Coding Practices" /><title>Checking for integer ranges - C# to C</title><content type="html">I had tough time explaining what should be the correct mechanism for checking integer range for a developer coming from C# to C. &lt;br /&gt;
&lt;br /&gt;
Intention is to check a value within the range of 0 to 4. Anything less than 0 and above four is invalid.&lt;br /&gt;
&lt;br /&gt;
Expression written is &lt;br /&gt;
&lt;br /&gt;
     ((http_method &amp;gt; -1) &amp;amp;&amp;amp; (http_method &amp;lt; 5))  &lt;br /&gt;
&lt;br /&gt;
I wrote a review comment to change expression as &lt;br /&gt;
&lt;br /&gt;
     (Method &amp;gt;= 0) &amp;amp;&amp;amp; (Method &amp;lt;= 4))&lt;br /&gt;
&lt;br /&gt;
Comment is not accepted and led to a discussion, rather argument.&lt;br /&gt;
&lt;br /&gt;
I said I have a problem with first part of expression&lt;br /&gt;
&lt;br /&gt;
     (http_method &amp;gt; -1)&lt;br /&gt;
&lt;br /&gt;
The '-1' could be tricky depending upon type of http_method.&lt;br /&gt;
&lt;br /&gt;
And in this case http_method is unsigned int and returned false even for correct range.&lt;br /&gt;
&lt;br /&gt;
It took a while to explain the expression is invalid.&lt;br /&gt;
&lt;br /&gt;
Though C# has an 'uint' type, an 'int' would suffice the need in most of the scenarios.&lt;br /&gt;
&lt;br /&gt;
So using correct data type is one part of it. Also when it comes to checking ranges it is always recommended to check inclusive ranges rather than outer ranges. One simple reason for that is test cases. Test cases with inclusive range are considered as positive test cases and boundary range are considered as negative test cases.&lt;br /&gt;
&lt;br /&gt;
Technically there is no binding to follow inclusive range check. But it is a good convention to follow.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9122784-8359846351206910748?l=sriharshavardhan.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/fjkNIbEVZUjTl8gRoQJwtp6_ufI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fjkNIbEVZUjTl8gRoQJwtp6_ufI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/fjkNIbEVZUjTl8gRoQJwtp6_ufI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fjkNIbEVZUjTl8gRoQJwtp6_ufI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/SriharshaVardhan/~4/dvQgit-khoc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sriharshavardhan.blogspot.com/feeds/8359846351206910748/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9122784&amp;postID=8359846351206910748" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9122784/posts/default/8359846351206910748?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9122784/posts/default/8359846351206910748?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SriharshaVardhan/~3/dvQgit-khoc/checking-for-integer-ranges-c-to-c.html" title="Checking for integer ranges - C# to C" /><author><name>Sriharsha Vardhan</name><uri>https://profiles.google.com/100795286323098096475</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-WSRPdIrYars/AAAAAAAAAAI/AAAAAAAAAnQ/IB8E9VyRHns/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://sriharshavardhan.blogspot.com/2011/08/checking-for-integer-ranges-c-to-c.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkQHQHczeip7ImA9WhdRFk0.&quot;"><id>tag:blogger.com,1999:blog-9122784.post-5172344204422932678</id><published>2011-08-06T08:42:00.000+05:30</published><updated>2011-08-06T08:42:11.982+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-06T08:42:11.982+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Tools" /><title>Changing diff/merge tool</title><content type="html">I have been using Winmerge for years. Never expected that I would find any limitation with it. But it is failing to show diff view of c file modification in git repository with tortoise front end.&lt;br /&gt;
&lt;br /&gt;
Moving to &lt;a href="http://www.sourcegear.com/diffmerge/"&gt;DiffMerge&lt;/a&gt; from &lt;a href="http://www.sourcegear.com/"&gt;SourceGear&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Though licensing is not so encouraging, it is a proving to be a good choice.&lt;br /&gt;
&lt;br /&gt;
Shell integration is neat. No noise in diff view. Advantage with reference view and edited view.&lt;br /&gt;
&lt;br /&gt;
So far so good.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9122784-5172344204422932678?l=sriharshavardhan.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/aOQhNAup0WOvYvbps3DhBiYj8CA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/aOQhNAup0WOvYvbps3DhBiYj8CA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/aOQhNAup0WOvYvbps3DhBiYj8CA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/aOQhNAup0WOvYvbps3DhBiYj8CA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/SriharshaVardhan/~4/aVxiQ-9W61M" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sriharshavardhan.blogspot.com/feeds/5172344204422932678/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9122784&amp;postID=5172344204422932678" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9122784/posts/default/5172344204422932678?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9122784/posts/default/5172344204422932678?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SriharshaVardhan/~3/aVxiQ-9W61M/changing-diffmerge-tool.html" title="Changing diff/merge tool" /><author><name>Sriharsha Vardhan</name><uri>https://profiles.google.com/100795286323098096475</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-WSRPdIrYars/AAAAAAAAAAI/AAAAAAAAAnQ/IB8E9VyRHns/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://sriharshavardhan.blogspot.com/2011/08/changing-diffmerge-tool.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0cAQHk6eyp7ImA9WhdSE00.&quot;"><id>tag:blogger.com,1999:blog-9122784.post-3559513962569146519</id><published>2011-07-22T07:42:00.001+05:30</published><updated>2011-07-22T07:47:21.713+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-22T07:47:21.713+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="User Experience" /><category scheme="http://www.blogger.com/atom/ns#" term=".Net" /><title>Devloping web2.0 user interface for self hosted WCF services using HTML5, CSS3 and JQuery</title><content type="html">&lt;p&gt;&lt;img src="http://www.codeproject.com/KB/WCF/WCFWebApp/WCFWebApp.gif" alt="WCFWebApp Image - maximum width is 600 pixels" width=575 height=480&gt;&lt;/p&gt;&lt;br /&gt;
&lt;a href="http://www.codeproject.com/KB/WCF/WCFWebApp.aspx"&gt;Link to article&lt;/a&gt;&lt;br /&gt;
&lt;h2&gt;Introduction&lt;/h2&gt;&lt;br /&gt;
&lt;p&gt;This article describes a method to utilize WCF self hosted services to be able to serve web 2.0 user interface as well as web services.&lt;/p&gt;&lt;p&gt;By using this method tools or applications can be built using web 2.0 technologies like HTML5, CSS3 with self hosted WCF service as backend business layer. Thus developers can benefit from advanced javascript libraries like JQuery or Underscore etc.. to build user interface. This eliminates need to install .Net framework on client machines.&lt;/p&gt;&lt;p&gt;Traditionally self hosted WCF services has user interface built using WinForms and WPF technologies. And to be able to use browser as UI platform ASP.Net and IIS becomes hard dependencies. For tools and applications which typically are executed out of a single machine or intranet with limited users, IIS is considered as an overkill. Thus browser as a UI plarform with HTML5, CSS3 and backed by powerful javascript engines is very promising option for self hosted WCF services.&lt;/p&gt;&lt;br /&gt;
&lt;h2&gt;Background&lt;/h2&gt;&lt;br /&gt;
&lt;p&gt;Intial versions of WCF could only work with SOAP messages. With bindings like WebHttpBinding from .Net3.5 onwards WCF could offer direct support to consume web services from ajax calls from javascript. However consuming dataformats like JSON is still not so much so an out of box experience. Effort to write DataContracts for every argument and return types is quite high. And with other data formats like XML, client end couldn't directly benefit from javascript libraries due to extra step involved to convert from XML to JSON.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;This method considers 'Stream' as input and out type for UI interfacing operations. It also supports basic authentication which can be extented for advanced usage. And no customization is done at any layer and just works based on out of box features of WCF in .Net 3.5. This can also be used with .Net 4.0. However for &lt;a href="http://james.newtonking.com/pages/json-net.aspx"&gt;JSON.Net&lt;/a&gt; is used to format json objects.&lt;/p&gt;&lt;br /&gt;
&lt;h2&gt;Using the code&lt;/h2&gt;&lt;br /&gt;
&lt;p&gt;Download and build source. You can use Visual Studio 2010 or VS command line. (Code is built for .Net 4.0 but can be used with .Net 3.5 also)&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Start WCFWebApp.exe. If port 2011 is not free, change to different port. And you need admin previleges&lt;/li&gt;
&lt;li&gt;When server is running, open any browser with javascript support and navigate to "http:/&lt;machinename&gt;:&lt;port&gt;/index.htm"&lt;/li&gt;
&lt;li&gt;Enter username # 'user' and password # 'pass' and click on login. You will login and an about page is loaded&lt;/li&gt;
&lt;li&gt;Click on States link&lt;/li&gt;
&lt;li&gt;Check on visited option for any state and click on Update&lt;/li&gt;
&lt;li&gt;Change page to About and come back to States and observe that last selection is perisisted.&lt;/li&gt;
&lt;li&gt;Click on 'Logout' on right top corner.&lt;/li&gt;
&lt;/ol&gt;&lt;br /&gt;
&lt;p&gt;All these operations are run out of a self hosted WCF service. And this demonstrated features like authentication, fetching static files, getting as well as setting and data. Following sections walk through code.&lt;/p&gt;&lt;br /&gt;
&lt;h3&gt;Server code&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;Main class just starts a WCF service using WebHttpBinding and WebServiceHost.&lt;/p&gt;&lt;pre&gt;class Program
  {
    static void Main(string[] args)
    {            
      string baseAddress = "http://" + Environment.MachineName + ":2011/";
      using (WebServiceHost host = new WebServiceHost(typeof(WebApp), new Uri(baseAddress)))
      {
        WebHttpBinding binding = new WebHttpBinding();
        host.AddServiceEndpoint(typeof(IWCFWebApp01), binding, "").Behaviors.Add(new WebHttpBehavior());
        host.Open();
        ... other lines left for brevity
      }
    }
  }
&lt;/pre&gt;&lt;br /&gt;
&lt;p&gt;Service contract defines a method 'Files' to serve all static html files, another method 'Links' serves all linked files like javascript, stylesheets and data. Other resources like login. logout, States and State are service operations. Observable point here is 'Stream' data type for input as well as output.&lt;/p&gt;&lt;pre&gt;[ServiceContract]
    public interface IWCFWebApp01
    {
      [OperationContract, WebGet(UriTemplate = "/{resource}.{extension}")]
        Stream Files(string resource, string extension);

      [OperationContract, WebGet(UriTemplate = "/{path}/{resource}.{extension}")]
        Stream Links(string path, string resource, string extension);

      [OperationContract, WebInvoke(Method = "POST", UriTemplate = "/login")]
        Stream Login(Stream request);

      [OperationContract, WebInvoke(Method = "POST", UriTemplate = "/logout")]
        Stream Logout(Stream request);

      [OperationContract, WebGet(UriTemplate = "/states")]
        Stream States();

      [OperationContract, WebInvoke(Method = "POST", UriTemplate = "/state")]
        Stream State(Stream request);
    }
&lt;/pre&gt;&lt;br /&gt;
&lt;p&gt;Now coming to service implementation. As this method is primarily intented for self hoseted WCF services, singleton isntance with concurrent threads is good enough. Consider sessions as applicable. But unlike IIS hosted services, self hosted services would nomally serve limited users and thus default concurrency is good enough. And on functional line constructor is just loading data onto local member.&lt;/p&gt;&lt;pre&gt;[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,ConcurrencyMode=ConcurrencyMode.Multiple)]
    public class WebApp : IWCFWebApp01
  {
    JObject states;

    public WebApp()
    {
      if (states==null)
        states = JObject.Parse(File.ReadAllText("web\\data\\states.json"));
    }

    ... other lines left for brevity

  }
&lt;/pre&gt;&lt;br /&gt;
&lt;p&gt;Now that server is running, when user tries to access for the first time, several htm, css and javascript files are served. &lt;br /&gt;
These are handled by methods 'Files' and 'Links'. Links are files refered in index.htm in head section like JQuery. And in 'Files' method different types of files are picked up from seperate folders based on extension. Switch cases can be extended based types of files.&lt;/p&gt;&lt;pre&gt;public Stream Links(string path, string resource, string extension)
    {
       ... other lines left for brevity
    }

    public Stream Files(string resource, string extension)
    {
      switch (extension)
      {
        case "htm":
           ... other lines left for brevity
        case "js":
           ... other lines left for brevity
      }
    }
&lt;/pre&gt;&lt;br /&gt;
&lt;p&gt;When user makes a login request, basic authentication token is sent in standard header "Authorization".&lt;br /&gt;
That is validated in a seperate method 'Authenticate' described later. Also username is sent as JSON object in request stream which is parsed into JSON object using JSON.Net library. Logout method is similar to login&lt;/p&gt;&lt;pre&gt;public Stream Login(Stream request)
    {
      if (!Authenticate()) return null;
         ... other lines left for brevity
      JObject o = JObject.Parse(data);
    }
&lt;/pre&gt;&lt;br /&gt;
&lt;p&gt;When user clicks on 'States' request reaches following method. &lt;br /&gt;
As this resource doesn't have any extension, request will not go through 'Files' method. Here request is authenticated and data is sent from member variable.&lt;/p&gt;&lt;pre&gt;public Stream States()
    {
      if (!Authenticate()) return null;

      WebOperationContext.Current.OutgoingResponse.ContentType = "application/json";
      return new MemoryStream(Encoding.ASCII.GetBytes(states.ToString()),false);
    }
&lt;/pre&gt;&lt;br /&gt;
&lt;p&gt;When user does a modification and clicks on 'Update', following method would be invoked. This parses state id and update class member variable and returns updated list back to client.&lt;/p&gt;&lt;pre&gt;public Stream State(Stream request)
    {
      ... other lines left for brevity
      JObject data = JObject.Parse(new string(buffer));
      int id = ((int)data["id"]) -1;
      states["states"][id]["visited"] = true;

      return States();
    }
&lt;/pre&gt;&lt;br /&gt;
&lt;p&gt;Authentication. Methods which require authorization invokes following method.&lt;/p&gt;&lt;pre&gt;public bool Authenticate()
    {
      string userName = "user";
      string password = "pass";

      string basicAuthCode = Convert.ToBase64String (Encoding.ASCII.GetBytes (string. Format ("{0}: {1}", userName, password)));
      string token = WebOperationContext.Current.IncomingRequest.Headers["Authorization"];
      if (token.Contains(basicAuthCode))
      {
        return true;
      }
      else
      {
        WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.Unauthorized;
        return false;
      }
    }
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Client code&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;Client code is placed in seperate folder by name 'web'. At the root of this folder all static htm files are placed. And seperate sub-folders are included for images, javascript and stylesheets. These are refered from 'Files' method in server code based on extension.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Client follows &lt;a href="http://en.wikipedia.org/wiki/Single-page_application"&gt;Single Page Application&lt;/a&gt; design. Thus only 'index.htm' is a full html page. Other html files are filled into 'content' division using ajax calls as shown below for states&lt;/p&gt;&lt;pre&gt;function StatesPage () {
  this.loadStatesPage = function (data) {
    content = undefined;
    $.each (data, function (index, value) {
      if (data[index]["id"]=="content") {
        content = data[index].innerHTML;
        $("#content")[0].innerHTML = content;
        $("#b_update")[0].onclick = updateStates;
        loadStatesTable();
      }
    });
    if (content == undefined) {alert("Failed to load page: Content missing"); return;} 
  }
      ... other lines left for brevity
}
&lt;/pre&gt;&lt;br /&gt;
&lt;p&gt;Authentication: Client side authentication token is in login class. This token is added in header section in 'beforeSend' function of each call after login. Other code in client requires understanding abour Jquery, javascript and ajax concepts which is well explained on web.&lt;/p&gt;&lt;br /&gt;
&lt;h2&gt;Points of Interest&lt;/h2&gt;&lt;br /&gt;
&lt;p&gt;If windows authentication is required, service host can be customized&lt;/p&gt;&lt;p&gt;More structured javascript libraries with MVC architecture can also be used without making any change to server side code.&lt;/p&gt;&lt;p&gt;Consider using JQuery UI plugins for common look and feel&lt;/p&gt;&lt;p&gt;As UI is browser based, extending UI for handheld devices becomes quite easy. &lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul class=download&gt;&lt;li&gt;&lt;a href="http://www.codeproject.com/KB/WCF/WCFWebApp/WCFWebApp.zip"&gt;Download source - 270 Kb&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9122784-3559513962569146519?l=sriharshavardhan.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/k6YDyR2TI6iSW8_eVB8ugHiACus/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/k6YDyR2TI6iSW8_eVB8ugHiACus/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/k6YDyR2TI6iSW8_eVB8ugHiACus/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/k6YDyR2TI6iSW8_eVB8ugHiACus/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/SriharshaVardhan/~4/dwfQGJpTq9c" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sriharshavardhan.blogspot.com/feeds/3559513962569146519/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9122784&amp;postID=3559513962569146519" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9122784/posts/default/3559513962569146519?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9122784/posts/default/3559513962569146519?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SriharshaVardhan/~3/dwfQGJpTq9c/devloping-web20-user-interface-for-self.html" title="Devloping web2.0 user interface for self hosted WCF services using HTML5, CSS3 and JQuery" /><author><name>Sriharsha Vardhan</name><uri>https://profiles.google.com/100795286323098096475</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-WSRPdIrYars/AAAAAAAAAAI/AAAAAAAAAnQ/IB8E9VyRHns/s512-c/photo.jpg" /></author><thr:total>0</thr:total><georss:featurename>Bengaluru, Karnataka, India</georss:featurename><georss:point>12.9715987 77.59456269999998</georss:point><georss:box>12.7518902 77.34282119999999 13.191307199999999 77.84630419999998</georss:box><feedburner:origLink>http://sriharshavardhan.blogspot.com/2011/07/devloping-web20-user-interface-for-self.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE4NR3s6eyp7ImA9WhZWE0U.&quot;"><id>tag:blogger.com,1999:blog-9122784.post-3131424523136983850</id><published>2011-05-14T19:53:00.000+05:30</published><updated>2011-05-14T19:53:16.513+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-14T19:53:16.513+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="MobileComputing" /><title>Off line access and chromebooks</title><content type="html">Just curious to know, how to perceive on local storage and off line access of chrome books. Chrome is HTML 5 compliant and thus every site can leverage local storage, session storage and web SQL anyway. And I guess web SQL in chrome is nothing but a SQLITE instance. When all you can do is accessed through browser and each site having a site specific solution, is there still any need for disk storage on chrome books? If yes what could be that scenario?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9122784-3131424523136983850?l=sriharshavardhan.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/c82hKAvzKav6CCWf2mKUEfodLEA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/c82hKAvzKav6CCWf2mKUEfodLEA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/c82hKAvzKav6CCWf2mKUEfodLEA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/c82hKAvzKav6CCWf2mKUEfodLEA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/SriharshaVardhan/~4/hh95JUb9Kxo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sriharshavardhan.blogspot.com/feeds/3131424523136983850/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9122784&amp;postID=3131424523136983850" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9122784/posts/default/3131424523136983850?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9122784/posts/default/3131424523136983850?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SriharshaVardhan/~3/hh95JUb9Kxo/off-line-access-and-chromebooks.html" title="Off line access and chromebooks" /><author><name>Sriharsha Vardhan</name><uri>https://profiles.google.com/100795286323098096475</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-WSRPdIrYars/AAAAAAAAAAI/AAAAAAAAAnQ/IB8E9VyRHns/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://sriharshavardhan.blogspot.com/2011/05/off-line-access-and-chromebooks.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0UGQ389cCp7ImA9WhZXGUg.&quot;"><id>tag:blogger.com,1999:blog-9122784.post-6396492511267759658</id><published>2011-05-09T22:10:00.001+05:30</published><updated>2011-05-09T22:10:22.168+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-09T22:10:22.168+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="User Experience" /><title>Reusability and user experience</title><content type="html">Reusability&lt;br /&gt;
&lt;br /&gt;
Are you finding a phenomenon like use and throw with software applications?&lt;br /&gt;
&lt;br /&gt;
Do you have anything about one time usability of applications? Often I get trickled about usability and reusability. An year back I was advised to emphasize more and more on usability and if at all I could build something reusable in it, it is just out of luck.&lt;br /&gt;
&lt;br /&gt;
With rapid development frameworks and high fidelity needs designing anything for reuse is nothing but being stereotyped. There were times when reusability was discussed at every stage of development life cycle. Tools and technologies of those times asked for it. But we built runtime frameworks like Java, .Net etc. They are offering well tested reusable code for every possible computational need. Now what we are building is, nothing but application specific functional codebase. And there could only be a marginal scope  in it for reusable design. There is still scope but it is significantly low. That raises a question on what should be the strategy with respect to reusability in design. &lt;br /&gt;
&lt;br /&gt;
Another aspect is rapid prototyping,  dynamic languages, shorter delivery cycles, built-in user accepted mechanisms for application upgrades, well informed user, UX demanding networked systems. &lt;br /&gt;
&lt;br /&gt;
We are not building isolated apps like calculator and paint anymore. Even configuration, profiling and diagnostic tools are networked. &lt;br /&gt;
&lt;br /&gt;
And it is UX that matters at the end of the day. Now UX is a subject of taste for same need like hunger. It can't be same dish for breakfast, lunch and dinner. Then where is reusability in application development. Just like food need to be consumed while it remains fresh, app remains fresh for sometime only. &lt;br /&gt;
&lt;br /&gt;
With this background we need to adopt new strategies. It goes like software offers solutions for several problems surrounding human livelihood; but at the same it solves its own problems by looking at patterns of real world.&lt;br /&gt;
&lt;br /&gt;
How does fabric design industry solve this problem. How does chefs solve and what entertainment industry does. And now the gadgets. &lt;br /&gt;
&lt;br /&gt;
Apps markets solved one side of this problem. Gone are the days where Microsoft builts one app to suit needs of whole world. Now there are several options for same need like calendar in markets. There is no one size fit for all. Yes there are some mostly downloaded apps. But there are several others too. Each one suits for someones taste. &lt;br /&gt;
&lt;br /&gt;
With markets gadget builders shielded themselves to great extent. Now they can concentrate on building just the platform. &lt;br /&gt;
&lt;br /&gt;
Now that leaves other side of the story up for discussion. What is in it for app developer with respect to reuasability.&lt;br /&gt;
&lt;br /&gt;
1) Nurture multiple design options. Don't throw away anything just because it is not the best. More the time you spend time with need of the app the more you would meet expectations of broader userbase. &lt;br /&gt;
Nurture multiple designs thinking that you are rich enough to build against each design. This is what fabric industry do.&lt;br /&gt;
&lt;br /&gt;
Here you reuse understanding about characteristics of product for building against multiple designs rather reusing design.&lt;br /&gt;
&lt;br /&gt;
2) Integrate services not userbase. Calendar app for world cup season is different from calendar app for competitive exams. Now you can build multiple views in same app. But building two distinct apps solves the problem in better way because the intended users are different even though program constructional aspects are same. Same story is told as book, documentary, movie etc..&lt;br /&gt;
&lt;br /&gt;
3) Build reusable software just for multiple versions of same application than new application. Cost of building and maintaining reusable components is not economical anymore. As mentioned earlier there shouldn't be any hour spent specially to build a reusable component for next project. Moreover app development on different design is cheaper than maintenance. Most of the reusable stuff is used in enhancements than new development.  &lt;br /&gt;
&lt;br /&gt;
4) Let users know the makers signature rather than technology. There is nothing called reusability of UX. It's called copyright violation. Tree controls are not looking like traditional tree controls, combo boxes are presented in so many ways where it's difficult to make it out as CB. So spend time to give facelist to your primitive controls for application specific look and feel. Your app should look like what it is meant for rather than Java app or winforms or wpf or PHP. You are not selling app to procurement manager or dealer. So there no one to  market your app. It should market for itself.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9122784-6396492511267759658?l=sriharshavardhan.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/rQ8nTE5mxdmJNcp3R7b1rR56KrA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/rQ8nTE5mxdmJNcp3R7b1rR56KrA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/rQ8nTE5mxdmJNcp3R7b1rR56KrA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/rQ8nTE5mxdmJNcp3R7b1rR56KrA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/SriharshaVardhan/~4/58mm4xl9stM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sriharshavardhan.blogspot.com/feeds/6396492511267759658/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9122784&amp;postID=6396492511267759658" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9122784/posts/default/6396492511267759658?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9122784/posts/default/6396492511267759658?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SriharshaVardhan/~3/58mm4xl9stM/reusability-and-user-experience.html" title="Reusability and user experience" /><author><name>Sriharsha Vardhan</name><uri>https://profiles.google.com/100795286323098096475</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-WSRPdIrYars/AAAAAAAAAAI/AAAAAAAAAnQ/IB8E9VyRHns/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://sriharshavardhan.blogspot.com/2011/05/reusability-and-user-experience.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0EESHk6fip7ImA9WhZQFE4.&quot;"><id>tag:blogger.com,1999:blog-9122784.post-8193841281655327767</id><published>2011-04-22T06:56:00.000+05:30</published><updated>2011-04-22T06:56:49.716+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-22T06:56:49.716+05:30</app:edited><title>Automation Conference | ABB Automation &amp; Power World 2011 | Control Global</title><content type="html">&lt;a href="http://www.controlglobal.com/articles/2011/ABB2011_APW1.html"&gt;Automation Conference | ABB Automation &amp;amp; Power World 2011 | Control Global&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9122784-8193841281655327767?l=sriharshavardhan.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/lIqovbkonMWBKT31lkLey0UJ56A/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/lIqovbkonMWBKT31lkLey0UJ56A/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/lIqovbkonMWBKT31lkLey0UJ56A/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/lIqovbkonMWBKT31lkLey0UJ56A/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/SriharshaVardhan/~4/2pj6yNdV3wU" height="1" width="1"/&gt;</content><link rel="related" href="http://www.controlglobal.com/articles/2011/ABB2011_APW1.html" title="Automation Conference | ABB Automation &amp; Power World 2011 | Control Global" /><link rel="replies" type="application/atom+xml" href="http://sriharshavardhan.blogspot.com/feeds/8193841281655327767/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9122784&amp;postID=8193841281655327767" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9122784/posts/default/8193841281655327767?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9122784/posts/default/8193841281655327767?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SriharshaVardhan/~3/2pj6yNdV3wU/automation-conference-abb-automation.html" title="Automation Conference | ABB Automation &amp; Power World 2011 | Control Global" /><author><name>Sriharsha Vardhan</name><uri>https://profiles.google.com/100795286323098096475</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-WSRPdIrYars/AAAAAAAAAAI/AAAAAAAAAnQ/IB8E9VyRHns/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://sriharshavardhan.blogspot.com/2011/04/automation-conference-abb-automation.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C04BQnczeCp7ImA9Wx5aF08.&quot;"><id>tag:blogger.com,1999:blog-9122784.post-1255023859310224781</id><published>2010-11-14T13:13:00.001+05:30</published><updated>2010-11-14T13:35:53.980+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-11-14T13:35:53.980+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="general" /><title>Windows live services</title><content type="html">&lt;p class="mobile-photo"&gt;&lt;a href="http://4.bp.blogspot.com/_jTgxIdWKG4s/TN-TEAuWY2I/AAAAAAAAAig/8zQvRd2_E50/s1600/Skydrive-792141.png"&gt;&lt;img src="http://4.bp.blogspot.com/_jTgxIdWKG4s/TN-TEAuWY2I/AAAAAAAAAig/8zQvRd2_E50/s320/Skydrive-792141.png"  border="0" alt="" id="BLOGGER_PHOTO_ID_5539307763812164450" /&gt;&lt;/a&gt;&lt;/p&gt;eeks&lt;p&gt;this is how skydrive partal shows up this morning. Windows live gone&lt;br&gt;for a toss today.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9122784-1255023859310224781?l=sriharshavardhan.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/3jiZhKgbZAhypt50URSOS8gY9WY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3jiZhKgbZAhypt50URSOS8gY9WY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/3jiZhKgbZAhypt50URSOS8gY9WY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3jiZhKgbZAhypt50URSOS8gY9WY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/SriharshaVardhan/~4/Mv9hUupXiaQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sriharshavardhan.blogspot.com/feeds/1255023859310224781/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9122784&amp;postID=1255023859310224781" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9122784/posts/default/1255023859310224781?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9122784/posts/default/1255023859310224781?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SriharshaVardhan/~3/Mv9hUupXiaQ/windows-live-services.html" title="Windows live services" /><author><name>Sriharsha Vardhan</name><uri>https://profiles.google.com/100795286323098096475</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-WSRPdIrYars/AAAAAAAAAAI/AAAAAAAAAnQ/IB8E9VyRHns/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_jTgxIdWKG4s/TN-TEAuWY2I/AAAAAAAAAig/8zQvRd2_E50/s72-c/Skydrive-792141.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://sriharshavardhan.blogspot.com/2010/11/windows-live-services.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0ANQHcyfip7ImA9WxFVFUo.&quot;"><id>tag:blogger.com,1999:blog-9122784.post-8809696879388559716</id><published>2010-06-15T10:59:00.001+05:30</published><updated>2010-06-15T10:59:51.996+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-06-15T10:59:51.996+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="general" /><title>Back to blog</title><content type="html">&lt;p&gt;Breaking silence. As new means of sharing information like twitter, wave, buzz etc.. came out I thought blog is kind of out dated platform. But I am not finding them as a perfect alternative thus thought of resuming blogging again.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9122784-8809696879388559716?l=sriharshavardhan.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/XDpaZmSU1SnDJeRBAAQPUZFhyCA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/XDpaZmSU1SnDJeRBAAQPUZFhyCA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/XDpaZmSU1SnDJeRBAAQPUZFhyCA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/XDpaZmSU1SnDJeRBAAQPUZFhyCA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/SriharshaVardhan/~4/75-vwIOYP5w" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sriharshavardhan.blogspot.com/feeds/8809696879388559716/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9122784&amp;postID=8809696879388559716" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9122784/posts/default/8809696879388559716?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9122784/posts/default/8809696879388559716?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SriharshaVardhan/~3/75-vwIOYP5w/back-to-blog.html" title="Back to blog" /><author><name>Sriharsha Vardhan</name><uri>https://profiles.google.com/100795286323098096475</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-WSRPdIrYars/AAAAAAAAAAI/AAAAAAAAAnQ/IB8E9VyRHns/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://sriharshavardhan.blogspot.com/2010/06/back-to-blog.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D04NR3g8eSp7ImA9WxBRFU0.&quot;"><id>tag:blogger.com,1999:blog-9122784.post-704699252194109215</id><published>2010-01-03T13:36:00.002+05:30</published><updated>2010-01-03T13:36:36.671+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-03T13:36:36.671+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="general" /><title>Happy New Year 2010</title><content type="html">&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 12px;"&gt;Wish you and your family a very Happy, Prosperous and Cheerful Newyear 2010.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9122784-704699252194109215?l=sriharshavardhan.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/j0nmUlKsHPMocloJCm1kXOt4iVM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/j0nmUlKsHPMocloJCm1kXOt4iVM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/j0nmUlKsHPMocloJCm1kXOt4iVM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/j0nmUlKsHPMocloJCm1kXOt4iVM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/SriharshaVardhan/~4/67qSyxM1_1A" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sriharshavardhan.blogspot.com/feeds/704699252194109215/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9122784&amp;postID=704699252194109215" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9122784/posts/default/704699252194109215?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9122784/posts/default/704699252194109215?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SriharshaVardhan/~3/67qSyxM1_1A/happy-new-year-2010.html" title="Happy New Year 2010" /><author><name>Sriharsha Vardhan</name><uri>https://profiles.google.com/100795286323098096475</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-WSRPdIrYars/AAAAAAAAAAI/AAAAAAAAAnQ/IB8E9VyRHns/s512-c/photo.jpg" /></author><thr:total>3</thr:total><feedburner:origLink>http://sriharshavardhan.blogspot.com/2010/01/happy-new-year-2010.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk4CRns6eip7ImA9WxBSGUo.&quot;"><id>tag:blogger.com,1999:blog-9122784.post-5557810025225355154</id><published>2009-12-28T10:06:00.001+05:30</published><updated>2009-12-28T10:06:07.512+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-28T10:06:07.512+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term=".Net" /><title>ArraySegment&lt;T&gt; Class</title><content type="html">&lt;p&gt;Somehow I missed such a useful class in .Net framework this now. This class is useful when we are working on one dimensional arrays and need to segment arrays.&lt;/p&gt;  &lt;p&gt;One quick use case is network packets. Where we will allocate buffer upfront and fill segments to form a packet.&lt;/p&gt;  &lt;p&gt;Good part of this class is multiple arraysegment objects can refer to same instance of array. Mean what we get is reference to original object rather than a copy. Any updates to segment will automatically update original array.&lt;/p&gt;  &lt;p&gt;Isn’t useful? I feel so.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9122784-5557810025225355154?l=sriharshavardhan.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/EyvDTZc6icMrSR7vvA7BK9Oc3V0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/EyvDTZc6icMrSR7vvA7BK9Oc3V0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/EyvDTZc6icMrSR7vvA7BK9Oc3V0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/EyvDTZc6icMrSR7vvA7BK9Oc3V0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/SriharshaVardhan/~4/3RTxOAwh2y4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sriharshavardhan.blogspot.com/feeds/5557810025225355154/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9122784&amp;postID=5557810025225355154" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9122784/posts/default/5557810025225355154?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9122784/posts/default/5557810025225355154?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SriharshaVardhan/~3/3RTxOAwh2y4/arraysegment-class.html" title="ArraySegment&amp;lt;T&amp;gt; Class" /><author><name>Sriharsha Vardhan</name><uri>https://profiles.google.com/100795286323098096475</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-WSRPdIrYars/AAAAAAAAAAI/AAAAAAAAAnQ/IB8E9VyRHns/s512-c/photo.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://sriharshavardhan.blogspot.com/2009/12/arraysegment-class.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU8GQX8yeSp7ImA9WxBSEk4.&quot;"><id>tag:blogger.com,1999:blog-9122784.post-4060046617974814211</id><published>2009-12-19T21:16:00.002+05:30</published><updated>2009-12-19T21:20:20.191+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-19T21:20:20.191+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="IronRuby" /><title>Hosting IronRuby in MSBuild</title><content type="html">&lt;p&gt;This post builds on earlier post in this series and provides a mechanism to host IronRuby in MSBuild.&lt;/p&gt;  &lt;h1&gt;Basics of MSBuild&lt;/h1&gt;  &lt;p&gt;A very brief introduction of MSBuild is present here. MSBuild is a modern build file format built on XML technologies.  &lt;br /&gt;Important components of MSBuild are&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Project &lt;/li&gt;    &lt;li&gt;Target &lt;/li&gt;    &lt;li&gt;Task &lt;/li&gt;    &lt;li&gt;ItemGroup &lt;/li&gt;    &lt;li&gt;PropertyGroup &lt;/li&gt;    &lt;li&gt;Imports &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Project stands as root element with a default namespace declaration. Find declaration in following example &lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Project &lt;/span&gt;&lt;span style="color:red;"&gt;DefaultTargets &lt;/span&gt;&lt;span style="color:blue;"&gt;= &lt;/span&gt;"&lt;span style="color:blue;"&gt;HelloMSBuild&lt;/span&gt;"&lt;br /&gt;   &lt;span style="color:red;"&gt;xmlns&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;http://schemas.microsoft.com/developer/msbuild/2003&lt;/span&gt;" &lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;In this DefaultTargets attribute is of interest. Target is the set of actions that msbuild will perform against the project by default.&lt;br /&gt;&lt;br /&gt;To understand better let us create a sample project by name &lt;em&gt;“test.msproj”.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;1) Create a new text file&lt;br /&gt;  &lt;br /&gt;2) Add Project element as shown above&lt;br /&gt;  &lt;br /&gt;3) Add target ‘HelloMSBuild’ as shown below&lt;/em&gt;&lt;/p&gt;&lt;pre class="prettyprint"&gt;&amp;lt;Project DefaultTargets = "SayHello"&lt;br /&gt; xmlns="http://schemas.microsoft.com/developer/msbuild/2003" &amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;Target Name="SayHello"&amp;gt;&lt;br /&gt;  &amp;lt;Message Text="Hello MSBuild" /&amp;gt;&lt;br /&gt; &amp;lt;/Target&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/Project&amp;gt;&lt;br /&gt;&lt;span class="Apple-style-span"   style="font-family:Georgia, serif;font-size:130%;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px; white-space: normal;"&gt;&lt;span class="Apple-style-span"   style="font-family:monospace;font-size:100%;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; white-space: pre;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;From visual studio command prompt run “msbuild test.msproj”. That is the simplest helloworld with MSBuild where target executes only task “Message”. “Message” is a built-in task. Built-in tasks are included by default. Thus we don’t find any declaration about where Message task is defined.&lt;/p&gt;&lt;p&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Project &lt;/span&gt;&lt;span style="color:red;"&gt;DefaultTargets &lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;Lab02&lt;/span&gt;"&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:red;"&gt;xmlns&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;http://schemas.microsoft.com/developer/msbuild/2003&lt;/span&gt;" &lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;  &lt;br /&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;  &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ItemGroup&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;  &lt;br /&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Items &lt;/span&gt;&lt;span style="color:red;"&gt;Include&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;Item1&lt;/span&gt;"  &lt;span style="color:blue;"&gt;/&amp;gt;&lt;br /&gt;  &lt;br /&gt;    &amp;lt;&lt;span style="color:#a31515;"&gt;Items&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;Include&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;Item2&lt;/span&gt;" &lt;span style="color:blue;"&gt;/&amp;gt;&lt;br /&gt;  &lt;br /&gt;  &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ItemGroup&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;  &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;PropertyGroup&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;  &lt;br /&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;PropertyA&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;Property1&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;PropertyA&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;  &lt;br /&gt;  &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;PropertyGroup&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;          &lt;br /&gt;  &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Target&lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:#0000ff;"&gt;Lab02&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Message &lt;/span&gt;&lt;span style="color:red;"&gt;Text&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;$(&lt;span style="color:#a31515;"&gt;PropertyA&lt;/span&gt;)&lt;/span&gt;"&lt;span style="color:blue;"&gt;/&amp;gt;&lt;br /&gt;  &lt;br /&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Message &lt;/span&gt;&lt;span style="color:red;"&gt;Text&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;@(Items)&lt;/span&gt;"&lt;span style="color:blue;"&gt;/&amp;gt;&lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;  &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Target&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;  &lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Project&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;   &lt;/span&gt; &lt;br /&gt;That gives a basic idea about using items and properties. A project can contain more than on ItemGroup elements. All items in ItemGroup must be of same type. In this case they are of “Items”. But a different ItemGroup can contain different kind of elements. We can only refer to items as a group. In this case we referred them @(Items). But properties can be referred individually. Actually we can refer to properties individually only. Format to access a property is $(PropertyName).&lt;/p&gt;&lt;p&gt;So far we have see built-in task “Message”. Now let us see how to build a custom task&lt;/p&gt;&lt;h1&gt;Getting started with Custom Task&lt;/h1&gt;&lt;p&gt;Here I describe the procedure to build a custom task by name SimpleTask. This task does nothing fancy, but this exercise provides some insight about working with custom tasks. Look at MyTasks01.dll custom task. And we are using UsingTask option to refer to custom task.&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Project &lt;/span&gt;&lt;span style="color:red;"&gt;DefaultTargets &lt;/span&gt;&lt;span style="color:blue;"&gt;= &lt;/span&gt;"&lt;span style="color:blue;"&gt;CreateDirectory&lt;/span&gt;"&lt;br /&gt;   &lt;span style="color:red;"&gt;xmlns&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;http://schemas.microsoft.com/developer/msbuild/2003&lt;/span&gt;" &lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;UsingTask &lt;/span&gt;&lt;span style="color:red;"&gt;AssemblyFile&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;D:\MsBuildTasks\MyTask01.dll&lt;/span&gt;" &lt;span style="color:red;"&gt;TaskName&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;SimpleTask&lt;/span&gt;"&lt;span style="color:blue;"&gt;/&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ItemGroup&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;   &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Param &lt;/span&gt;&lt;span style="color:red;"&gt;Include&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;Param1&lt;/span&gt;" &lt;span style="color:blue;"&gt;/&amp;gt;&lt;br /&gt;   &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Param &lt;/span&gt;&lt;span style="color:red;"&gt;Include&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;Param2&lt;/span&gt;" &lt;span style="color:blue;"&gt;/&amp;gt;&lt;br /&gt; &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ItemGroup&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;PropertyGroup&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;   &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Param3&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;Param3&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Param3&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt; &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;PropertyGroup&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;PropertyGroup&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;   &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Status &lt;/span&gt;&lt;span style="color:blue;"&gt;/&amp;gt;&lt;br /&gt; &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;PropertyGroup&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Target &lt;/span&gt;&lt;span style="color:red;"&gt;Name &lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;CreateDirectory&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;   &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;SimpleTask &lt;/span&gt;&lt;span style="color:red;"&gt;MyProperty &lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;@(Param)&lt;/span&gt;" &lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;     &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Output &lt;/span&gt;&lt;span style="color:red;"&gt;TaskParameter&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;MyMessage&lt;/span&gt;" &lt;span style="color:red;"&gt;PropertyName&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;Status&lt;/span&gt;"&lt;span style="color:blue;"&gt;/&amp;gt;&lt;br /&gt;   &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;SimpleTask&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;   &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Message &lt;/span&gt;&lt;span style="color:red;"&gt;Text&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;$(Status)&lt;/span&gt;"&lt;span style="color:blue;"&gt;/&amp;gt;&lt;br /&gt;&lt;br /&gt;   &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;SimpleTask &lt;/span&gt;&lt;span style="color:red;"&gt;MyProperty &lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;$(Param3)&lt;/span&gt;" &lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;     &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Output &lt;/span&gt;&lt;span style="color:red;"&gt;TaskParameter&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;MyMessage&lt;/span&gt;" &lt;span style="color:red;"&gt;PropertyName&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;Status&lt;/span&gt;"&lt;span style="color:blue;"&gt;/&amp;gt;&lt;br /&gt;   &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;SimpleTask&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;   &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Message &lt;/span&gt;&lt;span style="color:red;"&gt;Text&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;$(Status)&lt;/span&gt;"&lt;span style="color:blue;"&gt;/&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Target&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Project&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;span class="Apple-style-span"    style="font-family:Georgia, serif;font-size:130%;color:#000000;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px; white-space: normal;"&gt;&lt;span class="Apple-style-span"    style="font-family:monospace;font-size:100%;color:#0000FF;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; white-space: pre;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;Alternative approach for UsingTask is importing external project as a whole. Sometimes this would be useful as the task needs more specific parameters or item groups. In such case all those parameters and item groups can be defined in external project and imported as a whole. To do this create a file by name “MyTasks.Targets” in same directory as task MyTask01.dll.&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Project &lt;/span&gt;&lt;span style="color:red;"&gt;xmlns&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;http://schemas.microsoft.com/developer/msbuild/2003&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;   &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;UsingTask &lt;/span&gt;&lt;span style="color:red;"&gt;AssemblyFile&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;D:\MsBuildTasks\MyTask01.dll&lt;/span&gt;" &lt;span style="color:red;"&gt;TaskName&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;SimpleTask&lt;/span&gt;"&lt;span style="color:blue;"&gt;/&amp;gt;&lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Project&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;And to import this file in project file replace &lt;em&gt;UsingTask &lt;/em&gt;element with&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Import &lt;/span&gt;&lt;span style="color:red;"&gt;Project&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;D:\MsBuildTasks\MyTasks.Targets&lt;/span&gt;"&lt;span style="color:blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;h2&gt;Building Custom Task&lt;/h2&gt;&lt;p&gt;Now let us see how to write a custom task. Create a library and refer to libraries (You can choose version 2.0 or 3.5)&lt;/p&gt;&lt;ol&gt;&lt;br /&gt; &lt;li&gt;Microsoft.Build.Framework&lt;/li&gt;  &lt;li&gt;Microsoft.Build.Utilities&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Then update class file as shown below&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;using &lt;/span&gt;Microsoft.Build.Framework;&lt;br /&gt;&lt;span style="color:blue;"&gt;using &lt;/span&gt;Microsoft.Build.Utilities;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;namespace &lt;/span&gt;MyTasks&lt;br /&gt;{&lt;br /&gt;   &lt;span style="color:blue;"&gt;public class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;SimpleTask &lt;/span&gt;: &lt;span style="color:#2b91af;"&gt;Task&lt;br /&gt;   &lt;/span&gt;{&lt;br /&gt;       &lt;span style="color:blue;"&gt;public override bool &lt;/span&gt;Execute()&lt;br /&gt;       {&lt;br /&gt;           &lt;span style="color:green;"&gt;//Parameters are semi column seperated values&lt;br /&gt;           &lt;/span&gt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;[] parameters = myProperty.Split(&lt;span style="color:#a31515;"&gt;';'&lt;/span&gt;);&lt;br /&gt;           &lt;span style="color:blue;"&gt;foreach &lt;/span&gt;(&lt;span style="color:blue;"&gt;string &lt;/span&gt;paramter &lt;span style="color:blue;"&gt;in &lt;/span&gt;parameters)&lt;br /&gt;               myMessage += paramter + &lt;span style="color:#a31515;"&gt;" - Done\n"&lt;/span&gt;;&lt;br /&gt;           &lt;span style="color:blue;"&gt;return true&lt;/span&gt;;&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       &lt;span style="color:blue;"&gt;private string &lt;/span&gt;myProperty;&lt;br /&gt;       &lt;span style="color:blue;"&gt;public string &lt;/span&gt;MyProperty&lt;br /&gt;       {&lt;br /&gt;           &lt;span style="color:blue;"&gt;get &lt;/span&gt;{ &lt;span style="color:blue;"&gt;return &lt;/span&gt;myProperty; }&lt;br /&gt;           &lt;span style="color:blue;"&gt;set &lt;/span&gt;{ myProperty = &lt;span style="color:blue;"&gt;value&lt;/span&gt;; }&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       &lt;span style="color:blue;"&gt;private string &lt;/span&gt;myMessage;&lt;br /&gt;       [&lt;span style="color:#2b91af;"&gt;Output&lt;/span&gt;]&lt;br /&gt;       &lt;span style="color:blue;"&gt;public string &lt;/span&gt;MyMessage&lt;br /&gt;       {&lt;br /&gt;           &lt;span style="color:blue;"&gt;get &lt;/span&gt;{ &lt;span style="color:blue;"&gt;return &lt;/span&gt;myMessage; }&lt;br /&gt;           &lt;span style="color:blue;"&gt;set &lt;/span&gt;{ myMessage = &lt;span style="color:blue;"&gt;value&lt;/span&gt;; }&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Here observe that we added ‘Output’ attribute to MyMessage. And that is taken into status property in output element of SimpleTask. Then the value is printed through Message task.&lt;/p&gt;&lt;p&gt;With this background about MSBuild, we can move to hosting IronRuby in MSBuild source.&lt;/p&gt;&lt;h1&gt;IronRuby Task&lt;/h1&gt;&lt;p&gt;This part creates a new task to host IronRuby Task.&lt;/p&gt;&lt;p&gt;Create a new class library. Add references to MSBuild libraries and IronRuby libraries which include&lt;/p&gt;&lt;p&gt;IronRuby, IronRuby.Libraries, Microsoft.Build.Framework, Microsoft.Build.Utilities.v3.5, Microsoft.Dynamic, Microsoft.Scripting, Microsoft.Scripting.Core.&lt;/p&gt;&lt;p&gt;Then replace source contents with following&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;using &lt;/span&gt;System;&lt;br /&gt;&lt;span style="color:blue;"&gt;using &lt;/span&gt;System.Collections.Generic;&lt;br /&gt;&lt;span style="color:blue;"&gt;using &lt;/span&gt;System.Linq;&lt;br /&gt;&lt;span style="color:blue;"&gt;using &lt;/span&gt;System.Text;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;using &lt;/span&gt;IronRuby;&lt;br /&gt;&lt;span style="color:blue;"&gt;using &lt;/span&gt;IronRuby.Runtime;&lt;br /&gt;&lt;span style="color:blue;"&gt;using &lt;/span&gt;Microsoft.Build.Framework;&lt;br /&gt;&lt;span style="color:blue;"&gt;using &lt;/span&gt;Microsoft.Build.Utilities;&lt;br /&gt;&lt;span style="color:blue;"&gt;using &lt;/span&gt;Microsoft.Scripting;&lt;br /&gt;&lt;span style="color:blue;"&gt;using &lt;/span&gt;Microsoft.Scripting.Hosting;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;namespace &lt;/span&gt;ABB.INCRC.MSBuildTasks&lt;br /&gt;{&lt;br /&gt;   &lt;span style="color:blue;"&gt;public class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IronRubyTask &lt;/span&gt;: &lt;span style="color:#2b91af;"&gt;Task&lt;br /&gt;   &lt;/span&gt;{&lt;br /&gt;       &lt;span style="color:blue;"&gt;#region &lt;/span&gt;Properties&lt;br /&gt;&lt;br /&gt;       &lt;span style="color:blue;"&gt;string &lt;/span&gt;script;&lt;br /&gt;&lt;br /&gt;       [&lt;span style="color:#2b91af;"&gt;Required&lt;/span&gt;]&lt;br /&gt;       &lt;span style="color:blue;"&gt;public string &lt;/span&gt;Script&lt;br /&gt;       {&lt;br /&gt;&lt;br /&gt;           &lt;span style="color:blue;"&gt;get &lt;/span&gt;{ &lt;span style="color:blue;"&gt;return &lt;/span&gt;script; }&lt;br /&gt;&lt;br /&gt;           &lt;span style="color:blue;"&gt;set &lt;/span&gt;{ script = &lt;span style="color:blue;"&gt;value&lt;/span&gt;; }&lt;br /&gt;&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       &lt;span style="color:blue;"&gt;string &lt;/span&gt;status;&lt;br /&gt;       [&lt;span style="color:#2b91af;"&gt;Output&lt;/span&gt;]&lt;br /&gt;       &lt;span style="color:blue;"&gt;public string &lt;/span&gt;Status&lt;br /&gt;       {&lt;br /&gt;           &lt;span style="color:blue;"&gt;get &lt;/span&gt;{ &lt;span style="color:blue;"&gt;return &lt;/span&gt;status; }&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       &lt;span style="color:blue;"&gt;#endregion&lt;br /&gt;       public override bool &lt;/span&gt;Execute()&lt;br /&gt;       {&lt;br /&gt;           &lt;span style="color:blue;"&gt;try&lt;br /&gt;           &lt;/span&gt;{&lt;br /&gt;               &lt;span style="color:#2b91af;"&gt;ScriptEngine &lt;/span&gt;engine = &lt;span style="color:#2b91af;"&gt;Ruby&lt;/span&gt;.CreateEngine();&lt;br /&gt;&lt;br /&gt;               &lt;span style="color:#2b91af;"&gt;ScriptSource &lt;/span&gt;source = engine.CreateScriptSourceFromString(script, &lt;span style="color:#2b91af;"&gt;SourceCodeKind&lt;/span&gt;.Statements);&lt;br /&gt;&lt;br /&gt;               &lt;span style="color:#2b91af;"&gt;Object &lt;/span&gt;result = source.Execute();&lt;br /&gt;&lt;br /&gt;               status = result.ToString();&lt;br /&gt;           }&lt;br /&gt;           &lt;span style="color:blue;"&gt;catch &lt;/span&gt;(Microsoft.Scripting.&lt;span style="color:#2b91af;"&gt;SyntaxErrorException &lt;/span&gt;syntaxError)&lt;br /&gt;           {&lt;br /&gt;               status = &lt;span style="color:#a31515;"&gt;"SyntaxErrorException : " &lt;/span&gt;+ syntaxError.Message;&lt;br /&gt;               &lt;span style="color:blue;"&gt;return false&lt;/span&gt;;&lt;br /&gt;           }&lt;br /&gt;           &lt;span style="color:blue;"&gt;catch &lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;MemberAccessException &lt;/span&gt;maex)&lt;br /&gt;           {&lt;br /&gt;               status = &lt;span style="color:#a31515;"&gt;"MemberAccessException : " &lt;/span&gt;+ maex.Message;&lt;br /&gt;               &lt;span style="color:blue;"&gt;return false&lt;/span&gt;;&lt;br /&gt;           }&lt;br /&gt;           &lt;span style="color:blue;"&gt;return true&lt;/span&gt;;&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;}&lt;/pre&gt;&lt;p&gt;Build this library and copy to folder like D:\MsBuildTasks\IronRubyTask. Note that execution of this task depends on referred libraries. Thus you need to copy all libraries to this folder. In last post we have seen how to refer a task with UsingTask element.&lt;br /&gt;&lt;br /&gt;Here we take a better approach by using an external task definition.&lt;/p&gt;&lt;h1&gt;External Project Reference&lt;/h1&gt;&lt;p&gt;Create a new file by name MyMSBuildTasks and place following content. This script does lot of work&lt;/p&gt;&lt;ul&gt;&lt;br /&gt; &lt;li&gt;Makes a reference to IronRubyTask&lt;/li&gt;  &lt;li&gt;Creates property group to hold script elements, which increment AssemblyFileVersion. This is done by updating AssemblyInfo.cs file in properties folder. BuildNumber is persisted in a separate BuildNumber.txt file&lt;/li&gt;  &lt;li&gt;Creates tasks to execute scripts&lt;/li&gt;  &lt;li&gt;Scripts are concatenated from multiple properties thereby keeping scripts modular&lt;/li&gt;&lt;/ul&gt;&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#a31515;"&gt;xml &lt;/span&gt;&lt;span style="color:red;"&gt;version&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;1.0&lt;/span&gt;" &lt;span style="color:red;"&gt;encoding&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;utf-8&lt;/span&gt;"&lt;span style="color:blue;"&gt;?&amp;gt;&lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Project &lt;/span&gt;&lt;span style="color:red;"&gt;xmlns&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;http://schemas.microsoft.com/developer/msbuild/2003&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;   &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;UsingTask &lt;/span&gt;&lt;span style="color:red;"&gt;AssemblyFile&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;D:\MsBuildTasks\IronRubyTask\IronRubyTask.dll&lt;/span&gt;" &lt;span style="color:red;"&gt;TaskName&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;IronRubyTask&lt;/span&gt;"&lt;span style="color:blue;"&gt;/&amp;gt;&lt;br /&gt;&lt;br /&gt;   &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;PropertyGroup&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;       &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;GetBuild&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;           &amp;lt;![CDATA[&lt;br /&gt;           &lt;/span&gt;&lt;span style="color:gray;"&gt;#Get Build&lt;br /&gt;&lt;br /&gt;           def getBuild(buildIndexFile)&lt;br /&gt;&lt;br /&gt;               begin&lt;br /&gt;&lt;br /&gt;                   file = File.new(buildIndexFile, "r")&lt;br /&gt;&lt;br /&gt;                   while (line = file.gets)&lt;br /&gt;                       @token = line.split("=")&lt;br /&gt;                       if (@token[0] == "build")&lt;br /&gt;                           @build = Integer(@token[1])&lt;br /&gt;                       end&lt;br /&gt;                       if (@token[0] == "revision")&lt;br /&gt;                           @revision = Integer(@token[1])&lt;br /&gt;                       end&lt;br /&gt;                   end&lt;br /&gt;                  &lt;br /&gt;                   file.close&lt;br /&gt;&lt;br /&gt;                   rescue =&amp;gt; err&lt;br /&gt;&lt;br /&gt;                   err&lt;br /&gt;               end&lt;br /&gt;&lt;br /&gt;           end&lt;br /&gt;&lt;br /&gt;           @build = -1&lt;br /&gt;           @revision = -1&lt;br /&gt;                &lt;br /&gt;           getBuild("D:\\BuildNumber.txt")&lt;br /&gt;&lt;br /&gt;           &lt;/span&gt;&lt;span style="color:blue;"&gt;]]&amp;gt;           &lt;br /&gt;       &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;GetBuild&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;      &lt;br /&gt;       &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;SetBuild&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;           &amp;lt;![CDATA[&lt;br /&gt;          &lt;br /&gt;           &lt;/span&gt;&lt;span style="color:gray;"&gt;#Set Build&lt;br /&gt;           def setBuild(buildIndexFile)&lt;br /&gt;               begin&lt;br /&gt;                   buildIndex = "build=#{@build}\r\nrevision=#{@revision}"&lt;br /&gt;                   File.open(buildIndexFile,"w") {|f| f.write(buildIndex) }&lt;br /&gt;&lt;br /&gt;                   "Updated : #{buildIndexFile}"&lt;br /&gt;&lt;br /&gt;               rescue =&amp;gt; err&lt;br /&gt;                   err&lt;br /&gt;               end&lt;br /&gt;           end&lt;br /&gt;           &lt;/span&gt;&lt;span style="color:blue;"&gt;]]&amp;gt;&lt;br /&gt;       &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;SetBuild&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;       &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;DefineFileVersion&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;           &amp;lt;![CDATA[&lt;br /&gt;&lt;br /&gt;           &lt;/span&gt;&lt;span style="color:gray;"&gt;#update AssemblyVersion&lt;br /&gt;&lt;br /&gt;           def updateFileVersion(assemblyInfoFile)&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;               if(@build &amp;gt; 65536)&lt;br /&gt;                   @build = 0&lt;br /&gt;               end&lt;br /&gt;&lt;br /&gt;               if(@revision &amp;gt; 65536)&lt;br /&gt;                   @revision = 0&lt;br /&gt;               end&lt;br /&gt;&lt;br /&gt;    &lt;br /&gt;               assemblyInfo = File.read(assemblyInfoFile)&lt;br /&gt;&lt;br /&gt;               assemblyInfo = assemblyInfo.gsub(/AssemblyFileVersion\(\"1\.0\.(\d+)\.(\d+)\"\)/,&lt;br /&gt;                   "AssemblyFileVersion(\"1.0.#{@build}.#{@revision}\")")&lt;br /&gt;               #puts assemblyInfo&lt;br /&gt;&lt;br /&gt;               begin&lt;br /&gt;                   File.open(assemblyInfoFile,"w") {|f| f.write(assemblyInfo) }&lt;br /&gt;                   "Updated : #{assemblyInfoFile}"&lt;br /&gt;               rescue =&amp;gt; err&lt;br /&gt;                   puts err&lt;br /&gt;                   err&lt;br /&gt;               end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;           end&lt;br /&gt;           &lt;/span&gt;&lt;span style="color:blue;"&gt;]]&amp;gt;&lt;br /&gt;       &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;DefineFileVersion&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;       &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;UpdateFileVersion&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;           &amp;lt;![CDATA[&lt;br /&gt;&lt;br /&gt;           &lt;/span&gt;&lt;span style="color:gray;"&gt;#Execution Starts here&lt;br /&gt;&lt;br /&gt;           if @revision &amp;gt; 0&lt;br /&gt;               @revision = @revision + 1&lt;br /&gt;           else&lt;br /&gt;               @build = @build + 1&lt;br /&gt;           end&lt;br /&gt;&lt;br /&gt;           updateFileVersion("D:\\MsBuildTasks\\Properties\\AssemblyInfo.cs")&lt;br /&gt;&lt;br /&gt;           &lt;/span&gt;&lt;span style="color:blue;"&gt;]]&amp;gt;&lt;br /&gt;       &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;UpdateFileVersion&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;SetBuildNumber&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;           &amp;lt;![CDATA[&lt;br /&gt;&lt;br /&gt;           &lt;/span&gt;&lt;span style="color:gray;"&gt;#Execution Starts here&lt;br /&gt;          &lt;br /&gt;           @build = @build + 1&lt;br /&gt;           @revision = 0&lt;br /&gt;&lt;br /&gt;           setBuild("D:\\BuildNumber.txt")&lt;br /&gt;&lt;br /&gt;           &lt;/span&gt;&lt;span style="color:blue;"&gt;]]&amp;gt;&lt;br /&gt;       &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;SetBuildNumber&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;       &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;SetRevisionNumber&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;           &amp;lt;![CDATA[&lt;br /&gt;          &lt;br /&gt;           &lt;/span&gt;&lt;span style="color:gray;"&gt;#Execution Starts here&lt;br /&gt;          &lt;br /&gt;           @revision = @revision + 1&lt;br /&gt;&lt;br /&gt;           setBuild("D:\\BuildNumber.txt")&lt;br /&gt;&lt;br /&gt;           &lt;/span&gt;&lt;span style="color:blue;"&gt;]]&amp;gt;&lt;br /&gt;       &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;SetRevisionNumber&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;   &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;PropertyGroup&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;   &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Target &lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;UpdateFileVersion&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;       &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;IronRubyTask &lt;/span&gt;&lt;span style="color:red;"&gt;Script&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;$(GetBuild)$(DefineFileVersion)$(UpdateFileVersion)&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;           &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Output &lt;/span&gt;&lt;span style="color:red;"&gt;TaskParameter&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;Status&lt;/span&gt;" &lt;span style="color:red;"&gt;PropertyName&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;Status&lt;/span&gt;" &lt;span style="color:blue;"&gt;/&amp;gt;&lt;br /&gt;       &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;IronRubyTask&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;       &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Message &lt;/span&gt;&lt;span style="color:red;"&gt;Text&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;$(Status)&lt;/span&gt;" &lt;span style="color:blue;"&gt;/&amp;gt;&lt;br /&gt;   &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Target&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;   &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Target &lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;SetBuildNumber&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;       &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;IronRubyTask &lt;/span&gt;&lt;span style="color:red;"&gt;Script&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;$(GetBuild)$(SetBuild)$(SetBuildNumber)&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;           &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Output &lt;/span&gt;&lt;span style="color:red;"&gt;TaskParameter&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;Status&lt;/span&gt;" &lt;span style="color:red;"&gt;PropertyName&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;Status&lt;/span&gt;" &lt;span style="color:blue;"&gt;/&amp;gt;&lt;br /&gt;       &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;IronRubyTask&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;       &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Message &lt;/span&gt;&lt;span style="color:red;"&gt;Text&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;$(Status)&lt;/span&gt;" &lt;span style="color:blue;"&gt;/&amp;gt;&lt;br /&gt;   &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Target&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;   &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Target &lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;SetRevisionNumber&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;       &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;IronRubyTask &lt;/span&gt;&lt;span style="color:red;"&gt;Script&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;$(GetBuild)$(SetBuild)$(SetRevisionNumber)&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;           &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Output &lt;/span&gt;&lt;span style="color:red;"&gt;TaskParameter&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;Status&lt;/span&gt;" &lt;span style="color:red;"&gt;PropertyName&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;Status&lt;/span&gt;" &lt;span style="color:blue;"&gt;/&amp;gt;&lt;br /&gt;       &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;IronRubyTask&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;       &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Message &lt;/span&gt;&lt;span style="color:red;"&gt;Text&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;$(Status)&lt;/span&gt;" &lt;span style="color:blue;"&gt;/&amp;gt;&lt;br /&gt;   &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Target&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Project&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;span class="Apple-style-span"    style="font-family:Georgia, serif;font-size:130%;color:#000000;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px; white-space: normal;"&gt;&lt;span class="Apple-style-span"    style="font-family:monospace;font-size:100%;color:#0000FF;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; white-space: pre;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;h1&gt;Referring target file&lt;/h1&gt;&lt;p&gt;Now create a test project file and refer above file.&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Project &lt;/span&gt;&lt;span style="color:red;"&gt;DefaultTargets &lt;/span&gt;&lt;span style="color:blue;"&gt;= &lt;/span&gt;"&lt;span style="color:blue;"&gt;Test&lt;/span&gt;"&lt;br /&gt;&lt;br /&gt;   &lt;span style="color:red;"&gt;xmlns&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;http://schemas.microsoft.com/developer/msbuild/2003&lt;/span&gt;" &lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;  &lt;br /&gt;   &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Import &lt;/span&gt;&lt;span style="color:red;"&gt;Project&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;D:\MsBuildTasks\ABB.INCRC.MSBuildTasks&lt;/span&gt;"&lt;span style="color:blue;"&gt;/&amp;gt;&lt;br /&gt;&lt;br /&gt;   &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Target &lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;Test&lt;/span&gt;" &lt;span style="color:red;"&gt;DependsOnTargets&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;UpdateFileVersion;SetBuildNumber;SetRevisionNumber&lt;/span&gt;" &lt;span style="color:blue;"&gt;/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Project&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;Here we use “DependsOnTargets” to call multiple targets from referred file.&lt;/p&gt;&lt;p&gt;Hope this post provided a use-case to host dynamic languages like IronRuby for useful tasks. Advantage of this approach is you need to build only one custom task. All other needs can be achieved using scripts. And scripts are part of msbuild project in the form of properties.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9122784-4060046617974814211?l=sriharshavardhan.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Sa6lBDZEuDkRg51U-fXERYH6-gA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Sa6lBDZEuDkRg51U-fXERYH6-gA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Sa6lBDZEuDkRg51U-fXERYH6-gA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Sa6lBDZEuDkRg51U-fXERYH6-gA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/SriharshaVardhan/~4/FL7Knu4Q-KY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sriharshavardhan.blogspot.com/feeds/4060046617974814211/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9122784&amp;postID=4060046617974814211" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9122784/posts/default/4060046617974814211?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9122784/posts/default/4060046617974814211?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SriharshaVardhan/~3/FL7Knu4Q-KY/hosting-ironruby-in-msbuild-to-auto.html" title="Hosting IronRuby in MSBuild" /><author><name>Sriharsha Vardhan</name><uri>https://profiles.google.com/100795286323098096475</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-WSRPdIrYars/AAAAAAAAAAI/AAAAAAAAAnQ/IB8E9VyRHns/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://sriharshavardhan.blogspot.com/2009/12/hosting-ironruby-in-msbuild-to-auto.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkYHRn09eip7ImA9WxBTGEw.&quot;"><id>tag:blogger.com,1999:blog-9122784.post-5744590798381926643</id><published>2009-12-15T00:21:00.006+05:30</published><updated>2009-12-15T00:45:37.362+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-15T00:45:37.362+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="IronRuby" /><title>Hosting IronRuby in .Net applications - Part2</title><content type="html">&lt;p&gt;In last post of this series we have seen few examples of IronRuby. That is just a glimpse of IronRuby.&lt;br /&gt;With this background we can take a look at integrating these snippets in a .Net application.&lt;/p&gt;  &lt;p&gt;I would like to provide some basic introduction about Dynamic Language Runtime (DLR) and then present an example.&lt;/p&gt;  &lt;h1&gt;DLR Overview&lt;/h1&gt;  &lt;p&gt;DLR infrastructure provides solutions for different purposes which include&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;port dynamic languages to .NET&lt;/li&gt;    &lt;li&gt;add dynamic features to existing language&lt;/li&gt;    &lt;li&gt;author libraries whose objects support dynamic operations&lt;/li&gt;    &lt;li&gt;employ (host) dynamic languages in applications and frameworks&lt;/li&gt; &lt;/ol&gt; But this post is oriented towards hosting scenarios only.&lt;br /&gt;&lt;p&gt;DLR is built on top of Common Language Runtime (CLR). Microsoft .Net framework is designed to support multiple programming languages on CLR. It provides common services like GC, JIT etc. for static languages like C#, VB.Net etc. The CTS and CLI infrastructure allows sharing libraries written in any language with any other language targeting CLR. And we rarely realize need to host CLR explicitly, as it is done automatically by various CLR executable modules due to modifications done to Portable Executable format. &lt;/p&gt;  &lt;p&gt;DLR extends CLR with services required for dynamic languages like python, ruby. In similar lines it first extends type system to be dynamic. Then, incase of statically typed languages, meta data provides necessary relative virtual addresses at compile time for method invocations. These virtual pointers turn into realistic pointers during JIT compilation process and remain as is as long as execution engine is alive. This is not the case with dynamic languages which require a dynamic method dispatching mechanism. Also applications need to explicitly host Dynamic Runtime Engines. But DLR eases some effort here by providing a common hosting API for all dynamic languages targeting DLR. So if we summarize, key components of DLR would include&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;dynamic type system&lt;/li&gt;    &lt;li&gt;dynamic method dispatching system&lt;/li&gt;    &lt;li&gt;common hosting API&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Dynamic type system and dispatching system provide services for first three purposes mentioned at the beginning of ‘DLR Overview’. Common hosting API provide services for last purpose in that list. &lt;/p&gt;  &lt;h1&gt;Hosting Scenarios&lt;/h1&gt;  &lt;p&gt;As such there could be several scenarios in which DLR can be employed (hosted). Such scenarios include &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;executing a script in a given scope using default script-host&lt;/li&gt;    &lt;li&gt;executing several scripts in multiple scopes using custom script-host&lt;/li&gt;    &lt;li&gt;controlling on how to pre-compile and improve executing performance, an advanced scenario&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;This part of the series confines to first scenario in which one script is executed in a given scope.  &lt;/p&gt;  &lt;h1&gt;Execution Overview&lt;/h1&gt;  &lt;p&gt;As mentioned above, this post is presenting the very basic mode of executing a script.&lt;br /&gt;Steps involved in this process include&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Create Script Engine for Ruby&lt;/li&gt;    &lt;li&gt;Create Scope object from engine and set scope&lt;/li&gt;    &lt;li&gt;Create code&lt;/li&gt;    &lt;li&gt;Execute code within a given scope&lt;/li&gt; &lt;/ul&gt;  &lt;h1&gt;Example&lt;/h1&gt;  &lt;p&gt;Following step by step procedure makes up a simple application to host IronRuby&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Start Visual Studio and create a new console application. Copy required&lt;/li&gt;    &lt;li&gt;Refer following dependent assemblies from ~\&amp;lt;Program Files&amp;gt;\IronRuby 0.9.2\bin &lt;br /&gt;IronRuby.dll  &lt;br /&gt;IronRuby.Libraries.dll  &lt;br /&gt;Microsoft.Dynamic.dll  &lt;br /&gt;Microsoft.Scripting.Core.dll  &lt;br /&gt;Microsoft.Scripting.dll  &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;Add following using statements&lt;/li&gt;    &lt;pre class="prettyprint"&gt;using IronRuby;&lt;br /&gt;using Microsoft.Scripting.Hosting;&lt;br /&gt;using Microsoft.Scripting;&lt;/pre&gt;&lt;br /&gt;&lt;li&gt;Add following code in Main&lt;/li&gt;  &lt;pre class="prettyprint"&gt;&lt;br /&gt;        ScriptEngine engine;&lt;br /&gt;        ScriptScope scope;&lt;br /&gt;     &lt;br /&gt;        String code;&lt;br /&gt;    &lt;br /&gt;        Int32 i1 = 20;&lt;br /&gt;        Int32 i2 = 10;&lt;br /&gt;&lt;br /&gt;        engine = Ruby.CreateEngine();&lt;br /&gt;        scope = engine.CreateScope();&lt;br /&gt;&lt;br /&gt;        scope.SetVariable("i1", i1);&lt;br /&gt;        scope.SetVariable("i2", i2);&lt;br /&gt;&lt;br /&gt;        code = @"def compareValues()&lt;br /&gt;                 return $i1 &amp;gt; $i2&lt;br /&gt;                 end&lt;br /&gt;&lt;br /&gt;                $i1 = i1;&lt;br /&gt;                $i2 = i2;&lt;br /&gt;&lt;br /&gt;                comp = compareValues();&lt;br /&gt;&lt;br /&gt;                puts comp";             &lt;br /&gt;&lt;br /&gt;        engine.Execute(code, scope);&lt;br /&gt;&lt;br /&gt;        Console.WriteLine("Press any key to continue");&lt;br /&gt;        Console.ReadLine();&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;li&gt;Build and run code.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;If everything goes well you should see true on screen.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9122784-5744590798381926643?l=sriharshavardhan.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/8ehmlwsxHBZuDeTKwTTqV-Z_qpw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8ehmlwsxHBZuDeTKwTTqV-Z_qpw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/8ehmlwsxHBZuDeTKwTTqV-Z_qpw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8ehmlwsxHBZuDeTKwTTqV-Z_qpw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/SriharshaVardhan/~4/WdKjBxuKe5E" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sriharshavardhan.blogspot.com/feeds/5744590798381926643/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9122784&amp;postID=5744590798381926643" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9122784/posts/default/5744590798381926643?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9122784/posts/default/5744590798381926643?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SriharshaVardhan/~3/WdKjBxuKe5E/hosting-ironruby-in-net-applications_15.html" title="Hosting IronRuby in .Net applications - Part2" /><author><name>Sriharsha Vardhan</name><uri>https://profiles.google.com/100795286323098096475</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-WSRPdIrYars/AAAAAAAAAAI/AAAAAAAAAnQ/IB8E9VyRHns/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://sriharshavardhan.blogspot.com/2009/12/hosting-ironruby-in-net-applications_15.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkcBR38zeip7ImA9WxBTFUg.&quot;"><id>tag:blogger.com,1999:blog-9122784.post-8898469687916119717</id><published>2009-12-11T23:24:00.001+05:30</published><updated>2009-12-11T23:24:16.182+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-11T23:24:16.182+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Personal" /><title>Our Patent</title><content type="html">&lt;p&gt;SYSTEM AND METHOD FOR GENERATING CONTROL SYSTEM DATABASE AND GRAPHICS FROM SCHEMA-BASED INTERMEDIATE DESCRIPTIONS   &lt;br /&gt;&lt;a href="http://www.wipo.int/pctdb/en/wads.jsp?IA=US2009001209&amp;amp;LANGUAGE=EN&amp;amp;ID=id00000008751734&amp;amp;VOL=94&amp;amp;DOC=02f85f&amp;amp;WO=09/108328&amp;amp;WEEK=36/2009&amp;amp;TYPE=A1&amp;amp;DOC_TYPE=PAMPH&amp;amp;PAGE=HTML"&gt;PCT Link (WO 2009/108328 A1 - 03 September 2009)&lt;/a&gt; &lt;a href="http://sriharsha.net/US20090282067.pdf"&gt;US Patent Link (US 2009/282067 A1 - Nov. 12,2009)&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9122784-8898469687916119717?l=sriharshavardhan.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/BrIAmXKXVLjKohm7ruWrhfD5Jys/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BrIAmXKXVLjKohm7ruWrhfD5Jys/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/BrIAmXKXVLjKohm7ruWrhfD5Jys/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BrIAmXKXVLjKohm7ruWrhfD5Jys/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/SriharshaVardhan/~4/oaEwfywbiGM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sriharshavardhan.blogspot.com/feeds/8898469687916119717/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9122784&amp;postID=8898469687916119717" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9122784/posts/default/8898469687916119717?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9122784/posts/default/8898469687916119717?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SriharshaVardhan/~3/oaEwfywbiGM/our-patent.html" title="Our Patent" /><author><name>Sriharsha Vardhan</name><uri>https://profiles.google.com/100795286323098096475</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-WSRPdIrYars/AAAAAAAAAAI/AAAAAAAAAnQ/IB8E9VyRHns/s512-c/photo.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://sriharshavardhan.blogspot.com/2009/12/our-patent.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkQHQ3w7eSp7ImA9WxNaGUQ.&quot;"><id>tag:blogger.com,1999:blog-9122784.post-186997246969505358</id><published>2009-12-02T07:34:00.003+05:30</published><updated>2009-12-05T13:02:12.201+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-05T13:02:12.201+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="IronRuby" /><title>Hosting IronRuby in .Net applications - Part1</title><content type="html">&lt;p&gt;This post provides necessary information to host IronRuby in .Net applications. I assume no knowledge of Ruby or DLR from reader. It starts with basic introduction to IronRuby and then provides information on DLR and hosting options.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.ruby-lang.org/en/"&gt;Ruby&lt;/a&gt; is a dynamic, open source programming language with a focus on simplicity and productivity. It has an elegant syntax that is natural to read and easy to write. &lt;a href="http://ironruby.net/"&gt;IronRuby&lt;/a&gt; is a &lt;a href="http://www.opensource.org/licenses/ms-pl.html"&gt;Open Source&lt;/a&gt; implementation of the &lt;a href="http://www.ruby-lang.org/"&gt;Ruby programming language&lt;/a&gt; for &lt;a href="http://www.microsoft.com/NET/"&gt;.NET&lt;/a&gt;, heavily relying on Microsoft's &lt;a href="http://codeplex.com/dlr"&gt;Dynamic Language Runtime&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;This is the first part of this series. This part familiarizes the ruby language as much required for this series. For better understanding of ruby language reader can refer to &lt;a href="http://en.wikibooks.org/wiki/Ruby_Programming"&gt;Ruby Programming&lt;/a&gt;, &lt;a href="http://ironruby.net/Documentation"&gt;IronRuby Documentation&lt;/a&gt;, &lt;a href="http://rubylearning.com/satishtalim/tutorial.html"&gt;Ruby Learning Tutorial&lt;/a&gt;, &lt;a href="http://www.cs.auckland.ac.nz/references/ruby/doc_bundle/Manual/man-1.4/syntax.html"&gt;Ruby Manual&lt;/a&gt;. &lt;/p&gt;  &lt;h1&gt;Getting started&lt;/h1&gt;  &lt;p&gt;Though prior knowledge of Ruby is an added advantage a novice can still follow this post to get started with Ruby.&lt;/p&gt;  &lt;p&gt;Before we can start &lt;a href="http://ironruby.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=33693#DownloadId=90621"&gt;&lt;strong&gt;Download IronRuby 0.9.2&lt;/strong&gt;&lt;/a&gt; msi. After installing the msi you should find “~\IronRuby 0.9.2\IronRuby Console” in Start –&amp;gt; Programs. This is an interactive console. We can also run a script using “ir.exe &amp;lt;script&amp;gt;”. ir.exe can be found at “&amp;lt;installation path&amp;gt;\IronRuby 0.9.2\bin\ir.exe".&lt;/p&gt;  &lt;p&gt;Enter following lines in a notepad and save the file with .rb extension.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;strong&gt;ex01.rb&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;pre class="prettyprint"&gt;puts 'Hello World'&lt;br /&gt;print "Hello World\n"&lt;br /&gt;puts "Hello World"&lt;br /&gt;puts "Hello World";&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Now run this example from command prompt.  “ir.exe ex01.rb”. You can test these three lines from interactive console also.&lt;/p&gt;&lt;p&gt;Observations from this example are &lt;/p&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;puts or print either one works to print a message &lt;/li&gt;&lt;br /&gt;&lt;li&gt;semi-colon at the end of a line is optional&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Single quote or double quotes, either one works. There is subtle difference between them regarding allowed escape sequences line new line etc. &lt;/li&gt;&lt;br /&gt;&lt;li&gt;There is no need of main or class to start a hello world program&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;OK we have just written a ruby script. There is no main/Main here. OK that doesn’t mean we can’t have functions. Let us see them.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;ex02.rb&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;pre class="prettyprint"&gt;def sayHello&lt;br /&gt;puts 'Hello World'&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;sayHello&lt;br /&gt;sayHello()&lt;br /&gt;sayHello();&lt;/pre&gt;&lt;p&gt;Place this code in ex02.rb and run “ir.exe ex02.rb”. All three statements produces same result.&lt;/p&gt;&lt;p&gt;Observations from this example are&lt;/p&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;functions are defined as &lt;strong&gt;def&lt;/strong&gt; and &lt;strong&gt;end&lt;/strong&gt; blocks &lt;/li&gt;&lt;br /&gt;&lt;li&gt;there is no return type specified. In ruby we don’t specify a return type&lt;/li&gt;&lt;br /&gt;&lt;li&gt;definitions must be declared prior to calling them&lt;/li&gt;&lt;br /&gt;&lt;li&gt;all definitions should start with small letter. Though a capital letter as starting character works sometimes, that is not a good practice. Avoid it &lt;/li&gt;&lt;br /&gt;&lt;li&gt;definition can be called is all three forms. It there are no arguments braces are optional. Again last semi-colon is optional&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Fine. Let us pass an argument and get a return parameter.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;ex03.rb&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;pre class="prettyprint"&gt;def getSQRT(arg)&lt;br /&gt;Math.sqrt(arg)&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;sqrt = getSQRT(ARGV[0]);&lt;br /&gt;&lt;br /&gt;puts sqrt&lt;/pre&gt;&lt;p&gt;Place this code in ex03.rb and run “ir.exe ex03.rb 4”. Square root of 4, 2.0 is printed on screen.&lt;/p&gt;&lt;p&gt;Observations from this example are&lt;/p&gt;&lt;ul&gt;  &lt;li&gt;command arguments are in ARGV array starting from index zero&lt;/li&gt;&lt;br /&gt;&lt;li&gt;arguments doesn’t take any type parameter&lt;/li&gt;&lt;br /&gt;&lt;li&gt;return call is optional. If no return statement is coded, result of last statement is passed as return value&lt;/li&gt;&lt;br /&gt;&lt;li&gt;sqrt parameter is a local variable, but there is no type specified. It hold return value of getSQRT call&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Math is a module which is implicitly available. We didn’t write anything line using/import Math&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Now let us see how comparison works.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;ex04.rb&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;pre class="prettyprint"&gt;def compareValues()&lt;br /&gt;return $i1 &amp;gt; $i2&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;$i1 = ARGV[0]&lt;br /&gt;$i2 = ARGV[1]&lt;br /&gt;&lt;br /&gt;comp = compareValues();&lt;br /&gt;&lt;br /&gt;puts comp&lt;/pre&gt;&lt;p&gt;Place this code in ex04.rb and run “ir.exe ex04.rb 2 1”. ‘true’ is printed on screen&lt;/p&gt;&lt;p&gt;Observations from this example are&lt;/p&gt;&lt;ul&gt;  &lt;li&gt;return keyword is specified though it is optional &lt;/li&gt;&lt;br /&gt;&lt;li&gt;global variables as prefixed with $. This ‘$’ sign specifies that the variable is a global variable. &lt;/li&gt;&lt;br /&gt;&lt;li&gt;Variable scopes are&lt;br /&gt;  &lt;ul&gt;&lt;br /&gt;    &lt;li&gt;Local variable : Defined with a block. Starts with lower case letter or ‘_’. ex: var1, _var2 &lt;/li&gt;&lt;br /&gt;    &lt;li&gt;Instance variable : Defined within a class (classes are covered later) as a member. Starts with &lt;a href="mailto:%E2%80%98@%E2%80%99"&gt;‘@’&lt;/a&gt; ex: @inst1, @inst2 &lt;/li&gt;&lt;br /&gt;    &lt;li&gt;Class variable: These are like static variable in a class. Only one instance is allowed and the same is shared among all objects. Starts with &lt;a href="mailto:%E2%80%98@@%E2%80%99"&gt;‘@@’&lt;/a&gt;.  ex: @@cls1, @@cls2 &lt;/li&gt;&lt;br /&gt;    &lt;li&gt;Global variables: These are accessible for all definitions. Starts with &lt;a href="mailto:%E2%80%98@%E2%80%99"&gt;‘$’&lt;/a&gt;. eg: $g1, $g2 &lt;/li&gt;&lt;br /&gt;    &lt;li&gt;Constants are started with a upper case letter. ex: PI, SpecificGravity&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;There are some commonly used built-ins as mentioned below&lt;br /&gt;  &lt;ul&gt;&lt;br /&gt;    &lt;li&gt;self - Execution context of the current method &lt;/li&gt;&lt;br /&gt;    &lt;li&gt;nil - Expresses nothing &lt;/li&gt;&lt;br /&gt;    &lt;li&gt;true - Expresses true &lt;/li&gt;&lt;br /&gt;    &lt;li&gt;false – Expresses false. &lt;b&gt;nil&lt;/b&gt; also is considered to be &lt;b&gt;false&lt;/b&gt;, and every other value is considered to be &lt;b&gt;true&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Its time to take big bite.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;ex05.rb&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;pre class="prettyprint"&gt;class ClassA&lt;br /&gt;attr_accessor :dict&lt;br /&gt;&lt;br /&gt;def initialize()&lt;br /&gt; @dict = System::Collections::Generic::Dictionary[String,Object].new&lt;br /&gt; self.dict.Add 'Argument', 12.243&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;def addElements&lt;br /&gt; begin&lt;br /&gt;  if @dict['Argument'] == 12.243&lt;br /&gt;   @dict.Add 'Key1', 1&lt;br /&gt;   self.dict.Add('Key2','TWO')&lt;br /&gt;   @dict.Add('Key3', 8.765);&lt;br /&gt;  end&lt;br /&gt; rescue StandardError =&amp;gt; ste&lt;br /&gt;  puts 'StandardError occurred : ' +  ste&lt;br /&gt; end&lt;br /&gt;end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;clsA = ClassA.new&lt;br /&gt;&lt;br /&gt;clsA.addElements&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;for i in clsA.dict.Keys&lt;br /&gt;puts clsA.dict[i]&lt;br /&gt;end&lt;span class="Apple-style-span"   style="font-family:Georgia, serif;font-size:130%;"&gt;&lt;span class="Apple-style-span"  style=" white-space: normal;font-size:16px;"&gt;&lt;span class="Apple-style-span"   style="font-family:monospace;font-size:100%;"&gt;&lt;span class="Apple-style-span"  style=" white-space: pre;font-size:13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;Place this code in ex05.rb and run “ir.exe ex05.rb”. Following results are printed on screen&lt;/p&gt;&lt;p&gt;&lt;em&gt;12.243&lt;br /&gt;1&lt;br /&gt;TWO&lt;br /&gt;8.765&lt;/em&gt;&lt;/p&gt;&lt;p&gt;We covered lot of ground here.&lt;/p&gt;&lt;blockquote&gt;  &lt;p&gt;&lt;u&gt;Let us start with a small pie&lt;/u&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;  &lt;li&gt;Class name to start with a capital letter.&lt;/li&gt;  &lt;li&gt;attr_accessor creates a get set accessors like properties. We can declare multiple accessors in one statement like&lt;br /&gt;attr_accessor :dict, :hach, :lict&lt;/li&gt;  &lt;li&gt;def initialize() is a paramterless constructor&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;  &lt;p&gt;&lt;u&gt;Instance variable&lt;/u&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;  &lt;li&gt;As mentioned earlier instance variables are declared with prefix &lt;a href="mailto:%E2%80%98@%E2%80%99"&gt;‘@’&lt;/a&gt;. They can be accessed using ‘@’ notation or self.&amp;lt;variable&amp;gt; notation. Observe two lines in constructor and usage of either notation&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;  &lt;p&gt;&lt;u&gt;Using CLR types and object creation&lt;/u&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;  &lt;li&gt;CLR types can be used in IronPython with syntax mentioned here.&lt;br /&gt;&lt;br /&gt;Observe minor difference in scope resolution operator ‘::’ and generic template notation with square brackets. &lt;/li&gt;&lt;br /&gt;&lt;li&gt;Also observe the notation to create objects with &amp;lt;Type&amp;gt;.new method.  eg: Dictionary[String,Object].new and ClassA.new &lt;/li&gt;&lt;br /&gt;&lt;li&gt;We can use all methods of CLR type as is. Observe usage of ‘Keys’ property and ‘Add’ methods&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;  &lt;p&gt;&lt;u&gt;Exception handling&lt;/u&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;  &lt;li&gt;&lt;em&gt;&lt;/em&gt;‘begin’, ‘rescue’, and ‘else’ sequences are exception handling blocks. Exceptions are raised using ‘raise’ keyword&lt;/li&gt;&lt;br /&gt;&lt;li&gt;rescue is like catch while raise is like throw. =&amp;gt; operator provides a reference to current exception into the variable on right side. &lt;/li&gt;&lt;br /&gt;&lt;li&gt;there is option of else to catch all other exceptions&lt;br /&gt;  &lt;p&gt;begin &lt;br /&gt; raise 'Error occured'&lt;br /&gt;rescue Exception1 =&amp;gt; ex1&lt;br /&gt;rescue Exception2 =&amp;gt; ex2&lt;br /&gt;else &lt;br /&gt;  Other exceptions&lt;br /&gt;end&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;  &lt;p&gt;&lt;u&gt;for loop&lt;/u&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;  &lt;li&gt;Here for loop is used with iterator.&lt;/li&gt;  &lt;li&gt;There is no need to specify type for iteration variable. eg. for i in clsA.dict.Keys&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;There is so much in it. Now let us see what ruby offers for delegation of control&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;ex06.rb&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;pre class="prettyprint"&gt;def AuthenticateUser(l)&lt;br /&gt;if l.call('ruby', 'gem')&lt;br /&gt; puts 'Authentication Successful'&lt;br /&gt;else&lt;br /&gt; puts 'Authentication Failed'&lt;br /&gt;end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;#Function pointer&lt;br /&gt;fp = proc { |username, password|&lt;br /&gt;if username == 'ruby' &amp;amp;&amp;amp; password == 'gem'&lt;br /&gt; return true&lt;br /&gt;end&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;AuthenticateUser(fp)&lt;br /&gt;&lt;br /&gt;#Method pointer&lt;br /&gt;class Authenticate&lt;br /&gt;def initialize(username, password)&lt;br /&gt; @username = username&lt;br /&gt; @password = password&lt;br /&gt;end&lt;br /&gt;def validateCredentials(username, password)&lt;br /&gt; if username == @username &amp;amp;&amp;amp; password == @password&lt;br /&gt;  return true&lt;br /&gt; end&lt;br /&gt;end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;a = Authenticate.new('ruby','gem')&lt;br /&gt;&lt;br /&gt;mp = a.method( :validateCredentials )&lt;br /&gt;&lt;br /&gt;AuthenticateUser(mp)&lt;/pre&gt;&lt;p&gt;Place this code in ex06.rb and run “ir.exe ex06.rb”. Two ‘Authentication Successful’ messages are printed on screen.&lt;br /&gt;&lt;br /&gt;Here Authenticate method takes a delegate as argument. This argument is a pointer to a routine on which method can invoke a call. Above code demonstrates passing the routine as function pointer and method pointer within a class.&lt;/p&gt;&lt;p&gt;Observations from this example are&lt;/p&gt;&lt;ul&gt;  &lt;li&gt;Invocation of a routine is done with .call method&lt;/li&gt;  &lt;li&gt;Function pointers are obtained using ‘proc’ keyword. It can be done using keyword ‘lambda’ also. There is a subtle difference between them regarding invocation context. More details can be found at &lt;a href="http://www.neeraj.name/blog/articles/589-block-vs-lambda-vs-proc"&gt;link&lt;/a&gt;&lt;/li&gt;  &lt;li&gt;The usage within | | is arguments for routine being called followed by implementation using these arguments. It is like anonymous method in C#&lt;/li&gt;  &lt;li&gt;To get the reference to a method within a class we use ‘.method’ function.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Some more examples in Part-2. And then part-3, I will cover about integrating ruby scripting feature in .Net applications.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9122784-186997246969505358?l=sriharshavardhan.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/R8VGvbMCxgHxk0QNCqWXmja80cA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/R8VGvbMCxgHxk0QNCqWXmja80cA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/R8VGvbMCxgHxk0QNCqWXmja80cA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/R8VGvbMCxgHxk0QNCqWXmja80cA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/SriharshaVardhan/~4/Pd0YqW9CVhY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sriharshavardhan.blogspot.com/feeds/186997246969505358/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9122784&amp;postID=186997246969505358" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9122784/posts/default/186997246969505358?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9122784/posts/default/186997246969505358?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SriharshaVardhan/~3/Pd0YqW9CVhY/hosting-ironruby-in-net-applications.html" title="Hosting IronRuby in .Net applications - Part1" /><author><name>Sriharsha Vardhan</name><uri>https://profiles.google.com/100795286323098096475</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-WSRPdIrYars/AAAAAAAAAAI/AAAAAAAAAnQ/IB8E9VyRHns/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://sriharshavardhan.blogspot.com/2009/12/hosting-ironruby-in-net-applications.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0YFSHo_eyp7ImA9WxNbF0Q.&quot;"><id>tag:blogger.com,1999:blog-9122784.post-7774278326355349461</id><published>2009-11-21T13:41:00.001+05:30</published><updated>2009-11-21T13:41:59.443+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-21T13:41:59.443+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Computing" /><title>TIOBE Programming Community Index for November 2009</title><content type="html">&lt;p&gt;&lt;/p&gt;  &lt;p&gt;Check &lt;a href="http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html"&gt;TIOBE index for 2009&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;I guess this year C will be declared as programming language of the year. And with GO in league we know some dynamics will change by next year.&lt;/p&gt;  &lt;p&gt;What I am interested to know what is driving PHP so strong. And between Python and Ruby, ruby is picking up.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9122784-7774278326355349461?l=sriharshavardhan.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/gWGt1ap4t7bbC7k1BJejic_S10Q/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/gWGt1ap4t7bbC7k1BJejic_S10Q/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/gWGt1ap4t7bbC7k1BJejic_S10Q/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/gWGt1ap4t7bbC7k1BJejic_S10Q/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/SriharshaVardhan/~4/R2kfRGdz4UY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sriharshavardhan.blogspot.com/feeds/7774278326355349461/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9122784&amp;postID=7774278326355349461" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9122784/posts/default/7774278326355349461?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9122784/posts/default/7774278326355349461?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SriharshaVardhan/~3/R2kfRGdz4UY/tiobe-programming-community-index-for.html" title="TIOBE Programming Community Index for November 2009" /><author><name>Sriharsha Vardhan</name><uri>https://profiles.google.com/100795286323098096475</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-WSRPdIrYars/AAAAAAAAAAI/AAAAAAAAAnQ/IB8E9VyRHns/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://sriharshavardhan.blogspot.com/2009/11/tiobe-programming-community-index-for.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkIERH4yeip7ImA9WxNbFkk.&quot;"><id>tag:blogger.com,1999:blog-9122784.post-8085995704921239478</id><published>2009-11-19T22:00:00.002+05:30</published><updated>2009-11-19T22:05:05.092+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-19T22:05:05.092+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="general" /><title>Its 5 years of blogging</title><content type="html">I started blogging since 12 Nov 2004. Probably this is the only hobby that I liked so much for so long. Ofcourse after starting twitter mainstream blogging is reduced.&lt;br /&gt;Anyway it gave me so much pleasure in last 5 years and keeping me motivated to persue it further.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9122784-8085995704921239478?l=sriharshavardhan.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/AO6RN4YL6MCbKy81e65bESAfxkI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/AO6RN4YL6MCbKy81e65bESAfxkI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/AO6RN4YL6MCbKy81e65bESAfxkI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/AO6RN4YL6MCbKy81e65bESAfxkI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/SriharshaVardhan/~4/Q4EUiSp51mI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sriharshavardhan.blogspot.com/feeds/8085995704921239478/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9122784&amp;postID=8085995704921239478" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9122784/posts/default/8085995704921239478?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9122784/posts/default/8085995704921239478?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SriharshaVardhan/~3/Q4EUiSp51mI/its-5-years-of-blogging.html" title="Its 5 years of blogging" /><author><name>Sriharsha Vardhan</name><uri>https://profiles.google.com/100795286323098096475</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-WSRPdIrYars/AAAAAAAAAAI/AAAAAAAAAnQ/IB8E9VyRHns/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://sriharshavardhan.blogspot.com/2009/11/its-5-years-of-blogging.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0cERXczeSp7ImA9WxNUEko.&quot;"><id>tag:blogger.com,1999:blog-9122784.post-8242210445596980041</id><published>2009-11-03T23:26:00.001+05:30</published><updated>2009-11-03T23:26:44.981+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-03T23:26:44.981+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Tools" /><title>Just installed VS2010 Beta2</title><content type="html">&lt;p&gt;Just installed VS2010 Beta2. &lt;/p&gt;  &lt;p&gt;Though the general layout is not new, editor is not looking a bit sluggish. Personally I am impressed with emphasis given UML. But couldn’t understand what is that InstallShield 2010 doing in VS2010 rather I was expecting WIX there. &lt;/p&gt;  &lt;p&gt;Yet to explore UML support completely. But first look is OK. It looks like there is way to generate code using extensions. I am still going to through the articles and yet to get a hang it. But I am amused to know the fact that MEF is playing a key role here.&lt;/p&gt;  &lt;p&gt;Also I am liking Architecture views, especially the dependency (directed) graph by class and its analyzer features to check circular, hub and unreferenced nodes.&lt;/p&gt;  &lt;p&gt;But I am not sure, what are improvements on metrics. I don’t see any changes.&lt;/p&gt;  &lt;p&gt;And coming back to XML. New viewer is somewhat OK but I am really missing what we had in VS2005.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9122784-8242210445596980041?l=sriharshavardhan.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/duC64rysc2HefIj0EVjKCYZGTT8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/duC64rysc2HefIj0EVjKCYZGTT8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/duC64rysc2HefIj0EVjKCYZGTT8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/duC64rysc2HefIj0EVjKCYZGTT8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/SriharshaVardhan/~4/JQ4HC4oG05s" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sriharshavardhan.blogspot.com/feeds/8242210445596980041/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9122784&amp;postID=8242210445596980041" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9122784/posts/default/8242210445596980041?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9122784/posts/default/8242210445596980041?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SriharshaVardhan/~3/JQ4HC4oG05s/just-installed-vs2010-beta2.html" title="Just installed VS2010 Beta2" /><author><name>Sriharsha Vardhan</name><uri>https://profiles.google.com/100795286323098096475</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-WSRPdIrYars/AAAAAAAAAAI/AAAAAAAAAnQ/IB8E9VyRHns/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://sriharshavardhan.blogspot.com/2009/11/just-installed-vs2010-beta2.html</feedburner:origLink></entry></feed>

