<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7972422</id><updated>2011-09-21T20:47:28.868-07:00</updated><category term='ruby'/><category term='radiant'/><category term='clojure'/><category term='quirks'/><category term='wedding'/><category term='krishashok'/><category term='github'/><category term='hacking'/><category term='erode'/><category term='zone'/><category term='video monetary system'/><category term='travels germany alps'/><category term='rant project management'/><category term='random 7'/><category term='openoffice'/><category term='microisv'/><category term='design pattern'/><category term='markov chain'/><category term='travel'/><category term='opensource'/><category term='liquid'/><category term='rubyclr'/><category term='video'/><category term='layout'/><category term='frustration'/><category term='vim'/><category term='lisp scheme arc sicp'/><category term='review'/><category term='programeter opinions'/><category term='powerpoint humour abuse'/><category term='phonetic'/><category term='abiword'/><category term='rant'/><category term='humor'/><category term='linux'/><category term='scripting'/><category term='l337 5p34k. google'/><category term='math'/><category term='scala'/><category term='emacs html-helper-mode tidy-html'/><category term='database_mailer'/><category term='ayn rand'/><category term='lisp sap abap'/><category term='tamil'/><category term='personal'/><category term='objectivism'/><category term='artha42'/><category term='satyam corporate greed'/><category term='hindi'/><category term='programming'/><category term='arc'/><category term='tutorial'/><category term='music'/><category term='xkb'/><category term='lisp'/><category term='video humor arbit'/><category term='careers'/><category term='philosophy'/><category term='clojure java'/><category term='ie'/><category term='y-combinator'/><category term='life'/><category term='observer'/><category term='yesmen'/><category term='mushy funny video'/><category term='dilbert python beautiful soup'/><category term='certification'/><category term='music spam'/><category term='git branch bash'/><category term='appengine'/><category term='starwars'/><category term='geek fun music'/><category term='log'/><category term='dilbert python reportlab'/><category term='sinatra'/><category term='project management'/><category term='fun'/><category term='fail'/><category term='call taxi'/><category term='ubuntu'/><category term='inflation economy'/><category term='social graph enterprise'/><category term='flex cross domain firefox linux'/><category term='management'/><category term='google'/><title type='text'>Vagmi's musings</title><subtitle type='html'>My musings both technical and otherwise.
(Painting the town red is so cliché)</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.vagmim.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>81</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7972422.post-4791026302679035775</id><published>2010-08-31T16:01:00.000-07:00</published><updated>2010-08-31T16:09:29.104-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fail'/><category scheme='http://www.blogger.com/atom/ns#' term='call taxi'/><title type='text'>First Track Call Taxi - Epic Fail</title><content type='html'>I have got royally screwed by the First Track Call Taxi company. I cannot imagine a more irresponsible call taxi service. I was supposed to be picked up at 4 AM by a driver by the name "Nethaji" but was however informed by the driver upon my calling him at 4:10 AM that the vehicle broke down and he is not picking me up. I called the "office" to only find out that they had trusted that the driver had called me several times while I can vouch that I was awake from 3 AM packing awaiting the phone call from the driver. This level of incompetence is simply staggering. But this is the age of buyer beware. Just because an entry has a "JustDial Guarantee" it does not mean that you are guaranteed a service, let alone good service. It is just guaranteed to be available as a search result. It is quite clear that I will not be using the services of this firm henceforth. Do not deal with these guys. They are simply not worth your time.&lt;br /&gt;&lt;br /&gt;@JustDial - Please remove the guarantee from their entry and publish this as such. I am not sure if they are masquerading as a call taxi firm and are doing something else. Please note that I am not complaining about the quality of the service. I just did not receive any service at all. In that sense, the JustDial Guarantee does not mean anything to me. Also, let me give you a free SEO tip. Please generate a different URL for each item.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-4791026302679035775?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/4791026302679035775/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=4791026302679035775' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/4791026302679035775'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/4791026302679035775'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2010/08/first-track-call-taxi-epic-fail.html' title='First Track Call Taxi - Epic Fail'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-760070519036586090</id><published>2010-07-27T11:45:00.000-07:00</published><updated>2010-07-27T11:52:22.214-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='yesmen'/><category scheme='http://www.blogger.com/atom/ns#' term='review'/><title type='text'>Yes Men Fix the World</title><content type='html'>This is by far the best movie/documentary I've ever seen. Yes Men deserves a special mention and should be viewed by everyone. This sort of a film can never be published by a corporation steeped in the free market system. The YesMen have made an excellent decision to publish it via thepiratebay.org. The documentary is a very hilarious take on some of the very serious issues that is haunting the world today. A few people in the system have gotten unimaginable money and clout over the affairs of the state. Globalization has made our systems so complicated that no one individual can actually figure it out. Yet it seems that America is making decisions for the rest of the world. A nation where bills and laws are marketed by lobbyists who have deep pockets. This is a perfect recipe for a disaster.&lt;br /&gt;&lt;br /&gt;This movie portrays some of the evils of capitalism (that I often find very hard to articulate) in a very simple and effective manner. This movie is a wake up call for us. I guess this is the day of &lt;a href="http://www.timesnow.tv/articleshow/4350441.cms"&gt;tapes and sting operations&lt;/a&gt;. However, in a country like India where one's civil rights are under question, there is no guarantee for one's electronic rights. But I firmly believe that an open medium such as the internet is essential if we still have to retain the freedom of speech. &lt;br /&gt;&lt;br /&gt;You can download the movie from the &lt;a href="http://vodo.net/yesmen"&gt;YesMen website&lt;/a&gt;. Do not forget to make your donation. I made mine.&lt;br /&gt;&lt;br /&gt;&lt;object width="640" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/QnQX09DZLYE&amp;amp;hl=en_US&amp;amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/QnQX09DZLYE&amp;amp;hl=en_US&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-760070519036586090?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/760070519036586090/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=760070519036586090' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/760070519036586090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/760070519036586090'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2010/07/yes-men-fix-world.html' title='Yes Men Fix the World'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-4000958534007158773</id><published>2010-05-25T22:49:00.000-07:00</published><updated>2010-05-25T22:50:28.208-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='music'/><category scheme='http://www.blogger.com/atom/ns#' term='hacking'/><category scheme='http://www.blogger.com/atom/ns#' term='zone'/><title type='text'>My hacking playlist</title><content type='html'>This is my hacking playlist. My brain has registered these songs really well. For some reason, these help me get in the zone.&lt;br /&gt;&lt;br /&gt;&lt;object width="250" height="400"&gt; &lt;param name="movie" value="http://listen.grooveshark.com/widget.swf" /&gt; &lt;param name="wmode" value="window" /&gt; &lt;param name="allowScriptAccess" value="always" /&gt; &lt;param name="flashvars" value="hostname=cowbell.grooveshark.com&amp;widgetID=21295120&amp;style=metal&amp;bbg=FFFFFF&amp;bfg=D6D6D6&amp;bt=7A7A7A&amp;bth=FFFFFF&amp;pbg=7A7A7A&amp;pbgh=D6D6D6&amp;pfg=FFFFFF&amp;pfgh=7A7A7A&amp;si=7A7A7A&amp;lbg=7A7A7A&amp;lbgh=D6D6D6&amp;lfg=FFFFFF&amp;lfgh=7A7A7A&amp;sb=7A7A7A&amp;sbh=D6D6D6&amp;p=0" /&gt; &lt;embed src="http://listen.grooveshark.com/widget.swf" type="application/x-shockwave-flash" width="250" height="400" flashvars="hostname=cowbell.grooveshark.com&amp;widgetID=21295120&amp;style=metal&amp;bbg=FFFFFF&amp;bfg=D6D6D6&amp;bt=7A7A7A&amp;bth=FFFFFF&amp;pbg=7A7A7A&amp;pbgh=D6D6D6&amp;pfg=FFFFFF&amp;pfgh=7A7A7A&amp;si=7A7A7A&amp;lbg=7A7A7A&amp;lbgh=D6D6D6&amp;lfg=FFFFFF&amp;lfgh=7A7A7A&amp;sb=7A7A7A&amp;sbh=D6D6D6&amp;p=0" allowScriptAccess="always" wmode="window" &gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Happy hacking.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-4000958534007158773?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/4000958534007158773/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=4000958534007158773' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/4000958534007158773'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/4000958534007158773'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2010/05/my-hacking-playlist.html' title='My hacking playlist'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-9041272878395882656</id><published>2010-02-19T18:47:00.001-08:00</published><updated>2010-02-19T19:16:42.602-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='y-combinator'/><category scheme='http://www.blogger.com/atom/ns#' term='clojure'/><title type='text'>The magic of Y</title><content type='html'>I have always been a fan of lisp. I spent my fair deal of time with emacs and emacs lisp. Scheme and Dr.Scheme have always fascinated me. I am searching for a good excuse to put Clojure into action. However, I am sometimes blinded by the awesomeness of Ruby which I do a lot as a part of my day job. But Lisp is too beautiful for my mind to ignore. One of those things that interest a lisp hacker is this concept of fixed point combinator.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;A &lt;b&gt;fixed point combinator&lt;/b&gt; (or &lt;b&gt;fixed-point operator&lt;/b&gt;) is a &lt;a href="/wiki/Higher-order_function" title="Higher-order function"&gt;higher-order function&lt;/a&gt; that computes a &lt;a href="/wiki/Fixed_point_(mathematics)" title="Fixed point (mathematics)"&gt;fixed point&lt;/a&gt; of other functions. A &lt;i&gt;fixed point&lt;/i&gt; of a function &lt;b&gt;f&lt;/b&gt; is a value &lt;i&gt;x&lt;/i&gt; such that &lt;b&gt;f&lt;/b&gt;(&lt;i&gt;x&lt;/i&gt;) = &lt;i&gt;x&lt;/i&gt;. For example, 0 and 1 are fixed points of the function &lt;b&gt;f&lt;/b&gt;(&lt;i&gt;x&lt;/i&gt;) = x&lt;sup&gt;2&lt;/sup&gt;, because 0&lt;sup&gt;2&lt;/sup&gt; = 0 and 1&lt;sup&gt;2&lt;/sup&gt; = 1. Whereas a fixed-point of a first-order function (a function on "simple" values such as integers) is a first-order value, a fixed point of a higher-order function &lt;b&gt;f&lt;/b&gt; is &lt;i&gt;another function&lt;/i&gt; &lt;b&gt;p&lt;/b&gt; such that &lt;b&gt;f&lt;/b&gt;(&lt;b&gt;p&lt;/b&gt;) = &lt;b&gt;p&lt;/b&gt;. A fixed point combinator, then, is a function &lt;b&gt;g&lt;/b&gt; which produces such a fixed point &lt;b&gt;p&lt;/b&gt; for any function &lt;b&gt;f&lt;/b&gt;:&lt;br /&gt;&lt;dl&gt;&lt;br /&gt;&lt;dd&gt;&lt;b&gt;p&lt;/b&gt; = &lt;b&gt;g&lt;/b&gt;(&lt;b&gt;f&lt;/b&gt;), &lt;b&gt;f&lt;/b&gt;(&lt;b&gt;p&lt;/b&gt;) = &lt;b&gt;p&lt;/b&gt;&lt;/dd&gt;&lt;br /&gt;&lt;/dl&gt;&lt;br /&gt;or, alternately:&lt;br /&gt;&lt;dl&gt;&lt;br /&gt;&lt;dd&gt;&lt;b&gt;f&lt;/b&gt;(&lt;b&gt;g&lt;/b&gt;(&lt;b&gt;f&lt;/b&gt;)) = &lt;b&gt;g&lt;/b&gt;(&lt;b&gt;f&lt;/b&gt;).&lt;/dd&gt;&lt;br /&gt;&lt;/dl&gt;&lt;br /&gt;Shamelessly ripped from &lt;a href="http://en.wikipedia.org/wiki/Fixed_point_combinator"&gt;Wikipedia&lt;/a&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;One of the best papers I had read so far is the &lt;a href="http://www.dreamsongs.com/NewFiles/WhyOfY.pdf"&gt;Why of Y(pdf)&lt;/a&gt;. This derives the &lt;a href="http://en.wikipedia.org/wiki/Fixed_point_combinator"&gt;Y combinator&lt;/a&gt; and I thought it was beautiful derivation. However, the author uses terms like currying which is interpreted by my indian mind as a tasty gravy rather than a technique to break down a series of arguments to multiple function calls. But then I read Peter Krumin's &lt;a href="http://www.catonmat.net/blog/derivation-of-ycombinator/"&gt;derivation of Y combinator&lt;/a&gt;. This is just magical. He takes small baby steps with working scheme code and does not mix up terms used in indian recipes. This is by far the best derivation of Y-combinator I read in years.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.discovermagazine.com/loom/2008/02/17/y-combinator/" target="_blank"&gt;&lt;br /&gt;&lt;img src="http://blogs.discovermagazine.com/loom/files/2008/07/y-combinator.jpg" alt="Y combinator" title="Y combinator"/&gt;&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Disclaimer:&lt;/b&gt; I haven't read &lt;a href="http://mitpress.mit.edu/catalog/item/default.asp?ttype=2&amp;tid=4825"&gt;The Little Schemer&lt;/a&gt; yet. I am now looking for a good excuse to use scheme/clojure for my next project.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-9041272878395882656?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/9041272878395882656/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=9041272878395882656' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/9041272878395882656'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/9041272878395882656'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2010/02/magic-of-y.html' title='The magic of Y'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-3451014543659842641</id><published>2010-02-12T05:59:00.000-08:00</published><updated>2010-02-12T06:09:32.424-08:00</updated><title type='text'>Statistics is important</title><content type='html'>This is important.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.google.co.in/search?q=population+of+india&amp;ie=utf-8&amp;oe=utf-8&amp;aq=t&amp;rls=com.ubuntu:en-US:official&amp;client=firefox-a"&gt;&lt;br /&gt;The population of india&lt;/a&gt; - 1.148 Billion&lt;br /&gt;&lt;a href="http://www.google.co.in/search?q=indian+population+growth+rate&amp;ie=utf-8&amp;oe=utf-8&amp;aq=t&amp;rls=com.ubuntu:en-US:official&amp;client=firefox-a"&gt;The population growth rate&lt;/a&gt; - 1.58%&lt;br /&gt;Number of people that will be added this year - 1.8 Million&lt;br /&gt;&lt;a href="http://www.google.co.in/search?q=population+of+chennai&amp;ie=utf-8&amp;oe=utf-8&amp;aq=t&amp;rls=com.ubuntu:en-US:official&amp;client=firefox-a"&gt;Population of chennai&lt;/a&gt; - 4.34 Mio&lt;br /&gt;&lt;br /&gt;So we will add almost half of chennai in the next year. In this rate, the number of years it will take for us to double our population is approximately 45 years. Think about it. Do you really want to have children? We do not have enough resources to feed the entire country at this point.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-3451014543659842641?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/3451014543659842641/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=3451014543659842641' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/3451014543659842641'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/3451014543659842641'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2010/02/statistics-is-important.html' title='Statistics is important'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-4038787721561199246</id><published>2010-01-25T01:34:00.000-08:00</published><updated>2010-01-25T01:39:57.688-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='log'/><category scheme='http://www.blogger.com/atom/ns#' term='math'/><title type='text'>Logarithm to any base in ruby</title><content type='html'>Ruby's Math module includes functions for a natural log (log to the base e) and the common log (log to the base 10). If you have to have a log to an arbitrary base, you have to write your own. Doing so is trivial.&lt;br /&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/285744.js?file=log_base.rb"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;I will probably explain the theory behind this another day.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-4038787721561199246?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/4038787721561199246/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=4038787721561199246' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/4038787721561199246'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/4038787721561199246'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2010/01/logarithm-to-any-base-in-ruby.html' title='Logarithm to any base in ruby'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-646471723077290356</id><published>2009-12-23T05:51:00.000-08:00</published><updated>2009-12-23T06:08:16.588-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><category scheme='http://www.blogger.com/atom/ns#' term='markov chain'/><title type='text'>Markov Chains</title><content type='html'>You know developers have an itch to implement something cool that they learned about. No can say it better than XKCD.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://xkcd.com/208/"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 600px; height: 607px;" src="http://imgs.xkcd.com/comics/regular_expressions.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I learnt about &lt;a href="http://en.wikipedia.org/wiki/Markov_chain"&gt;Markov Chains&lt;/a&gt; today. &lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;In mathematics, a Markov chain, named after Andrey Markov, is a discrete random process with the Markov property. A discrete random process means a system which can be in various states, and which changes randomly in discrete steps. It can be helpful to think of the system as evolving once a minute, although strictly speaking the "step" may have nothing to do with time. The Markov property states that the probability distribution for the system at the next step (and in fact at all future steps) only depends on the current state of the system, and not additionally on the state of the system at previous steps. Since the system changes randomly, it is generally impossible to predict the exact state of the system in the future. However, the statistical properties of the system at a great many steps in the future can often be described. In many applications it is these statistical properties that are important. - From the wikipedia entry on &lt;a href="http://en.wikipedia.org/wiki/Markov_chain"&gt;Markov Chains&lt;/a&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;It was so cool that I decided to do something with it. So I wrote a simple helper that generates articles for the app that I was testing. Here is the code in all its glory. It is not the fastest piece of code and is a memory hog, but who cares? &lt;br /&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/262529.js?file=markov.rb"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;This is how you use it.&lt;br /&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/262529.js?file=usage.rb"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;And this produced this &lt;a href="http://gist.github.com/raw/262529/f53ad246a37eed108c98f05e6f3327355dff7df5/article.txt"&gt;fine article&lt;/a&gt;. Isn't this cool?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-646471723077290356?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/646471723077290356/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=646471723077290356' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/646471723077290356'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/646471723077290356'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2009/12/markov-chains.html' title='Markov Chains'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-9199288976965531477</id><published>2009-12-08T04:15:00.001-08:00</published><updated>2009-12-09T12:27:16.664-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='artha42'/><category scheme='http://www.blogger.com/atom/ns#' term='certification'/><title type='text'>The problem with certifications</title><content type='html'>There was a &lt;a href="http://article.gmane.org/gmane.org.user-groups.linux.ilugc/57656"&gt;question&lt;/a&gt; on ILUGC today to which I &lt;a href="http://article.gmane.org/gmane.org.user-groups.linux.ilugc/57660"&gt;responded&lt;/a&gt;. I am reposting it as a blog entry.&lt;br /&gt;&lt;br /&gt;You should first understand how certifications work from the perspective of a vendor who offers such certification say Microsoft, Redhat or SAP. The vendor has an economic interest in selling his product to a company. The company which buys a product (or a service in case the of Redhat) wants to know if the product/service they buy can be used by people they are going to employ. This is where the brilliance of marketing sets in. &lt;br /&gt;&lt;br /&gt;They con the students and the candidates in the job market that there are several jobs awaiting them if only they clear the certification in their technology. They then go and talk to all the colleges and institutes like NIIT and convince them to market the certification and give them the necessary materials to make it a course. They then contact book authors who fill in pages and pages with mind numbing facts about the technology. The institute in the meanwhile has started tailoring a course and claims that it can get you from a dud to a certified professional in 3 months. As with any statistical distribution in a country with a billion people, a sizable few take up the certifications. The first few batches are always tough. Only the good guys clear the first 3 or 4 batches. But good guys like to share knowledge. So they share the dumps with the world. &lt;br /&gt;&lt;br /&gt;The vendor does nothing to oppose this as they need that pool of skills in the market. After they have got enough number of people with the piece of paper with the name of the vendor and a printed signature of the CEO/founder of the company, the marketing department gets busy making powerpoint slides. The slides have graph of stating the number of people who have finished the certification and how easy it would be for their customers to find the right skills. And since the numbers (supply) are aplenty and the licensed customers are a few (demand), by the laws of economics, they should have no problem in finding people with the right skills (and a cheap pay). &lt;br /&gt;&lt;br /&gt;The mindless HR then goes and "recruits" people with certifications. So if you notice, if you are a good candidate, you can lower your value just by getting certified. There are alternative means to improve your employability. You can start contributing to open source for a start. Do not pick difficult projects. If you cannot find a project, try building something. Try creating a simple webapp or a game. I am seeing too many freshers with "Biometric AI-Driven Neural Network Enabled Grid Based Path Finding World Domination Engine" on their resumes. And they want me to believe that they did it in 3 months without being able to write fizz buzz in their favorite language. &lt;br /&gt;&lt;br /&gt;As an employer myself, I would recommend you to do the following. Take up a small project. A small pong game or a simple webapp that solves your problem and document all your learnings in a blog. This will make you a better writer and a better programmer. Use open source technologies. Apart from being the best choice in terms of freedoms that you get, you also get to interact directly with better programmers in mailing lists like these. &lt;br /&gt;&lt;br /&gt;To pioneer a change, I, on behalf of &lt;a href="http://www.artha42.com"&gt;Artha42&lt;/a&gt;, am ready mentor a select group of students every year. Your work will be entirely open sourced. I promise that you will not write a single line of proprietary code. That said, we are not Google. We are a small startup with limited resources. We cannot hold something as large as the Google Summer of Code. But we can do something smaller. If you are interested in such an internship opportunity, do drop in a line to careers &lt;at&gt; artha42 &lt;dot&gt; com with "internship" in the subject line or visit our &lt;a href="http://www.artha42.com/career.html"&gt;careers&lt;/a&gt; page.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-9199288976965531477?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/9199288976965531477/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=9199288976965531477' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/9199288976965531477'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/9199288976965531477'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2009/12/problem-with-certifications.html' title='The problem with certifications'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-1923871694881081099</id><published>2009-11-26T01:46:00.000-08:00</published><updated>2009-11-26T01:48:53.448-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='careers'/><category scheme='http://www.blogger.com/atom/ns#' term='ie'/><category scheme='http://www.blogger.com/atom/ns#' term='artha42'/><title type='text'>IE is being mean to me again</title><content type='html'>Exactly my sentiments.&lt;br /&gt;&lt;br /&gt;&lt;object width="560" height="340"&gt;&lt;param name="movie" value="http://www.youtube.com/v/vTTzwJsHpU8&amp;hl=en_US&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/vTTzwJsHpU8&amp;hl=en_US&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;BTW, &lt;a href="http://www.artha42.com"&gt;Artha42&lt;/a&gt; is also hiring talented and passionate developers. Drop in a like to careers &lt;at&gt; artha42 dot com, if you are interested.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-1923871694881081099?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/1923871694881081099/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=1923871694881081099' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/1923871694881081099'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/1923871694881081099'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2009/11/ie-is-being-mean-to-me-again.html' title='IE is being mean to me again'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-2848239865212061100</id><published>2009-11-11T09:26:00.000-08:00</published><updated>2009-11-11T09:34:32.233-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='artha42'/><category scheme='http://www.blogger.com/atom/ns#' term='krishashok'/><title type='text'>Artha42 is hiring</title><content type='html'>&lt;a href="http://www.artha42.com"&gt;Artha42&lt;/a&gt; is hiring. I have been conducting a lot of interviews lately and am completely dissappointed at the state of freshers coming out of engineering colleges. They spend 4 years supposedly studying IT and Computer Science and cannot answer a simple question like &lt;a href="http://www.codinghorror.com/blog/archives/000781.html"&gt;fizzbuzz&lt;/a&gt;. Come on. I completely agree with &lt;a href="http://krishashok.wordpress.com/"&gt;krishashok&lt;/a&gt; on this one. Chennai does have concentration camps and they are the bane for a creative society.&lt;br /&gt;&lt;br /&gt;&lt;object width="560" height="340"&gt;&lt;param name="movie" value="http://www.youtube.com/v/jpDQ66r1f9M&amp;hl=en&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/jpDQ66r1f9M&amp;hl=en&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;If there are guys wanting to work in a fun, passionate and challenging environment, please send your profile to careers &lt;at&gt; artha42.com.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-2848239865212061100?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/2848239865212061100/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=2848239865212061100' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/2848239865212061100'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/2848239865212061100'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2009/11/artha42-is-hiring.html' title='Artha42 is hiring'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-6564437094617741220</id><published>2009-10-07T01:01:00.000-07:00</published><updated>2009-10-07T01:07:54.772-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='radiant'/><category scheme='http://www.blogger.com/atom/ns#' term='quirks'/><category scheme='http://www.blogger.com/atom/ns#' term='database_mailer'/><title type='text'>Modifying Radiant's Database Mailer</title><content type='html'>Radiant's &lt;a href="http://github.com/Aissac/radiant-database-mailer-extension/"&gt;Database Mailer&lt;/a&gt; is an wonderful extension that can quickly set up mailer forms and add stuff to the database too. But they have tried to do some serious magic to ensure that arbitrary structures can be imported by defining them in the config/environment.rb. That is a bit too hacky for Rails to handle. &lt;br /&gt;&lt;br /&gt;If you decide to change the structure any time later, you cannot migrate those changes. That is quite a bummer. The crazy part is you cannot uninstall Database Mailer after that either. It keeps reporting an "undefined method set_schema_version" error. To uninstall it you have to manually nuke the form_datas (isn't data already plural?) table and related attachment tables. You also have to remove the migrations in the schema_migrations table manually. Can someone suggest a better alternative?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-6564437094617741220?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/6564437094617741220/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=6564437094617741220' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/6564437094617741220'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/6564437094617741220'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2009/10/modifying-radiants-database-mailer.html' title='Modifying Radiant&apos;s Database Mailer'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-5966449962834226169</id><published>2009-09-26T09:13:00.000-07:00</published><updated>2009-09-26T09:37:31.962-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='radiant'/><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><title type='text'>Getting to tolerate Radiant</title><content type='html'>I have been working with &lt;a href="http://radiantcms.org"&gt;Radiant&lt;/a&gt; for the past couple of days. It is definitely impressive. But I simply hated the fact that you need to work within the confines of the browser's textarea to fill in content. This is just plain lame. I am so used to &lt;a href="http://www.vim.org/"&gt;Vim&lt;/a&gt; that typing within that small window is just plain irritating. You can of course copy paste stuff from and to vim but that is equally lame. Luckily there are a couple of ways you can work around this. &lt;br /&gt;&lt;br /&gt;The first being the "&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/4125"&gt;Its all Text&lt;/a&gt;" extension. Its all text enables me to type anything that I type in a text area in vim. It is actually pretty cool.&lt;br /&gt;&lt;br /&gt;The second being &lt;a href="http://github.com/nelstrom/radiant-file-system-extension"&gt;radiant-file-system-extension&lt;/a&gt;. It allows me to use the file system and version content with git. Happy hacking with radiant.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-5966449962834226169?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/5966449962834226169/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=5966449962834226169' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/5966449962834226169'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/5966449962834226169'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2009/09/getting-to-tolerate-radiant.html' title='Getting to tolerate Radiant'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-644809400905622144</id><published>2009-04-29T02:06:00.000-07:00</published><updated>2009-04-29T02:12:02.543-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='git branch bash'/><title type='text'>Git Branch on the command prompt</title><content type='html'>It is sometimes very useful to know the git branch you are working on right from the command prompt. You can do this by editing the ~/.bashrc file.&lt;br /&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/103674.js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;This will show up a prompt which looks like this and fails gracefully when you are not on a git repo.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;vagmi@deepthought:~/work/testproj[master]$ git checkout new_feature&lt;br /&gt;Switched to branch "new_feature"&lt;br /&gt;vagmi@deepthought:~/work/testproj[new_feature]$ cd ..&lt;br /&gt;vagmi@deepthought:~/work$&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This saves a lot of "git branch" when you are coding.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-644809400905622144?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/644809400905622144/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=644809400905622144' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/644809400905622144'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/644809400905622144'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2009/04/git-branch-on-command-prompt.html' title='Git Branch on the command prompt'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-4191620858568603286</id><published>2009-04-22T03:49:00.000-07:00</published><updated>2009-04-22T04:05:13.583-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='liquid'/><category scheme='http://www.blogger.com/atom/ns#' term='github'/><category scheme='http://www.blogger.com/atom/ns#' term='sinatra'/><title type='text'>Liquid and Sinatra</title><content type='html'>&lt;a href="http://www.liquidmarkup.org/"&gt;Liquid&lt;/a&gt; is a templating language used when you need safety for your templates. I was planning to build a CMS and Liquid fit the needs of a templating library really well. I also like &lt;a href="http://www.sinatrarb.com"&gt;Sinatra&lt;/a&gt; for its simplicity. Unfortunately, Sinatra did not have support for liquid yet so I went ahead and built one. You can get that from my &lt;a href="http://github.com/vagmi/sinatra/tree/liquid"&gt;liquid topic branch&lt;/a&gt; on github.&lt;br /&gt;&lt;br /&gt;There are few significant changes that you need to care about when using liquid instead of ERB or HAML. &lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;None of the local members or class members declared will be available in your template&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The locals hash is respected even for the layout.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;You have to use {{ content }} in your layouts, instead of yielding.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;And finally a "hello world" sinatra app with liquid.&lt;br /&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/99714.js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Do let me know if you like it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-4191620858568603286?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/4191620858568603286/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=4191620858568603286' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/4191620858568603286'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/4191620858568603286'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2009/04/liquid-and-sinatra.html' title='Liquid and Sinatra'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-9103661420385123627</id><published>2009-04-15T01:40:00.000-07:00</published><updated>2009-04-15T01:44:46.646-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='starwars'/><category scheme='http://www.blogger.com/atom/ns#' term='humor'/><title type='text'>Star wars a cappella video</title><content type='html'>I just have two words for this. Bloody Brilliant.&lt;br /&gt;&lt;br /&gt;&lt;embed src="http://www.metacafe.com/fplayer/1969675/star_wars_an_a_capella_tribute_to_john_williams.swf" width="400" height="345" wmode="transparent" allowFullScreen="true" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash"&gt; &lt;/embed&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-9103661420385123627?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/9103661420385123627/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=9103661420385123627' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/9103661420385123627'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/9103661420385123627'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2009/04/star-wars-cappella-video.html' title='Star wars a cappella video'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-2153883063478919182</id><published>2009-04-01T04:08:00.000-07:00</published><updated>2009-04-01T04:13:39.294-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='project management'/><title type='text'>Lets build something already</title><content type='html'>Have ever had the feeling that when you wanted to get started with something, something else had to be done first. If you are a lone hacker banging out code, you are probably fine as you know what you are building. You do not ever have to write it down. But in teams it is vitally important that everyone knows what they are actually building.&lt;br /&gt;&lt;br /&gt;This is where product managers and project managers come in. They are supposed to have a holistic view of where the project is and where it is heading to. They are the communication hubs who deal with all sorts of information about a project and protect the team as virtual filters. The team then gets information from a single source. But you might ask what happens when there are multiple project managers and product owners but no developers in a planning meeting. The meetings tend to be something like this.&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/YawagQ6lLrA&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/YawagQ6lLrA&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt; &lt;br /&gt;&lt;br /&gt;Fortunately, there is an easy way to deal with this. Get building something already. It is far easier to figure out if the presented solution fits your needs than to speculate on how it would look like. So to all the teams that are suffering from this &lt;a href="http://en.wikipedia.org/wiki/Analysis_paralysis"&gt;analysis paralysis&lt;/a&gt;, this is my advice. Stop discussing and &lt;a href="http://www.joelonsoftware.com/articles/fog0000000339.html"&gt; start building&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-2153883063478919182?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/2153883063478919182/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=2153883063478919182' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/2153883063478919182'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/2153883063478919182'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2009/04/lets-build-something-already.html' title='Lets build something already'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-1066728710423500531</id><published>2009-02-11T21:49:00.000-08:00</published><updated>2009-02-11T21:55:57.909-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='objectivism'/><category scheme='http://www.blogger.com/atom/ns#' term='ayn rand'/><category scheme='http://www.blogger.com/atom/ns#' term='philosophy'/><title type='text'>An interview with Ayn Rand</title><content type='html'>Objectivism is very relevant, especially in today's context.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Part 1&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/7ukJiBZ8_4k&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/7ukJiBZ8_4k&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Part 2&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/pMTDaVpBPR0&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/pMTDaVpBPR0&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Part 3&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/zEruXzQZhNI&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/zEruXzQZhNI&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-1066728710423500531?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/1066728710423500531/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=1066728710423500531' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/1066728710423500531'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/1066728710423500531'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2009/02/interview-with-ayn-rand.html' title='An interview with Ayn Rand'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-2645379906029223666</id><published>2009-02-01T23:21:00.000-08:00</published><updated>2009-02-01T23:23:48.426-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video monetary system'/><title type='text'>A video on the monetary system</title><content type='html'>Apart from the conspiracy theory part in the end, this is by far the best explanation of the current monetary system.&lt;br /&gt;&lt;br /&gt;&lt;embed id="VideoPlayback" src="http://video.google.com/googleplayer.swf?docid=-9050474362583451279&amp;hl=en&amp;fs=true" style="width:400px;height:326px" allowFullScreen="true" allowScriptAccess="always" type="application/x-shockwave-flash"&gt; &lt;/embed&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-2645379906029223666?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/2645379906029223666/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=2645379906029223666' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/2645379906029223666'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/2645379906029223666'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2009/02/video-on-monetary-system.html' title='A video on the monetary system'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-1370025218050151051</id><published>2009-01-07T21:23:00.000-08:00</published><updated>2009-01-07T21:40:03.455-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='satyam corporate greed'/><title type='text'>India, say hello to Corporate Greed</title><content type='html'>I was browsing the net about the Satyam fiasco when I saw &lt;a href="http://deadpresident.blogspot.com/2009/01/satyam-mail-to-employees.html"&gt;this&lt;/a&gt;. What infuriated me were the comments on the blog. They are asking people to stick to the company. This is the time the talented people should extend their middle finger and say &lt;span style="font-weight:bold;"&gt;FUCK YOU&lt;/span&gt;  to the management. Make sure you enunciate that properly. It works best if told in groups. Tell it with enough intensity to make them die in shame.&lt;br /&gt;&lt;br /&gt;Stay with Satyam... Are you crazy?? Jump the ship now. Don't commit a career suicide. If the &lt;a href="http://en.wikipedia.org/wiki/Ramalinga_Raju"&gt;man&lt;/a&gt; had an ounce of dignity he would not have jeopardized the life of so many people. Indians do not have social security. If a guy in India does not have a job, he is literally on the streets. &lt;br /&gt;&lt;br /&gt;Ramalinga Raju was sure as hell not maintaining family accounts. The CFO, other senior managment and the financial/controlling staff would have known this. I am sure &lt;a href="http://www.pwc.com/"&gt;PWC&lt;/a&gt; would have spotted this and would have been duly silenced. Corporate Greed has entered India. &lt;br /&gt;&lt;br /&gt;If you are a good programmer, you would not have joined Satyam in the first place. But if you are there, jump now. You may not get a raise, but what the hell. You can get out of the depressing situation and have a chance a save your soul.&lt;br /&gt;&lt;br /&gt;The following days to come in an organization like Satyam would be extremely depressing and would be enough to demotivate a motivated soul. It would be full of bureaucracy where mediocrity will reign supreme. Sounds like a fun place to work?? Hell no. If you you are a rockstar coder, this is your chance. &lt;br /&gt;&lt;br /&gt;Get out of the hell hole now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-1370025218050151051?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/1370025218050151051/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=1370025218050151051' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/1370025218050151051'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/1370025218050151051'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2009/01/india-say-hello-to-corporate-greed.html' title='India, say hello to Corporate Greed'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-8905671282361413515</id><published>2008-12-24T20:29:00.000-08:00</published><updated>2008-12-24T20:37:55.678-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erode'/><title type='text'>An accidental trip to erode</title><content type='html'>I am blogging from &lt;a href="http://www.hotellejardinindia.com/"&gt;Hotel Le Jardin&lt;/a&gt;. This hotel is amazing and has free Wi-Fi. The breakfast was one of the best I had. How I got here is a topic of another blog post. It was a completely unplanned travel. More on this later. If you are anywhere around this area, Hotel Le Jardin is definitely the place to stay. &lt;br /&gt;&lt;br /&gt;&lt;iframe width="425" height="350" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="http://maps.google.com/maps?f=q&amp;amp;hl=en&amp;amp;geocode=&amp;amp;q=erode,+india&amp;amp;sll=37.0625,-95.677068&amp;amp;sspn=33.572881,79.101563&amp;amp;ie=UTF8&amp;amp;ll=11.185222,77.657804&amp;amp;spn=0.020281,0.038624&amp;amp;z=14&amp;amp;output=embed&amp;amp;s=AARTsJoBWzSyCgVN_Ss2Qly0-GyJT6a3qw"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;small&gt;&lt;a href="http://maps.google.com/maps?f=q&amp;amp;hl=en&amp;amp;geocode=&amp;amp;q=erode,+india&amp;amp;sll=37.0625,-95.677068&amp;amp;sspn=33.572881,79.101563&amp;amp;ie=UTF8&amp;amp;ll=11.185222,77.657804&amp;amp;spn=0.020281,0.038624&amp;amp;z=14&amp;amp;source=embed" style="color:#0000FF;text-align:left"&gt;View Larger Map&lt;/a&gt;&lt;/small&gt;&lt;br /&gt;&lt;br /&gt;Free WiFi Rocks. :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-8905671282361413515?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/8905671282361413515/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=8905671282361413515' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/8905671282361413515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/8905671282361413515'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2008/12/accidental-trip-to-erode.html' title='An accidental trip to erode'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-8515242661175252295</id><published>2008-12-15T04:02:00.000-08:00</published><updated>2008-12-15T04:04:50.921-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='management'/><title type='text'>Annual Performance Reviews and Mediocrity</title><content type='html'>Now that Performance Reviews are hanging around, all managers MUST read this.&lt;br /&gt;&lt;a href=" http://headrush.typepad.com/creating_passionate_users/2006/02/mediocrity_by_a.html"&gt;&lt;br /&gt;http://headrush.typepad.com/creating_passionate_users/2006/02/mediocrity_by_a.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-8515242661175252295?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/8515242661175252295/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=8515242661175252295' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/8515242661175252295'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/8515242661175252295'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2008/12/annual-performance-reviews-and.html' title='Annual Performance Reviews and Mediocrity'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-9082752451438223698</id><published>2008-11-18T08:01:00.000-08:00</published><updated>2008-11-18T08:17:15.275-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='emacs html-helper-mode tidy-html'/><title type='text'>HTML Helper Mode and Indentation</title><content type='html'>This is my third post for the day. I blogged about &lt;a href="http://blog.vagmim.com/2008/11/meetings-and-boredom.html"&gt;this&lt;/a&gt; and &lt;a href="http://blog.vagmim.com/2008/11/meetings-and-boredom-continues.html"&gt;this&lt;/a&gt; earlier today. Writing smaller pieces regularly works much better than waiting for the big post. Commenters, do let me know if you like this style better.&lt;br /&gt;&lt;br /&gt;I am really irritated with the html-helper-mode's indentation. It flattens the code rather than indenting it. I missed my &lt;a href="http://tidy.sourceforge.net/"&gt;tidy&lt;/a&gt; command from yesteryears when I did not use emacs. But I am coding on emacs now. I do not have to miss anything from within emacs. So, I added a tidy-html function to format the html as properly indented XHTML. &lt;br /&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/26161.js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;And I absolutely love &lt;a href="http://gist.github.com"&gt;Gist&lt;/a&gt;. It has solved all the quirks involved with posting code on a blog.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-9082752451438223698?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/9082752451438223698/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=9082752451438223698' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/9082752451438223698'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/9082752451438223698'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2008/11/html-helper-mode-and-indentation.html' title='HTML Helper Mode and Indentation'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-922130652241892748</id><published>2008-11-18T02:30:00.000-08:00</published><updated>2008-11-18T02:36:22.754-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dilbert python reportlab'/><title type='text'>Meetings and Boredom continue</title><content type='html'>I am sitting on yet another &lt;a href="http://blog.vagmim.com/2008/11/meetings-and-boredom.html"&gt;boring meeting&lt;/a&gt; and have written a script to write it to a PDF. Its not a pretty one but I got it done in 30 mins. That has to count for something. You would need &lt;a href="http://www.reportlab.org/"&gt;ReportLab&lt;/a&gt; and &lt;a href="http://www.pythonware.com/products/pil/"&gt;PIL&lt;/a&gt; for this.&lt;br /&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/26096.js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Beautiful Soup and ReportLab rock.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-922130652241892748?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/922130652241892748/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=922130652241892748' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/922130652241892748'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/922130652241892748'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2008/11/meetings-and-boredom-continues.html' title='Meetings and Boredom continue'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-4630382046616007521</id><published>2008-11-18T01:37:00.000-08:00</published><updated>2008-11-18T01:41:33.277-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dilbert python beautiful soup'/><title type='text'>Meetings and Boredom</title><content type='html'>I am sitting in a really boring meeting. I was browsing reddit and found a very interesting dilbert script. I am a huge fan of Dilbert and wanted to download Dilbert strips for offline viewing. I know its not entirely ethical but what the hell. I wrote a small python screen scraper to do that. This requires you to download &lt;a href="http://www.crummy.com/software/BeautifulSoup/"&gt;Beautiful Soup&lt;/a&gt;. If I am too bored, I will write a script to compose it as a PDF.&lt;br /&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/26089.js"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-4630382046616007521?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/4630382046616007521/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=4630382046616007521' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/4630382046616007521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/4630382046616007521'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2008/11/meetings-and-boredom.html' title='Meetings and Boredom'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-6765121505792865337</id><published>2008-10-09T21:05:00.000-07:00</published><updated>2008-10-10T00:30:51.708-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='clojure java'/><title type='text'>Hello Clojure</title><content type='html'>&lt;pre&gt;&lt;code&gt;&lt;br /&gt;; HelloClojure.clj&lt;br /&gt;(import '(javax.swing JFrame JLabel)&lt;br /&gt;  (doto (JFrame.)&lt;br /&gt;    (add (JLabel. "Hello Clojure!"))&lt;br /&gt;    (setTitle "Clojure!")&lt;br /&gt;    (pack) (show))&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I have a strong feeling that the lisp is all set to make a comeback in the enterprise. Check out &lt;a href="http://clojure.org"&gt;Clojure&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Dedicated to all the souls plagued with the horrors of sane concurrency.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-6765121505792865337?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/6765121505792865337/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=6765121505792865337' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/6765121505792865337'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/6765121505792865337'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2008/10/hello-clojure.html' title='Hello Clojure'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-1489403290994263873</id><published>2008-10-05T23:30:00.000-07:00</published><updated>2008-10-05T23:33:22.926-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='random 7'/><title type='text'>The day of 7</title><content type='html'>My email has got some fascination with 7 today. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_H7X0uGKH8C0/SOmxBLjSPCI/AAAAAAAAChc/T9HUpmwX9uY/s1600-h/funnynumbers.PNG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_H7X0uGKH8C0/SOmxBLjSPCI/AAAAAAAAChc/T9HUpmwX9uY/s320/funnynumbers.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5253925074143165474" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-1489403290994263873?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/1489403290994263873/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=1489403290994263873' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/1489403290994263873'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/1489403290994263873'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2008/10/day-of-7.html' title='The day of 7'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_H7X0uGKH8C0/SOmxBLjSPCI/AAAAAAAAChc/T9HUpmwX9uY/s72-c/funnynumbers.PNG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-8685767295812127301</id><published>2008-09-28T23:58:00.000-07:00</published><updated>2008-09-29T18:30:32.549-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant project management'/><title type='text'>PMP?.. me?... you must be kidding</title><content type='html'>I was reading my dilbert strips, when I noticed the ad below.&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;img src="http://lh5.ggpht.com/vagmi.mudumbai/SOB5Pl624jI/AAAAAAAACf4/RM6wzdukJ5M/dilbertwithad.GIF"/&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;Seriously! Do they really think that people who enjoy dilbert would like taking a PMP certification exam to become a (better) project manager? People, who know me, know that I have a low opinion of certifications. What they probably do not know is that I have a even lower opinion of these kits that provide improbable percentage of "Unconditional test pass guarantee". I followed the ad and was greeted with the following error.&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;img src="http://lh6.ggpht.com/vagmi.mudumbai/SOB5QIvFjEI/AAAAAAAACgA/YrzWLG2-iM0/google_adsense_error.GIF"/&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;I did a little more digging to find out &lt;a href="http://www.whizlabs.com/pmp-certification.html"&gt;about it&lt;/a&gt;. They have dropped 50% chance of you passing and the guarantee is no more unconditional. The comments below have "brain dump" screaming all over it. &lt;br /&gt;&lt;br /&gt;There is really not much to project management. You have to manage priorities of the stake holders. You have scope, time and cost as your constraints. But what they dont tell you is that you cannot treat people like replacable cogs. The stuff that they teach you in PMP is a bunch of processes and the PMP certification exam is a test of memory. Having a PMP certification does not mean jack about your project management skills. In fact, I would be wary of a person who claims that PMP helped become a project manager. It is not that I have absolute distrust in certifications... oh wait .. I do. They can be cheated very easily. I know of a dozen MCSEs, MCPs (not male chauvinistic pigs), PMPs who do not have a clue of the stuff they have got certified in.&lt;br /&gt;&lt;br /&gt;I don't know why organizations pushing for PMP certifications for their employees. I am sure there is some sick demented reason why they are doing so. &lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt; Hire people with common sense. (This would only work if you have common sense.)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Promote your developers with a good aptitude towards management to management. &lt;/li&gt;&lt;br /&gt;&lt;li&gt; Don't recruit B-School grads who haven't written a line of code straight off the school to do project management&lt;/li&gt;&lt;br /&gt;&lt;li&gt; And for heaven's sake don't assume that people with PMP certifications are knowledgeable in project management. They have only made PMI wealthier. &lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;If you want your project managers to be better project managers, ask them to read &lt;a href="http://www.amazon.com/Mythical-Man-Month-Software-Engineering-Anniversary/dp/0201835959"&gt;"The Mythical Man Month"&lt;/a&gt;. That book is quite relevant even in today's context.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-8685767295812127301?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/8685767295812127301/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=8685767295812127301' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/8685767295812127301'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/8685767295812127301'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2008/09/pmp-me-you-must-be-kidding.html' title='PMP?.. me?... you must be kidding'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/vagmi.mudumbai/SOB5Pl624jI/AAAAAAAACf4/RM6wzdukJ5M/s72-c/dilbertwithad.GIF' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-2616072146852805412</id><published>2008-08-28T21:26:00.000-07:00</published><updated>2008-08-28T21:27:46.200-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mushy funny video'/><title type='text'>Hug a developer</title><content type='html'>&lt;embed src="http://blip.tv/play/gYwjwZJqjdEh" type="application/x-shockwave-flash" width="640" height="390" allowscriptaccess="always" allowfullscreen="true"&gt;&lt;/embed&gt; &lt;br /&gt;&lt;br /&gt;Recognize how hard we work. Hug a developer today. :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-2616072146852805412?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/2616072146852805412/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=2616072146852805412' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/2616072146852805412'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/2616072146852805412'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2008/08/hug-developer.html' title='Hug a developer'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-6865346137811541693</id><published>2008-07-03T21:58:00.000-07:00</published><updated>2008-07-03T22:05:30.860-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programeter opinions'/><title type='text'>Open letter to Programeter</title><content type='html'>Mark from Programeter had left the following comment on my &lt;a href="http://blog.vagmim.com/2008/07/dumbest-idea-ever.html"&gt;earlier post&lt;/a&gt; on &lt;a href="http://www.programeter.com/"&gt;Programeter&lt;/a&gt;. I started typing out my response as a comment but it was turning out to be too long. So I decided to make it another post in itself.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;I am from Programeter - hope I will survive the criticts after mentioning that ;).&lt;br /&gt;&lt;br /&gt;There are so many questions in the post and comments, so I can't aswer all of those in just one reply. So if I missed yours, go &lt;a href="http://getsatisfaction.com/programeter"&gt;here&lt;/a&gt; and post them.&lt;br /&gt;&lt;br /&gt;But some comments are here:&lt;br /&gt;* I am not sure I understand why all programmers so afraid of being measured. Would you imagine all salesmen quiting the company because of introduction of CRM? Good programmers should not be afraid of any indicator.&lt;br /&gt;* Yes, I agree "stupid" managers can get it wrong. But stupid managers will get it wrong with or without Programeter.&lt;br /&gt;* Lots of comments, about cheating the system. Go and try to cheat it ;) if you cheat at least 3 of our indicators during one reporting period - Programeter will quit measuring your company as a bonus ;)&lt;br /&gt;&lt;br /&gt;if you have more questions, let me know!&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Hi Mark,&lt;br /&gt;&lt;br /&gt;First off, thanks for &lt;a href="http://getsatisfaction.com/programeter"&gt;opening up&lt;/a&gt; this discussion. This has done a lot to increase my trust in you. What would really salvage the reputation of Programeter from this situation, is to point Programeter on an Open Source codebase (e.g., subversion) and provide the reports online for the world to see. If they do make sense, we would be more than happy to embrace it and even suggest changes to it. &lt;br /&gt;&lt;br /&gt;We (Programmers) are not afraid of being measured. We are insulted by the notion that the decisions on those measures could potentially be taken by some management folks who have absolutely no idea of what programming is about. This tool is dangerous in the hands of bad management.&lt;br /&gt;&lt;br /&gt;Bad management already refers to programmers as resources as if they are interchangeable cogs in a system. The marketing material on your site does nothing to change this. We have had several epic fails in our industry because of clueless management. The last thing we need is another earnest effort by smart developers to fuel this trend.&lt;br /&gt;&lt;br /&gt;Also, there are other ways in which individuals who code add value to an organization. Interacting with people, making teams gel, sharing knowledge on corporate wikis/discussion boards, having passionate coffee corner chats to keep the spirit of the team and so on. None of these are on source control. People's contribution cannot be measured but it is essential for an organization to judge the value added by an individual to an organization. Not all of these judgments can be based on objectivity and measurable facts. Programeter can only suggest facts about one of the facets of an individual's contribution. Suggesting an interpretation of it should be best left to the manager and not by the tool. There has been a lot of discussion about kLOCs. Is more better or is less better. There are other softer issues like security, performance or just an annoying API bug that had to be worked around. You can only present the facts. You cannot draw conclusions without knowing the whole. And those facts are not on source control. I am not dissing the tool. As a nerd I love statistics. I love generating insight on raw data. I would however take caution in interpreting the reports and weigh other facts before making a decision. &lt;br /&gt;&lt;br /&gt;The bottom line is. &lt;br /&gt;Code Checked into Source Control != Value Generated&lt;br /&gt;&lt;br /&gt;The marketing material on your site is completely laughable. If anything, it only damages the credibility of your product. It would be bought by wrong companies and will be used to make wrong decisions. I am sure that this would not help the sales of your software in the long run. Reconsider your selling approach and come up with proof that your tool works. If you can do both, I wish you all the success for this tool.&lt;br /&gt;&lt;br /&gt;Regards,&lt;br /&gt;Vagmi&lt;br /&gt;(An individual contributor to a big Software company)&lt;br /&gt;&lt;br /&gt;Disclaimer: All of these opinions are mine and do not represent the views of my employer.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-6865346137811541693?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/6865346137811541693/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=6865346137811541693' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/6865346137811541693'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/6865346137811541693'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2008/07/open-letter-to-programeter.html' title='Open letter to Programeter'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-6337487202962485864</id><published>2008-07-02T03:28:00.000-07:00</published><updated>2008-07-02T04:11:36.853-07:00</updated><title type='text'>The dumbest idea ever</title><content type='html'>I just came across this product called &lt;a href="http://www.programeter.com/"&gt;Programeter&lt;/a&gt;. There are only two possible market segments for this product. &lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Managers who have no friggin' clue of what programming is&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;PLAIN DUMB FUCKING IDOTS&lt;/b&gt;.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Now that I have got your attention, lets move on. This is what is displayed as their sales pitch. Look at the first item on the list. &lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Companies have merged and you need to decide what 15% of programmers to let go?&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Your consultancy firm needs an estimation report of your client's programmers  next week?&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Need to double check your team leader reports by actual data?&lt;/li&gt;&lt;br /&gt;&lt;li&gt;You are a newly assigned project leader and NEED to know what's going on in your team?&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Most companies should already know this. Any productivity measurement for a programmer can be cheated. If you have made a mistake in your recruitment, its already too late. There is no way around it. So stop recruiting people by the truckload. Look for good people with all round skills. Learning a new language or a technology platform is not difficult for a good engineer. Unfortunately, the entire Indian HR recruiting industry does a little more than keyword match to select potential candidates. Every HR Manager working in a software company must read "&lt;a href="http://www.amazon.com/Smart-Gets-Things-Done-Technical/dp/1590598385"&gt;Smart and Gets things done&lt;/a&gt;".&lt;br /&gt;&lt;br /&gt;If you already have the wrong people on board long enough, you are doomed. And one way of knowing that you have a wrong person long enough is to ask your middle management on their views of using Programeter. If they give a glowing recommendation of the product, &lt;a href="http://www.testearly.com/2007/08/17/fire-your-best-peoplereward-the-lazy-ones/"&gt;fire them&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-6337487202962485864?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/6337487202962485864/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=6337487202962485864' title='28 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/6337487202962485864'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/6337487202962485864'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2008/07/dumbest-idea-ever.html' title='The dumbest idea ever'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>28</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-4194184405368144290</id><published>2008-06-02T21:28:00.000-07:00</published><updated>2008-06-02T21:31:48.631-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='powerpoint humour abuse'/><title type='text'>For all you PPT-Phobes and PPT-Philes</title><content type='html'>A hilarious rendering of the common mistakes while (ab)using Powerpoint. Sadly, I have been abused by very many of those and there are still a lot more to come.&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://www.youtube.com/v/HLpjrHzgSRM&amp;hl=en"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/HLpjrHzgSRM&amp;hl=en" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;I am a PPT-phobe. Don't get your PPT near me. I am allergic to PPTs.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-4194184405368144290?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/4194184405368144290/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=4194184405368144290' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/4194184405368144290'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/4194184405368144290'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2008/06/for-all-you-ppt-phobes-and-ppt-philes.html' title='For all you PPT-Phobes and PPT-Philes'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-4265824783134242480</id><published>2008-05-16T05:39:00.000-07:00</published><updated>2008-05-16T05:40:38.008-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='inflation economy'/><title type='text'>Inflation</title><content type='html'>For people worrying about inflation in India, we can at least reconcile to the fact that things are not &lt;a href="http://en.wikipedia.org/wiki/Hyperinflation#Zimbabwe.2C_2000s"&gt;this bad&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-4265824783134242480?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/4265824783134242480/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=4265824783134242480' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/4265824783134242480'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/4265824783134242480'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2008/05/inflation.html' title='Inflation'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-6763058066214249028</id><published>2008-05-08T22:55:00.000-07:00</published><updated>2008-05-08T23:03:09.746-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='travel'/><category scheme='http://www.blogger.com/atom/ns#' term='life'/><title type='text'>Life, Travel and Marriage</title><content type='html'>I was reading this blog about &lt;a href="http://www.expatsoftware.com/articles/2008/05/laid-off-one-thing-you-absolutely-need.html"&gt;things to do when you are laid off&lt;/a&gt;. Although there is is no imminent threat to my job, this is a reality that everybody in the IT industry faces at least once in their career. Even otherwise, taking some time off to travel isn't a bad idea. I was reading this article through the section on the lame reasons why one might not want to travel and I found this.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;b&gt;But I'm married with a family and a house...&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Ok, you win. You're screwed, but that's the life you chose for yourself so you're going to have to live it. ...&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Ouch!! Thats a pretty hard statement but I digress. I don't mind traveling on a once in a life time trip with my wife even if both of us have to resign to take the time off for six months. I am confident that the IT industry would not change so drastically as to render me unemployable. So when are you guys planning your vacation?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-6763058066214249028?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/6763058066214249028/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=6763058066214249028' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/6763058066214249028'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/6763058066214249028'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2008/05/life-travel-and-marriage.html' title='Life, Travel and Marriage'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-3978009887751315778</id><published>2008-05-02T19:56:00.000-07:00</published><updated>2008-05-02T19:58:05.698-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='geek fun music'/><title type='text'>A funny song on the MVC paradigm</title><content type='html'>I came across this really funny song on Youtube about MVC paradigm. Enjoy.&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://www.youtube.com/v/YYvOGPMLVDo&amp;hl=en"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/YYvOGPMLVDo&amp;hl=en" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-3978009887751315778?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/3978009887751315778/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=3978009887751315778' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/3978009887751315778'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/3978009887751315778'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2008/05/funny-song-on-mvc-paradigm.html' title='A funny song on the MVC paradigm'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-7137589209432557623</id><published>2008-04-30T01:41:00.000-07:00</published><updated>2008-04-30T05:23:59.173-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp sap abap'/><title type='text'>Need for a business language</title><content type='html'>As many of my readers already know, I work for &lt;a href="http://en.wikipedia.org/wiki/SAP_AG#SAP_Labs"&gt;SAP&lt;/a&gt;. It is my personal belief that SAP R/3 is so successful only because of its ABAP system. The language provides the right level of abstraction and has appropriate tooling to build business applications. I learned &lt;a href="http://en.wikipedia.org/wiki/Abap"&gt;ABAP&lt;/a&gt; only a year before (while I have been with SAP for over 3 years now). I was amazed by the speed and agility with which you could create a database driven application and expose your business logic to the outside world in minutes. &lt;br /&gt;&lt;br /&gt;The language, as any old language, has its idiosyncracies. But the way it handles database interactions with transparent and internal tables and "Open SQL" is really cool. I haven't programmed in the OO version of ABAP yet. But at initial glance it seems to have been corrupted by the idea of OO from C++ and Java. No one could have put it more adequately than Alan Kay himself.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. -- Alan Kay&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;As we move on to the new decade, we are in need of a language that is closer to the business roots. A language that can be molded to best describe the problems in the business domain. As a hacker, the language that immediately comes to my mind is Lisp. Unfortunately, Lisp is not taught in schools as much it should be taught. &lt;br /&gt;&lt;br /&gt;In an excellent &lt;a href="http://www.stsc.hill.af.mil/CrossTalk/2008/01/0801DewarSchonberg.html"&gt;essay&lt;/a&gt; by the folks from AdaCore, they express their concerns about using Java as the first language that is taught to programmers.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;It is our view that Computer Science (CS) education is neglecting basic skills, in particular in the areas of programming and formal methods. We consider that the general adoption of Java as a first programming language is in part responsible for this decline. We examine briefly the set of programming skills that should be part of every software professional’s repertoire. &lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Further in the essay they insist on why Lisp still matters. (Emphasis mine.)&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Why Lisp Matters&lt;br /&gt;&lt;br /&gt;Every programmer must be comfortable with functional programming and with the important notion of referential transparency. Even though most programmers find imperative programming more intuitive, they must recognize that in many contexts that a functional, stateless style is clear, natural, easy to understand, and efficient to boot.&lt;br /&gt;&lt;br /&gt;An additional benefit of the practice of Lisp is that the program is written in what amounts to abstract syntax, namely the internal representation that most compilers use between parsing and code generation. Knowing Lisp is thus an excellent preparation for any software work that involves language processing.&lt;br /&gt;&lt;br /&gt;Finally, Lisp (at least in its lean Scheme incarnation) is amenable to a very compact self-definition. &lt;b&gt;Seeing a complete Lisp interpreter written in Lisp is an intellectual revelation that all computer scientists should experience.&lt;/b&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Page 13 of this &lt;a href="http://books.google.co.in/books?id=68j6lEJjMQwC&amp;pg=PA76&amp;lpg=PA76&amp;dq=lisp+1.5+programmers+manual&amp;source=web&amp;ots=Ihq8m-_uyo&amp;sig=mgiTYn_VR6YzpeLuV8JRl4deWvE&amp;hl=en#PPA13,M1"&gt;book&lt;/a&gt;(PDF) by John McCarthy is literally the source of intellectual revelation.&lt;br /&gt;&lt;br /&gt;Eric Raymond's &lt;a href="http://catb.org/~esr/faqs/hacker-howto.html"&gt;essay&lt;/a&gt; was one of the reasons that I started learning Lisp. He has the following opinion on Lisp.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;LISP is worth learning for a different reason — the profound enlightenment experience you will have when you finally get it. That experience will make you a better programmer for the rest of your days, even if you never actually use LISP itself a lot. &lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;I strongly suspect that the source of the "profound enlightenment experience" lies somewhere in understanding the code in Page 13 of the book.&lt;br /&gt;&lt;br /&gt;I do not insist that the new business language has to be lisp. But lisp is the only language that satisfies such criteria. Problem domains keep changing and the by far the only language that is agile enough and malleable to fit the problem domain is lisp. Note that I am not saying that we would have to use Scheme, Common Lisp or Arc. I am just saying that we need a language similar to these. It could as well be a lisp written on top of any of these lisps, CLR or JVM. What matters here is the language - a formal notion to express our ideas. The compiler, VM and the platform are implementation details. Paul Graham explains this nicely in a rather long essay titled "The Hundred-Year Language".&lt;br /&gt;&lt;br /&gt;But you might argue that Java and C++ are established languages. People are creating enterprise software with Java and C++. Why should we change? But look at the enterprise software carefully. Most of what took man years to implement in Java/C++ could have been achieved with much less effort using Lisp. Or if the system was well designed using the popular knowledge of design patterns that has evolved in the community, you would have created half of the abstractions present in lisp anyway. This is called the &lt;a href="http://en.wikipedia.org/wiki/Greenspun%27s_Tenth_Rule"&gt;Greenspun's Tenth Rule of Programming&lt;/a&gt;. Although it explicitly states C or Fortran, I believe that it holds good for languages like Java too.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;"Greenspun's Tenth Rule of Programming: any sufficiently complicated C or Fortran program contains an ad hoc informally-specified bug-ridden slow implementation of half of Common Lisp."&lt;br /&gt;&lt;br /&gt;- Philip Greenspun&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Even the co-auther of the Java language spec, Guy Steele, &lt;a href="http://people.csail.mit.edu/gregs/ll1-discuss-archive-html/msg04045.html"&gt;accepts&lt;/a&gt; that Java is no match for the features in Lisp.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;And you're right: we were not out to win over the Lisp programmers; we were after the C++ programmers.  We managed to drag a lot of them about halfway to Lisp.  Aren't you happy? -- Guy Steele&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Why are we still targeting Java as the language of choice to build business applications? The cool kids have already moved to Ruby. But wait, I heard Matz said something about lisp.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Some may say Ruby is a bad rip-off of Lisp or Smalltalk, and I admit that. But it is nicer to ordinary people. - &lt;a href="http://en.wikipedia.org/wiki/Yukihiro_Matsumoto"&gt;Matz&lt;/a&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Its time to revive the 50 year old language and start to rediscover the language used by our previous generation.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://xkcd.com/297/"&gt; &lt;br /&gt;&lt;img src="http://imgs.xkcd.com/comics/lisp_cycles.png"&gt; &lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As &lt;a href="http://en.wikipedia.org/wiki/Kernighan"&gt;Kernighan&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Dennis_Ritchie"&gt;Ritchie&lt;/a&gt; once suggested -&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;The only way to learn a new programming language is by writing programs in it. - K&amp;R&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Keep coding. You know I am (in Lisp).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-7137589209432557623?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/7137589209432557623/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=7137589209432557623' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/7137589209432557623'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/7137589209432557623'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2008/04/need-for-business-language.html' title='Need for a business language'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-637303571947764832</id><published>2008-04-11T02:51:00.000-07:00</published><updated>2008-04-11T03:04:38.340-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='microisv'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='appengine'/><title type='text'>AppEngine and the MicroISV</title><content type='html'>Amazon pioneered the effort of providing computing and storage resources as a services like &lt;a href="http://aws.amazon.com/s3"&gt;S3&lt;/a&gt;, &lt;a href="http://aws.amazon.com/ec2"&gt;EC2&lt;/a&gt;, &lt;a href="http://aws.amazon.com/simpledb"&gt;SimpleDB&lt;/a&gt;, &lt;a href="http://aws.amazon.com/sqs"&gt;SQS&lt;/a&gt; and &lt;a href="http://www.amazon.com/gp/browse.html?node=3435361"&gt;so on&lt;/a&gt;. There were rumors that Google would come up with something like this but boy did they surprise everyone. Instead of exposing individual services they have now exposed a coherent framework to build applications on Google scale infrastructure.Google &lt;a href="http://appengine.google.com"&gt;AppEngine&lt;/a&gt; used in conjunction with &lt;a href="http://www.google.com/a"&gt;Google Apps for your domain&lt;/a&gt; is a brand new market for &lt;a href="http://en.wikipedia.org/wiki/Micro_ISV"&gt;microISVs&lt;/a&gt; to target. They could develop enterprise applications on Google scale hardware and have it integrate with the rest of Google's application suite. Google already had provided Sites and Page Creator. These were at best very weak for an organization's web presence. With Google's AppEngine small and medium scale organizations can look at Google AppEngine as a serious option for their enterprise IT system. &lt;br /&gt;&lt;br /&gt;Google Apps for your domain, for those who were living under a rock, provides GMail, GTalk and collaborative office suite for free or for a small fee. Imagine the tons of money that you save on licenses if you had to use Windows servers for your domain and email. Even if you had chosen Linux, the costs of administration and anti spam filtering and the hardware for the servers simply do not exist with Google Apps for your domain. It was almost good for enterprises but not good enough. They still had to worry about their ERP, CRM and other enterprise TLA systems. Salesforce was an option but something was still off with it. That's for a different post. &lt;br /&gt;&lt;br /&gt;Google, with its new AppEngine offering, has opened the floodgates of various applications that can be hosted on Google scale infrastructure with pay as you use model for application resources. This is just as &lt;a href="http://www.roughtype.com/index.php"&gt;Nicholas Carr&lt;/a&gt; from the &lt;a href="http://www.nicholasgcarr.com/articles/matter.html"&gt;IT doesn't matter&lt;/a&gt; fame  &lt;a href="http://www.roughtype.com/archives/2008/02/alan_turing_clo.php"&gt;suggested&lt;/a&gt;. Google is commoditizing the computing resources. This is a disruptive innovation which would change the dynamics of how applications are created. It wouldn’t be long for Google to provide a repository of applications that you could just deploy with a click on your domain. Currently Google AppEngine allows you to write applications in &lt;a href="http://www.python.org"&gt;Python&lt;/a&gt;. They have very clean APIs for integrated User authentication, mail integration, ability to build mashups using the URL Fetch API and store data on Google's BigTable. Google has said that it would add support for other languages. But who needs other languages when you have Python. :-)&lt;br /&gt;&lt;br /&gt;Google's offering levels the playing field for ISVs looking to build web-based enterprise products. So, stop reading and start coding. You know I am.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-637303571947764832?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/637303571947764832/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=637303571947764832' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/637303571947764832'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/637303571947764832'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2008/04/appengine-and-microisv.html' title='AppEngine and the MicroISV'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-3985831974660389230</id><published>2008-03-12T23:01:00.001-07:00</published><updated>2008-03-12T23:02:19.375-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='music spam'/><title type='text'>The Spam Song</title><content type='html'>A really funny song about spam.&lt;br /&gt;&lt;br /&gt;Eva Moon: Cash from Nigeria&lt;br /&gt;&lt;object&gt;&lt;embed src="http://static.thesixtyone.com/site_media/swf/song_player_embed.swf?song_id=10050" type="application/x-shockwave-flash" wmode="transparent" width="310" height="120"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-3985831974660389230?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/3985831974660389230/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=3985831974660389230' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/3985831974660389230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/3985831974660389230'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2008/03/spam-song.html' title='The Spam Song'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-332947206475899147</id><published>2008-03-10T05:47:00.000-07:00</published><updated>2008-03-10T05:59:09.661-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flex cross domain firefox linux'/><title type='text'>Override cross domain policy for local files</title><content type='html'>I have been working with Flex for the past couple of weeks to build a quick UI Dashboard for our application. We were running this application from the local file system. For some reason it did not work on my machine alone due to the cross domain policy. I then later figured that it was because I was using Firefox and all the others were using IE. &lt;br /&gt;&lt;br /&gt;I fixed it then by adding my built file as a trusted swf. See &lt;a href="http://livedocs.adobe.com/flex/3/html/help.html?content=05B_Security_03.html"&gt;here&lt;/a&gt; for more information. The documentation does not say anything about Linux. But you can do the same for Linux as well. You would need to add a similar text file in the following directory.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;~/.macromedia/Flash_Player/#Security/FlashPlayerTrust&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;This is very useful for quick prototyping. You need to work with a proxy after that or better yet make some sense of the web services on your server side.&lt;br /&gt;&lt;br /&gt;Have fun. Keep coding.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-332947206475899147?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/332947206475899147/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=332947206475899147' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/332947206475899147'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/332947206475899147'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2008/03/override-cross-domain-policy-for-local.html' title='Override cross domain policy for local files'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-6534315654322556098</id><published>2008-02-25T02:55:00.000-08:00</published><updated>2008-02-25T03:04:25.288-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='travels germany alps'/><title type='text'>Hallo Garmisch-Partenkirchen</title><content type='html'>We (Me, Balaji, Vikas and Atri) had a nice one day trip to Garmisch-Partenkirchen to see the beautiful German Alps. You can find some of the pictures we took &lt;a href="http://picasaweb.google.com/vagmi.mudumbai/TheAlpsTour"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;embed type="application/x-shockwave-flash" src="http://picasaweb.google.com/s/c/bin/slideshow.swf" width="288" height="192" flashvars="host=picasaweb.google.com&amp;RGB=0x000000&amp;feed=http%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2Fvagmi.mudumbai%2Falbumid%2F5170863296024488785%3Fkind%3Dphoto%26alt%3Drss" pluginspage="http://www.macromedia.com/go/getflashplayer"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;br /&gt;We took a nice scenic route via Austria into Garmisch. The map is not the exact route we took but pretty close.&lt;br /&gt;&lt;br /&gt;&lt;iframe width="425" height="350" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="http://maps.google.com/maps?f=d&amp;amp;hl=en&amp;amp;geocode=&amp;amp;saddr=Neurottstr.+15a,+69190+Walldorf,+Germany+(SAP+AG+%26+Co.+Kg)&amp;amp;daddr=47.551506,10.652618+to:Garmisch-Partenkirchen,+Germany&amp;amp;mra=dpe&amp;amp;mrcr=0&amp;amp;mrsp=1&amp;amp;sz=10&amp;amp;via=1&amp;amp;sll=47.515346,10.6073&amp;amp;sspn=0.608448,1.2854&amp;amp;ie=UTF8&amp;amp;ll=47.515346,10.6073&amp;amp;spn=0.608448,1.2854&amp;amp;output=embed&amp;amp;s=AARTsJr_zZhp82kPKLNxIzulEzi70n71NA"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;small&gt;&lt;a href="http://maps.google.com/maps?f=d&amp;amp;hl=en&amp;amp;geocode=&amp;amp;saddr=Neurottstr.+15a,+69190+Walldorf,+Germany+(SAP+AG+%26+Co.+Kg)&amp;amp;daddr=47.551506,10.652618+to:Garmisch-Partenkirchen,+Germany&amp;amp;mra=dpe&amp;amp;mrcr=0&amp;amp;mrsp=1&amp;amp;sz=10&amp;amp;via=1&amp;amp;sll=47.515346,10.6073&amp;amp;sspn=0.608448,1.2854&amp;amp;ie=UTF8&amp;amp;ll=47.515346,10.6073&amp;amp;spn=0.608448,1.2854&amp;amp;source=embed" style="color:#0000FF;text-align:left"&gt;View Larger Map&lt;/a&gt;&lt;/small&gt;&lt;br /&gt;&lt;br /&gt;Bis Spaeter. Auf Wiedersehen.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-6534315654322556098?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/6534315654322556098/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=6534315654322556098' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/6534315654322556098'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/6534315654322556098'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2008/02/hallo-garmisch-partenkirchen.html' title='Hallo Garmisch-Partenkirchen'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-8271853497936168017</id><published>2008-01-31T04:03:00.000-08:00</published><updated>2008-01-31T04:16:37.718-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp scheme arc sicp'/><title type='text'>Why should we learn Scheme?</title><content type='html'>I have been mulling over learning lisp seriously and using it for real projects. But I never could motivate myself enough to write something worthwhile in &lt;a href="http://en.wikipedia.org/wiki/Common_Lisp"&gt;Common Lisp&lt;/a&gt; or &lt;a href="http://en.wikipedia.org/wiki/Scheme_(programming_language)"&gt;Scheme&lt;/a&gt;. But after looking at &lt;a href="http://arclanguage.com"&gt;Arc&lt;/a&gt;, I am impressed. The current version of Arc is written in Scheme. I have been a strong python advocate. But after looking at Arc, I am impressed. Not so much with Arc itself but with Scheme. I was browsing through Arc's code and found that it was surprisingly readable.&lt;br /&gt;&lt;br /&gt;I am now determined to learn Scheme and contribute to Arc. Maybe, somebody would write a Arc -&gt; Metal compiler but I like the fact that Arc has first been written in Scheme. It is sort of like &lt;a href="http://codespeak.net/pypy/dist/pypy/doc/home.html"&gt;PyPy&lt;/a&gt; or &lt;a href="http://rubini.us/"&gt;Rubinius&lt;/a&gt;. But I guess it is a natural thing to do in the Scheme world. I have two more books on my reading list. I have already started with &lt;a href="http://www.ccs.neu.edu/home/dorai/t-y-scheme/t-y-scheme.html"&gt;Teach yourself Scheme in Fixnum days&lt;/a&gt; and I plan to grok &lt;a href="http://mitpress.mit.edu/sicp/full-text/book/book.html"&gt;SICP&lt;/a&gt; as well.&lt;br /&gt;&lt;br /&gt;Keep coding. You know I am. :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-8271853497936168017?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/8271853497936168017/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=8271853497936168017' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/8271853497936168017'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/8271853497936168017'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2008/01/why-should-we-learn-scheme.html' title='Why should we learn Scheme?'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-1148146986275753205</id><published>2008-01-31T00:26:00.000-08:00</published><updated>2008-01-31T04:17:49.817-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='arc'/><title type='text'>Hello Arc</title><content type='html'>There has been quite some ruckus on the blogosphere about &lt;a href="http://arclanguage.com"&gt;Arc&lt;/a&gt;. I have just downloaded it and finished reading through the &lt;a href="http://ycombinator.com/arc/tut.txt"&gt;tutorial&lt;/a&gt;. I like it. I am sure that features like Unicode will get added. However, I would like to see the standard library. How can I do FFI? Database interfaces? May be they are already there but I still don't see them yet. In the meanwhile, here is an interesting snipped of Arc for everybody who is pondering about Life, Universe and Everything.&lt;br /&gt;&lt;br /&gt;arc&gt; (reduce + (cons 6 (map [* 4 _] (keep odd '(1 2 3 4 5)))))&lt;br /&gt;42&lt;br /&gt;&lt;br /&gt;Keep coding.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-1148146986275753205?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/1148146986275753205/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=1148146986275753205' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/1148146986275753205'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/1148146986275753205'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2008/01/hello-arc.html' title='Hello Arc'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-6357101054186852894</id><published>2007-12-28T01:24:00.000-08:00</published><updated>2007-12-28T01:41:25.414-08:00</updated><title type='text'>Everybody needs to wear sunscreen</title><content type='html'>This is a very interesting video about a positive outlook towards life. Enjoy.&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://www.youtube.com/v/xfq_A8nXMsQ&amp;rel=1"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/xfq_A8nXMsQ&amp;rel=1" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-6357101054186852894?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/6357101054186852894/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=6357101054186852894' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/6357101054186852894'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/6357101054186852894'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2007/12/everybody-needs-to-wear-sunscreen.html' title='Everybody needs to wear sunscreen'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-630210642474810142</id><published>2007-12-12T10:58:00.000-08:00</published><updated>2007-12-12T12:12:33.275-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='social graph enterprise'/><title type='text'>Social Graph for the Enterprise</title><content type='html'>&lt;a href="http://en.wikipedia.org/wiki/Social_graph"&gt;Social Graphs&lt;/a&gt; are the rage these days, and for a good reason. My manager, &lt;a href="http://www.ajithprasad.com/"&gt;Ajith&lt;/a&gt; (&lt;a href="http://www.linkedin.com/in/edassery"&gt;LinkedIn&lt;/a&gt;), commented that he was not entirely sold on the concept of the social graph for the enterprise. Whenever the topic of social graph comes up, people immediately bring &lt;a href="http://www.orkut.com/"&gt;Orkut&lt;/a&gt; or &lt;a href="http://www.facebook.com/"&gt;Facebook&lt;/a&gt; in their minds. They are social networking applications, which use the social graph as an element of their infrastructure. Enterprises may not need applications like SuperPoke or iLike but they can build much richer applications by using  social graphs as one of its platform services. I would even go to the extent of saying that the social graph is an essential piece of the information infrastructure that IT must provide. This is my bit of free advice for the CIOs.&lt;br /&gt;&lt;br /&gt;IT always catches up a little later with the management and organization practices. Organizations have been experimenting and implementing &lt;a href="http://en.wikipedia.org/wiki/Matrix_management"&gt;matrix organizational structures&lt;/a&gt; for over 20 years. However, every employee table that I've ever seen has only one column for Manager. I wonder what could be the reason for that?&lt;br /&gt;&lt;br /&gt;Most transnational organizations, prefer matrix structures to promote autonomy and to focus on regional strategies. Furthermore, the advances in IT in the enterprise has enabled managers to have a much wider span and has resulted in considerable reduction in the height of the organizations. When I say height, I mean the number of hierarchical levels in an organization. Organizations in business which demand creativity like software development or advertising, generally are much flatter than the older manufacturing firms following the organizational models created during the Industrial revolution. So the flatter organizations would have culture/values which promote interaction, entrepreneurship and transparency. Unfortunately, today's enterprises do not have the requisite IT infrastructure to foster such a knowledge community. Majority of the organizations do not yet have internal blogs or wikis. Even if they do, the level of awareness and the participation is abysmally low.&lt;br /&gt;&lt;br /&gt;Let us assume a case of  project management in a matrix organization. Every project has a project owner and each project creates a wealth of knowledge for the organization. Most of this information lies as word documents or excel files in a file share. Every developer/engineer working on the project could potentially be reporting to two/more people, his line manager and his functional manager, who would usually be the project sponsor. Further, if the organization employs a 360 degree feedback and appraisal system, we would need to identify his peers in every project that he had ever participated in. The current X.500 based directory servers like Active Directory or NDS provide the tools and infrastructure for a hierarchical organization. This necessitates that the project management system holds information about projects, its members, its sponsor and so on and this system is usually a closed system. Of course, it could provide certain integration possibilities using BAPIs, RFCs or web services but the information about the relationships is essentially in the system.&lt;br /&gt;&lt;br /&gt;Let us see how the system evolves, if we have the Social Graph as an underlying infrastructure component. The social graph contains information about users, networks and groups. It has restful APIs to perform CRUD operations on each of these. Users can belong to multiple groups but can belong only to one network at a time. The network can be seen as an SBU/LoB or a division providing shared services. All the changes are timestamped and can be undone. This is essential for the integrity of the system. In addition to users, networks and groups, the social graph infrastructure could allow applications to park objects, permissions and authorization information along with the same. Let us visualize how a project management system can be built using this infrastructure alongside couple of other applications.&lt;br /&gt;&lt;br /&gt;We could have weblog and wiki applications. Weblog application can provide permissions to comment or edit/create a blog to particular user or group. It can even restrict the visibility of the blog to some networks or groups. It can use the ATOM publishing protocol to enable RSS readers and third party authoring applications to integrate. We can do the same for Wiki pages. In fact, the comments module can be a separate application which can be mashed up with both blog objects and wiki page objects. We can then have a profile application, which provides profile pages to users, groups and applications. Profile can have the appropriate information about the group including the details such as the Blogs, Wikis and their corresponding RSS feeds that the user/group would like to expose. We could have RESTful web services exposed on each of these applications.&lt;br /&gt;&lt;br /&gt;Now the project management system can create groups for each of the project and can add the appropriate members. It can setup a project wiki with the appropriate permission set and setup a project blog and create a profile page of the project. The project management system can now improve collaboration by assigning and tracking work packages.&lt;br /&gt;&lt;br /&gt;You can observe that you develop small focussed functional modules which can be mashed up easily using the social graphs as the underlying infrastructure. I don't mean to say that the social graph is the silver bullet for organization's knowledge management issues. But it is about time that we acknowledge that we are trying to shoe-horn a tree when the problem actually mandates a graph.&lt;br /&gt;&lt;br /&gt;This was supposed to be a mail to Ajith. But I thought it would be better off as a blog entry. Just a way of &lt;a href="http://blog.jonudell.net/2007/04/10/too-busy-to-blog-count-your-keystrokes/"&gt;saving keystrokes&lt;/a&gt;. :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-630210642474810142?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/630210642474810142/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=630210642474810142' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/630210642474810142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/630210642474810142'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2007/12/social-graph-for-enterprise.html' title='Social Graph for the Enterprise'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-6214534460267023982</id><published>2007-11-27T03:07:00.000-08:00</published><updated>2007-11-27T03:11:39.464-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='opensource'/><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>A Java that doesn't suck</title><content type='html'>I am a heavy C# and a Python user. I am looking at Java after a long time for some of my projects. I really miss the features in my favorite language. No delegates, no anonymous types, no type inference. In my quest to learn new languages, I started scouring the web. I then came across Scala. It is a better Java for the JVM. According to the &lt;a href="http://shootout.alioth.debian.org/gp4sandbox/benchmark.php?test=all&amp;lang=scala"&gt;Alioth performance shootout&lt;/a&gt;, Scala's performance is comparable to Java6-server's performance. It supports type-inference, real iterators, list comprehension, the functional goodness and much more. I am impressed by the ease in which it can use Java's libraries. &lt;br /&gt;&lt;br /&gt;In short, it is a Java that doesn't suck.&lt;br /&gt;&lt;br /&gt;Here are some of the resources that would help you get started with Scala.&lt;br /&gt;&lt;br /&gt;Scala Home - &lt;a href="http://www.scala-lang.org"&gt;http://www.scala-lang.org&lt;/a&gt;&lt;br /&gt;Scala for Java Programmers - part 1 - &lt;a href="http://blogs.sun.com/sundararajan/entry/scala_for_java_programmers"&gt;http://blogs.sun.com/sundararajan/entry/scala_for_java_programmers&lt;/a&gt;&lt;br /&gt;Scala for Java Programmers - part 2 - &lt;a href="http://blogs.sun.com/sundararajan/entry/scala_for_java_programmers"&gt;http://blogs.sun.com/sundararajan/entry/scala_for_java_programmers&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is a nice video by the creator of Scala about building component systems and how scala is relevant in this context.&lt;br /&gt;&lt;br /&gt;&lt;embed style="width:400px; height:326px;" id="VideoPlayback" type="application/x-shockwave-flash" src="http://video.google.com/googleplayer.swf?docId=553859542692229789&amp;hl=en" flashvars=""&gt; &lt;/embed&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-6214534460267023982?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/6214534460267023982/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=6214534460267023982' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/6214534460267023982'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/6214534460267023982'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2007/11/java-that-doesnt-suck.html' title='A Java that doesn&apos;t suck'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-4369248906152619154</id><published>2007-11-20T21:05:00.000-08:00</published><updated>2007-11-20T21:06:12.843-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video humor arbit'/><title type='text'>Code monkey</title><content type='html'>This is a really cool video.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://www.youtube.com/v/5W_wd9Qf0IE&amp;rel=1"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/5W_wd9Qf0IE&amp;rel=1" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-4369248906152619154?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/4369248906152619154/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=4369248906152619154' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/4369248906152619154'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/4369248906152619154'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2007/11/code-monkey.html' title='Code monkey'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-8924956055094457900</id><published>2007-10-14T21:10:00.000-07:00</published><updated>2007-10-14T21:29:11.469-07:00</updated><title type='text'>How I started off with Haskell and wound up with Lisp</title><content type='html'>A while ago, I started dabbling in the &lt;a href="http://en.wikipedia.org/wiki/Functional_programming"&gt;functional programming&lt;/a&gt; space. As with many of my other experiments, I started learning &lt;a href="http://www.haskell.org/haskellwiki/Haskell"&gt;Haskell&lt;/a&gt;. I mentioned this to a couple of friends and they asked me if it had to do anything with &lt;a href="http://en.wikipedia.org/wiki/Pascal_%28programming_language%29"&gt;Pascal&lt;/a&gt;. I assured them that they had no resemblance whatsoever. I got off with an excellent &lt;a href="http://en.wikibooks.org/wiki/Haskell/YAHT"&gt;tutorial&lt;/a&gt; on Haskell. But somehow the static typing part had a nagging feeling in the back of my head. I code with C# a lot in my day job. I do not have anything against statically typed languages, but I strongly believe that you can be far more productive with a &lt;a href="http://en.wikipedia.org/wiki/Type_system#Dynamic_typing"&gt;dynamically typed&lt;/a&gt; language.&lt;br /&gt;&lt;br /&gt;I then came across this &lt;a href="http://en.wikibooks.org/wiki/Write_Yourself_a_Scheme_in_48_Hours"&gt;tutorial&lt;/a&gt;, which teaches you to write a Scheme interpreter in Haskell in 48 hours. Really Cool. I fell in love with Lisp immediately. I googled for Lisp and I discovered that there are many &lt;a href="http://en.wikipedia.org/wiki/Lisp_programming_language#Lisp_today"&gt;dialects&lt;/a&gt; of Lisp. The most popular ones are &lt;a href="http://www.lisp.org/HyperSpec/FrontMatter/index.html"&gt;Common Lisp&lt;/a&gt; and &lt;a href="http://www.schemers.org/"&gt;Scheme&lt;/a&gt;. I decided to go with Common Lisp for some unknown reason. I guess because it had Lisp in its name :-). I then had to find the right implementation for my platform. Being a GNU fan, I picked the &lt;a href="http://clisp.cons.org/"&gt;GNU CLISP&lt;/a&gt;. As it turns out, it is a horrible implementation which does not support threading and is painfully slow. But it was fine for the small programs that I use for learning. I have &lt;a href="https://wiki.ubuntu.com/FeistyFawn"&gt;Ubuntu Feisty&lt;/a&gt; on my "home" laptop but I spend most of my time on the office laptop which as you all might have guessed, runs "Windows". There are many good commercial implementations for Windows but I was looking only for open source software. GNU CLISP seems to be the only fully functional Common Lisp implementation. I've worked with &lt;a href="http://sbcl.sourceforge.net/"&gt;SBCL&lt;/a&gt; and found that okay too. I did not run into any major issues but their &lt;a href="http://sbcl.sourceforge.net/platform-table.html"&gt;website&lt;/a&gt; has an yellow status for SBCL on Windows and a big bold notice saying that it is an experimental implementation. But for learning purposes, I guess it is just fine.&lt;br /&gt;&lt;br /&gt;I followed a really cool &lt;a href="http://gigamonkeys.com/book/"&gt;Lisp tutorial&lt;/a&gt;, which is actually a book by a guy called &lt;a href="http://gigamonkeys.com/blog/"&gt;Peter Seibel&lt;/a&gt; named Practical Common Lisp. It is a free online resource.&lt;br /&gt;&lt;br /&gt;One of my biggest barriers to entry was my text editor. I was a '&lt;a href="http://www.vim.org/"&gt;vi&lt;/a&gt;' guy. As I browsed for help on Lisp, I kept finding these cool &lt;a href="http://common-lisp.net/project/slime/"&gt;emacs extensions&lt;/a&gt; for lisp programming. I then took the dive and started using &lt;a href="http://www.gnu.org/software/emacs/"&gt;Emacs&lt;/a&gt;. It was very painful in the beginning. My fingers automatically pressed the &lt;esc&gt; and the ':' keys whenever I wanted to do something. But it took about a week of exercise to train my mind to work with Emacs. Writing extensions for vim is a big deal and normal users would not do it. But extending emacs is a piece of cake. It can be done one step at a time and is very well documented. BTW, I am writing this blog on Emacs. One thing VI does not have is the 'longlines-mode'. If there is one, please let me know. Emacs is just not a text editor but the text editor for me. One more cool thing about using Emacs to code common-lisp is that, you can turn it into a Lisp IDE. &lt;a href="http://common-lisp.net/project/slime/"&gt;Slime&lt;/a&gt;(a horrible name) is a mode in emacs that turns your modest text editor into a full blown IDE, including code assist and interactive debugging, even on remote machines.&lt;br /&gt;&lt;br /&gt;So this is your startup kit for learning Lisp.&lt;br /&gt;&lt;/esc&gt;&lt;ul&gt;&lt;li&gt;Common Lisp implementation - &lt;a href="http://clisp.cons.org/"&gt;CLISP&lt;/a&gt; or &lt;a href="http://sbcl.sourceforge.net/"&gt;SBCL&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://gigamonkeys.com/book"&gt;Lisp Tutorial&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.gnu.org/software/emacs/"&gt;&lt;esc&gt;Emacs&lt;/esc&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;esc&gt;&lt;a href="http://common-lisp.net/project/slime/"&gt;Slime&lt;br /&gt;&lt;/a&gt;&lt;/esc&gt;&lt;/li&gt;&lt;/ul&gt;Happy coding!&lt;br /&gt;&lt;esc&gt;&lt;br /&gt;&lt;/esc&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-8924956055094457900?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/8924956055094457900/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=8924956055094457900' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/8924956055094457900'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/8924956055094457900'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2007/10/how-i-started-off-with-haskell-and.html' title='How I started off with Haskell and wound up with Lisp'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-4345371419247338331</id><published>2007-10-05T02:33:00.000-07:00</published><updated>2007-10-05T02:38:37.462-07:00</updated><title type='text'>Really achieving your childhood dreams</title><content type='html'>This is a must watch for everyone. When I say everyone, I mean &lt;span style="font-weight:bold;"&gt;EVERYONE&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;embed style="width: 400px; height: 326px;" id="VideoPlayback" type="application/x-shockwave-flash" src="http://video.google.com/googleplayer.swf?docId=362421849901825950&amp;amp;hl=en" flashvars=""&gt;&lt;/embed&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-4345371419247338331?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/4345371419247338331/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=4345371419247338331' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/4345371419247338331'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/4345371419247338331'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2007/10/really-achieving-your-childhood-dreams.html' title='Really achieving your childhood dreams'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-3183813472710816977</id><published>2007-09-23T10:29:00.000-07:00</published><updated>2007-09-23T23:44:55.849-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><title type='text'>Lisp Tutorial</title><content type='html'>Following &lt;a href="http://www.gigamonkeys.com/blog/"&gt;Peter Seibel&lt;/a&gt;'s &lt;a href="http://www.gigamonkeys.com/blog/2007/09/19/bomb-me.html"&gt;request&lt;/a&gt;, anybody looking for a Lisp Tutorial should read &lt;a href="http://www.gigamonkeys.com/book"&gt;Practical Common Lisp&lt;/a&gt;. It is the best &lt;a href="http://en.wikipedia.org/wiki/Common_Lisp"&gt;Common Lisp&lt;/a&gt; resource for beginners currently available online.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update:&lt;/b&gt; Made the post title a link and point it to the book.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-3183813472710816977?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.gigamonkeys.com/book' title='Lisp Tutorial'/><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/3183813472710816977/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=3183813472710816977' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/3183813472710816977'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/3183813472710816977'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2007/09/lisp-tutorial.html' title='Lisp Tutorial'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-3440301988498109758</id><published>2007-09-14T07:32:00.000-07:00</published><updated>2007-09-14T07:34:36.468-07:00</updated><title type='text'>I nuked my windows partition</title><content type='html'>I accidentally nuked my Windows partition. I am perform a clean wipe of my hard disk and installing Feisty as the only operating system on my laptop. Woohoo. :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-3440301988498109758?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/3440301988498109758/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=3440301988498109758' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/3440301988498109758'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/3440301988498109758'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2007/09/i-nuked-my-windows-partition.html' title='I nuked my windows partition'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-757200651624608397</id><published>2007-08-29T00:35:00.000-07:00</published><updated>2007-08-29T00:47:51.019-07:00</updated><title type='text'>Building Websites</title><content type='html'>&lt;div class="document"&gt;&lt;br /&gt;&lt;p&gt;One of my co-workers asked me today that he would like to build a website. A freewheeling discussion started from &lt;a class="reference" href="http://calendar.google.com"&gt;Google Calendar&lt;/a&gt;, software as a service, dynamic languages, web frameworks, open source and so on. But finally he asked me to send some material on building a dynamic website which is also cost effective. I hunted on Google and could not find a single resource that kind of captured the essence of our discussion and that results in this blog entry.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;His idea was that he had a dance studio that wanted to get on the web. Basic stuff like events management, feedback, news and so on. A bit of e-commerce involving selling some salsa dance related goodies like dancing shoes and so on. So there it goes.&lt;/p&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;h2&gt;&lt;a id="domain-registration-and-basic-hosting" name="domain-registration-and-basic-hosting"&gt;Domain Registration and Basic Hosting&lt;/a&gt;&lt;/h2&gt;&lt;br /&gt;&lt;p&gt;If your site is a bunch of blog posts and set of static content, then you can get away with paying only for the domain. It would cost you about $10/year. Choose your domain registrar carefully and make sure that the registrar supports a good control panel to change your DNS entries as you wish. Some domain registrars require you to send a mail to them to change your CNAME records. And frankly, that sucks. &lt;a class="reference" href="http://www.nearlyfreespeech.net"&gt;NearlyFreeSpeech.Net&lt;/a&gt; supports a nice and elegant control panel to manage your domain entries.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Most blogging sites like &lt;a class="reference" href="http://www.blogger.com"&gt;Blogger&lt;/a&gt; allow you to host a blog on your own domain. One other thing that you have to do is to get &lt;a class="reference" href="http://www.google.com/a"&gt;Google Apps for your domain&lt;/a&gt;. That makes setting up email and calendar on custom domains really easy. Google Apps for your domain comes with Google Pages which are static HTML pages. Their page construction tools are not very helpful but some space is better than no space at all.&lt;/p&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="section"&gt;&lt;br /&gt;&lt;h2&gt;&lt;a id="cranking-out-your-web-app" name="cranking-out-your-web-app"&gt;Cranking out your Web App&lt;/a&gt;&lt;/h2&gt;&lt;br /&gt;&lt;p&gt;The next thing to do would be to crank out your web application. There are several choices you have. In fact, down right daunting. Since my good friend is a enterprisey kind of guy, let me place this advice right at the beginning.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Don't even try building a serious website with ASP.NET or J2EE. It would take forever and you are tying yourself down to a track facing an oncoming train. Chances of your survival are nearly zero. One of the hassle free solutions which would quickly get messy is to use some Content Management System like PHP Nuke or Post Nuke. This would help you get started very quickly but you cannot do much one you get started.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Alternatively you can crank your own PHP app with the &lt;a class="reference" href="http://www.railsenvy.com/2007/8/24/rails-vs-php"&gt;Ruby on Rails wanna be&lt;/a&gt; frameworks like &lt;a class="reference" href="http://www.cakephp.org"&gt;Cake&lt;/a&gt; or &lt;a class="reference" href="http://www.symfony-project.com"&gt;Symfony&lt;/a&gt;. I only suggest this because PHP hosting is well supported and easy to setup with a shared hosting partner. &lt;a class="reference" href="http://www.nearlyfreespeech.net"&gt;NSFN&lt;/a&gt; has some pretty cool plans. Check them out.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Alternatively, if you are ready to do some hard work, you can create a &lt;a class="reference" href="http://www.rubyonrails.com"&gt;Ruby on Rails&lt;/a&gt; or a &lt;a class="reference" href="http://www.djangoproject.com"&gt;Django&lt;/a&gt; based web application. Both these frameworks are pretty good. I am not attempting to start a Ruby or Python war here. I have not hosted Ruby on Rails applications. But the word on the street is that Ruby on Rails deployment is a little more difficult than Python with mod_python. There are camps on either side throwing spit balls at each other. But I would like to refrain from commenting either ways. Look at it this way. Frameworks like RoR, Django, TurboGears (or is it Pylons??) help you achieve tremendous productivity. You will just have to swallow the pill and deal with deployment. Even though I love python and Django, I would have to commend the Ruby on Rails community for keeping change management in mind while designing the framework. You have stuff like Migrations and Capastrino to save several hours of upgrade headaches. I give two thumbs up for Ruby on Rails. :-)&lt;/p&gt;&lt;br /&gt;&lt;p&gt;If you are impressed by Django's admin interface capabilities. I would strongly suggest you to look at &lt;a class="reference" href="http://www.streamlinedframework.org/"&gt;Streamlined&lt;/a&gt;. The amount of code you write to create a fully functional application would be considerably reduced by using these tools with prudence.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;For static content, you must seriously consider &lt;a class="reference" href="http://aws.amazon.com/s3"&gt;Amazon's Simple Storage Service&lt;/a&gt;. It lets you park your static content for a very low fee. You would save tonnes of hassles if your hosting provider pulls you down for exceeding your bandwidth capacity.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;If your target audience is small, I reckon that you might get away with paying about $10-$15 monthly and about $7-$10 yearly for the domain registration.&lt;/p&gt;&lt;br /&gt;&lt;div class="section"&gt;&lt;br /&gt;&lt;h2&gt;&lt;a id="suggestions-for-the-dance-school" name="suggestions-for-the-dance-school"&gt;Suggestions for the Dance School&lt;/a&gt;&lt;/h2&gt;&lt;br /&gt;&lt;p&gt;Now that I have scared you with the options and have left you dazed and confused, let me tell you how I would go about getting the dance studio on the web.&lt;/p&gt;&lt;br /&gt;&lt;ul class="simple"&gt;&lt;br /&gt;&lt;li&gt;Calendar - Google Calendar (no doubts about it). It has simple and clear &lt;a class="reference" href="http://code.google.com/apis/"&gt;API&lt;/a&gt; to integrate it with your application.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Feedback - If the feedback is on particular articles, then you can simply use feedback articles on your blog. Google Calendar also supports comments.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Static Content - Use google pages or Nearly FreeSpeech.NET's hosting. Its pretty cheap and is pay as you use.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;ECommerce - Now you are talking web-apps. I would strongly recommend Ruby on Rails. Throw the hosting question to the community. You will get tonnes of replies. Evaluate them and choose the best. Make sure that you ask the hosting provider about a reference customer so that you could validate your evaluations.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;All the best to you all.&lt;/p&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&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/7972422-757200651624608397?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/757200651624608397/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=757200651624608397' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/757200651624608397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/757200651624608397'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2007/08/building-websites.html' title='Building Websites'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-5334906640145969726</id><published>2007-06-22T13:16:00.000-07:00</published><updated>2007-06-22T13:30:27.769-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='abiword'/><category scheme='http://www.blogger.com/atom/ns#' term='frustration'/><category scheme='http://www.blogger.com/atom/ns#' term='openoffice'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Getting f&amp;#ked by OO write</title><content type='html'>Excuse my french. I am really irritated with Open Office and at the point of bashing my laptop screen in frustration. Here I am working my ass off on a business case at 1.45 AM and Ivor brings a PPT that he just found on the net which had some relevant information. My OpenOffice write crashed along with OO Present. I accidently said 'no' to document recovery (it was 1.45 am) and all my overnight work has gone down the drain. I have just downloaded Abiword. I need to get up early and work on it again. &lt;sigh/&gt; The good part is I am getting back to Bangalore tomorrow night. Cant wait to get back home. Can somebody write a decent word processor for Linux. This whole open office thing is a stupid farce. I already use Gnumeric for my excel related activities. I have very basic expectations from a word processor. I guess Abiword should suffice. I am sure it would be a lot faster than OO write. &lt;br /&gt;&lt;br /&gt;Do you guys know a PowerPoint equivalent on Linux? I don't want to use stupid flaky open office and nor do I want to run Wine. If you guys have any other suggestions it would be great. BTW, Google! When are you building the offline stuff into your docs and spreadsheets. Are you going to have a presentation software?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-5334906640145969726?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/5334906640145969726/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=5334906640145969726' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/5334906640145969726'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/5334906640145969726'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2007/06/getting-f-by-oo-write.html' title='Getting f&amp;#ked by OO write'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-3272608538105271802</id><published>2007-06-06T01:43:00.000-07:00</published><updated>2007-06-06T01:50:22.051-07:00</updated><title type='text'>Google Gears - Woohoo!</title><content type='html'>If you have not heard about &lt;a href="http://gears.google.com/"&gt;Google Gears&lt;/a&gt; yet, check their homepage first. And in the very web way of getting excited, you can view a video presentation of Google Gears &lt;a href="http://www.youtube.com/watch?v=cQyha30nm6k"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;object height="350" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/cQyha30nm6k"&gt;&lt;param name="wmode" value="transparent"&gt;&lt;embed src="http://www.youtube.com/v/cQyha30nm6k" type="application/x-shockwave-flash" wmode="transparent" height="350" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;There are other projects that are coming up on Google Code hosting related to Google gears. One of the more interesting ones is &lt;a href="http://code.google.com/p/gears-dblib/"&gt;gears-dblib&lt;/a&gt;. You have other pointless projects like &lt;a href="http://code.google.com/p/tuiki/"&gt;Tuiki&lt;/a&gt;. Nevertheless, it is good to get you up and running with Gears. Have fun coding. :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-3272608538105271802?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/3272608538105271802/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=3272608538105271802' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/3272608538105271802'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/3272608538105271802'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2007/06/google-gears-woohoo.html' title='Google Gears - Woohoo!'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-5491858662814155224</id><published>2007-02-27T05:33:00.001-08:00</published><updated>2007-02-27T05:53:18.794-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='opensource'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Not so angry response to "Eight Years Later...and Linux Still Sucks"</title><content type='html'>I read &lt;a href="http://www.tipsoftheweekonline.com/linuxsucks.html"&gt;this&lt;/a&gt; (http://www.tipsoftheweekonline.com/linuxsucks.html) and &lt;a href="http://www.tipsoftheweekonline.com/angry.html"&gt;this&lt;/a&gt; (http://www.tipsoftheweekonline.com/angry.html). First off, I don't believe people like rmerrick would have contributed anything of importance to the community. And they are definitely not the kind of geeks using Linux. They are the kind of people who intend to behave like geeks or nerds but end up behaving like jerks.&lt;br /&gt;&lt;br /&gt;I understand the frustration that you experienced. And I can totally relate to that. But it is really not the fault of Linux. You faced exactly 3 problems&lt;br /&gt;&lt;br /&gt;1) Monitor detection and configuration&lt;br /&gt;2) Unable to play proprietary file formats&lt;br /&gt;3) And problems with uninstallation which was due to the proprietary file formats issue. A problem nevertheless.&lt;br /&gt;&lt;br /&gt;I agree that 1 and 3 are problems. Although the 3rd one does not qualify completely. Have you used synaptic? I always found the &lt;a href="http://www.ubuntu.com"&gt;Ubuntu&lt;/a&gt;'s Add/Remove should be replaced with Synaptic Package Manager. But telling that "Linux" totally sucks is very misleading. Your comment should instead have been "Ubuntu sucks for me.". I have been using Linux for the past few years and it has its fair share of annoyances. But guess what nothing beats the annoyance of a virus/worm/spyware on a Windows machine.&lt;br /&gt;&lt;br /&gt;Let me share the incident which prompted me to switch to Linux. Note that I was always an open source fan for its economic reasons and I was okay doing open source on Windows. I am not one of the raving fanboy type of guys. I am not an illiterate computer user either. I've been working on these things since my school days. I always used to log on as restricted user in Windows for the fear that Windows might catch a virus. I diligently updated my antivirus periodically. I keep changing my passwords. I make sure that my Run/Runonce/Startup menu items are clean. I was kind of paranoid about it. But this one day, I got a media player with my korean DVD drive which required administrative access to run. Not to install... just run. So I used to run that in the adminstrative mode using the RunAs command. Safe - I would presume as this is the only application that runs with the elevated privileges. The player software when closed used to open an instance of IE to check for some stuff.. (for updates I guess) and close it in the background. Unknown to me, IE had somehow got infected and through that my whole system had been compromised. It affected all my executables on my drive. Some of my programs started behaving in a funny manner. I did not notice this until I ran python. The infected executable when run would actually run the virus and would create the actual executable image with a file name of extension .hwd and create a new process. I would have two processes running for each infected executable. The module names for the processes were executable.exe and executable.hwd. Before I knew it, the virus had completely blown away my windows installation. Not one of my executables were sane now. I tried cleaning them but PandaAV was not much help and it got infected. I forgot the name of the virus. :-( Thats when I decided that I would switch to Linux.&lt;br /&gt;&lt;br /&gt;My initial experience with Fedora Core 4 was horrible. I had to do everything myself. RPM this. RPM that. Broken dependencies and what not. But I had been through hell with Windows which made this a cakewalk. But I ultimately got frustrated with &lt;a href="http://www.redhat.com/fedora/"&gt;Fedora&lt;/a&gt; and decided to try Ubuntu 5.04. I guess it was called Hoary Hedgehog. The installation was very pleasant and synaptic and apt-get was really cool. I upgraded to breezy after that and haven't looked back. So my statement would be "Fedora sucked for me" but "Ubuntu is great for me." I had no problem connecting to the universe and multiverse repositories to get the ugly plugins. The folks in the community are quite helpful unlike other communities that I have interacted with. You should probably try a linux distribution like &lt;a href="http://www.linspire.com"&gt;Linspire&lt;/a&gt;. It is lot more polished than Ubuntu and would definitely solve your virus and worms problem. Linspire has legal codecs to play proprietary formats. You even get the benefit of real customer support. Before dismissing Linux of completely, I would suggest that you have a look at the existing distros, give it a spin and give a fair assessment.&lt;br /&gt;&lt;br /&gt;I guess, I am really in the mood of ranting this evening.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-5491858662814155224?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.tipsoftheweekonline.com/linuxsucks.html' title='Not so angry response to &quot;Eight Years Later...and Linux Still Sucks&quot;'/><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/5491858662814155224/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=5491858662814155224' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/5491858662814155224'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/5491858662814155224'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2007/02/not-so-angry-response-to-eight-years_27.html' title='Not so angry response to &quot;Eight Years Later...and Linux Still Sucks&quot;'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-1949930475932742811</id><published>2007-02-27T03:44:00.000-08:00</published><updated>2007-02-27T04:43:25.408-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='opensource'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Is piracy good for Microsoft?</title><content type='html'>&lt;rant&gt;&lt;br /&gt;I was watching this &lt;a href="http://www.crankygeeks.com/2007/02/cranky_geeks_episode_50_rsa_co.html"&gt;video&lt;/a&gt; on &lt;a href="http://www.crankygeeks.com/"&gt;Cranky Geeks&lt;/a&gt; and they were talking about Romania and piracy. The story is covered &lt;a href="http://www.vnunet.com/vnunet/news/2174068/piracy-helped-gates-told"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;p&gt;"Software piracy has many negative economic consequences, such as local software industries being crippled by competition with pirated software from abroad, and lost tax revenues and jobs from the lack of a legitimate market," said the BSA report.&lt;/p&gt;  &lt;p&gt;"These costs reverberate up and down the supply and distribution chains." &lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;I was not surprised. I find this it was extremely immature and stupid on the part of the government. I am from India and I can relate to this. The government and people here are equally immature and stupid. I believe that we are painting ourselves into a corner. What appalls me is the ease in which we can get pirated software vis-a-vis their open source counterparts. We can get pirated software from friends, or a walk on SP Road or any of the PC assemblers. But to get the latest versions of open source software and its documentation in terms of books is an extremely costly affair. If you don't believe me visit Gangarams or &lt;a href="http://www.sapnaonline.com"&gt;Sapna Book house&lt;/a&gt; and look at the price of linux distros there. I do not believe that technical superiority is responsible for the liberal presence of Windows operating system in Indian homes. It is due to its easy availability of pirated software. System assemblers know Windows better than Linux. The people who get it buy computers for browsing, surfing, watching movies and playing games. And not to mention the uncles and aunties fiddling with worthless astrology software that runs only on DOS (yes! you heard me. DOS!!!) and Windows. Probably we must make such astrology software for Linux and make it available on Live CDs for all these maamas and maamis to try it out.&lt;br /&gt;&lt;br /&gt;I have some friends who are Indians living in India and yet buy Windows XP Home licenses. Can you believe that? They definitely are the minority.  They are statistically insignificant. And some of them do have a Ubuntu installation safely tucked into one of their partitions. They were actually sold on the fact that Microsoft can actually track you down and sue you for using pirated versions of their software. But when that does happen, then the whole country has to be worried. &lt;a href="http://www.irctc.co.in"&gt;IRCTC's website&lt;/a&gt; does not work well with Firefox. I book my tickets most of the time with IRCTC. Indian airlines' website does not work well with firefox. &lt;a href="http://www.icicibank.com"&gt;ICICI's website&lt;/a&gt; has just started working with Firefox. We are actually glued on to windows. I cannot find a single indian music site which works on flash audio like &lt;a href="http://www.odeo.com"&gt;www.odeo.com&lt;/a&gt; or &lt;a href="http://www.pandora.com"&gt;www.pandora.com&lt;/a&gt;. My favorite is &lt;a href="http://www.musicindiaonline.com"&gt;www.musicindiaonline.com&lt;/a&gt;, which hosts an ActiveX control. I am not against Microsoft but I believe that it is not an economically viable alternative for us as a nation. I strongly believe that India is better off with open source software. &lt;a href="http://www.winehq.com/"&gt;Wine&lt;/a&gt; is not the solution. It will only worsen the situation. What we need is cross platform applications.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.microsoft.com"&gt;Microsoft&lt;/a&gt; will not bother about piracy in India as it is generating a huge talent pool and establishing a base of future customers. These customers are already trained on Microsoft software. So the organizations that hire them run Windows. Even the Java schools have a starter program for the computer illiterates and they start of with Microsoft Office, Internet Explorer and Outlook Express. Why don't they start of with &lt;a href="http://www.ubuntu.com"&gt;Ubuntu&lt;/a&gt; or Linspire? Why dont they teach them the Google life. I am not against Microsoft or Windows. I am against the fact that we think it is smart on our part to pirate software and use it while all we are doing is increasing the liability on our employers and &lt;a href="http://en.wikipedia.org/wiki/India_Inc"&gt;India Inc.&lt;/a&gt;, as a whole. Open source software can solve most of these problems. With increased broadband penetration and web increasingly becoming a platform, we must get away from IE and ActiveX as far as possible have cross platform technology solutions.&lt;br /&gt;&lt;br /&gt;Both Windows and Linux have their advantages and disadvantages depending on the kind of applications that you try to run. I feel Linux is better for me. It has been over 2 years since I switched to Linux as my primary operating system and I have never looked back. I wish others could see this in the same light as I do.&lt;br /&gt;&lt;/rant&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-1949930475932742811?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/1949930475932742811/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=1949930475932742811' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/1949930475932742811'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/1949930475932742811'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2007/02/is-piracy-good-for-microsoft.html' title='Is piracy good for Microsoft?'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-7788349456020233104</id><published>2007-01-28T19:23:00.000-08:00</published><updated>2007-01-28T19:26:27.533-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><category scheme='http://www.blogger.com/atom/ns#' term='wedding'/><title type='text'>Single no more</title><content type='html'>There have been a lot of changes with my life lately. The most prominent one of all is that I am single no more. I am now happily wedded to my long time love Shanthi. I stole a few minutes off my busy schedule to post this &lt;wink/&gt;.&lt;br /&gt;&lt;br /&gt;I am going drop off the web for a couple of weeks now. Bye Bye web. Cya later.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-7788349456020233104?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/7788349456020233104/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=7788349456020233104' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/7788349456020233104'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/7788349456020233104'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2007/01/single-no-more.html' title='Single no more'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-3860899927618099766</id><published>2007-01-18T21:19:00.000-08:00</published><updated>2007-01-18T21:25:02.589-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='l337 5p34k. google'/><title type='text'>6006l3 4 h4x0r</title><content type='html'>I just came across &lt;a href="http://www.google.com/intl/xx-hacker/"&gt;this&lt;/a&gt;.  &lt;a href="http://en.wikipedia.org/wiki/1337_5p34k"&gt;1337 5p34k&lt;/a&gt; is a form of hacker language that was very popular on BBSes in the good old days. I did this in my college days. I was pleasantly surprised to find this page on Google. :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-3860899927618099766?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/3860899927618099766/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=3860899927618099766' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/3860899927618099766'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/3860899927618099766'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2007/01/6006l3-4-h4x0r.html' title='6006l3 4 h4x0r'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-6989142786451744494</id><published>2007-01-14T06:26:00.000-08:00</published><updated>2007-01-14T08:24:12.304-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='design pattern'/><category scheme='http://www.blogger.com/atom/ns#' term='observer'/><title type='text'>The Observer Pattern using Ruby Meta- Voodoo</title><content type='html'>The &lt;a href="http://www.ruby-doc.org/stdlib/"&gt;ruby standard library&lt;/a&gt; already has an &lt;a href="http://www.rubycentral.com/book/lib_patterns.html"&gt;implementation&lt;/a&gt; for the &lt;a href="http://en.wikipedia.org/wiki/Observer_pattern"&gt;observer pattern&lt;/a&gt;. The implementation of the pattern was not very rubyish. It seemed a direct implementation of the Java equivalent of it. Ruby is far more powerful.  This is the more rubyish version of the of the code goes something like this.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;require 'observerext'&lt;br /&gt;&lt;br /&gt;class Person&lt;br /&gt;include Observer #include the observer related methods&lt;br /&gt;observable :name,:address # the metavoodoo to create the accessor methods and fire events&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;admin=Person.new&lt;br /&gt;admin.name='vagmi'&lt;br /&gt;admin.address='admin@somesite.com'&lt;br /&gt;&lt;br /&gt;# first observer&lt;br /&gt;admin.observe :name do |old,newvalue|&lt;br /&gt;puts %{The administrator changed from #{old} to #{newvalue}}&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;# the second observer&lt;br /&gt;admin.observe :name do |old,newvalue|&lt;br /&gt;  puts 'there can be multiple observers'&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;admin.name='root'&lt;br /&gt;#this prints the following statements&lt;br /&gt;# &gt; The administrator has changed from vagmi to root&lt;br /&gt;# &gt; there can be multiple observers&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;You can find the code for observerext.rb &lt;a href="http://vagmi.googlecode.com/svn/trunk/observer/observerext.rb"&gt;here&lt;/a&gt;. What I have basically done is to extend the Module class, which defines the observable method. The observable method injects the attributes' getters and setters. The setter method notifies the observers if there are any. The Observer module does the leg work of registering and unregistering the blocks and the notifyobservers method.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Update:&lt;/span&gt; Forgot to credit &lt;a href="http://ghouston.blogspot.com/"&gt;Greg Houston&lt;/a&gt; for &lt;a href="http://ghouston.blogspot.com/2006/05/attraccessor-meta-programming.html"&gt;explaining&lt;/a&gt; some of the ruby voodoo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-6989142786451744494?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/6989142786451744494/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=6989142786451744494' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/6989142786451744494'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/6989142786451744494'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2007/01/observer-pattern-using-ruby-meta-voodoo.html' title='The Observer Pattern using Ruby Meta- Voodoo'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-4761975199567585240</id><published>2007-01-08T10:18:00.000-08:00</published><updated>2007-01-08T10:33:48.490-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='phonetic'/><category scheme='http://www.blogger.com/atom/ns#' term='tamil'/><category scheme='http://www.blogger.com/atom/ns#' term='layout'/><category scheme='http://www.blogger.com/atom/ns#' term='hindi'/><category scheme='http://www.blogger.com/atom/ns#' term='xkb'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Moving back to blogger</title><content type='html'>I have moved back to blogger from my &lt;a href="http://www.geekswithblogs.net/vagmi.mudumbai"&gt;previous blog&lt;/a&gt; on geekswithblogs.net. I know that frequently changing the URL of a blog will hurt the traffic. But I have no other choice. Geeks with blogs admin application does not support unicode content and that really sucks. Apart from that fact, I have been working on phonetic layouts for both हिन्दी  and தமிழ் on &lt;a href="http://www.ubuntu.com"&gt;Ubuntu&lt;/a&gt;. I have just completed them . The first version can be downloaded &lt;a href="http://hi-ta-phonetic.googlecode.com/svn/trunk/in-ph"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Most people like me are living the g-life. I use almost all the services that google exposes. Search, Calendar, Blogger, CodeHosting, Adsense, Docs and Spreadsheets, Picasa web, Youtube (although not technically a google service yet) and maps to name a few. Google has long since become the synonym for the word search. It is now pioneering in the applications space. &lt;a href="http://www.google.com/a/"&gt;Google Apps for your domain&lt;/a&gt; will give products like M$ Exchange and Lotus Domino a run for their money. It makes perfect business sense for SMEs to base their groupware on Google's infrastructure than maintain their own. This is of course given that you must have the kind of bandwidth and the infrastructure to remain connected and ensure that the business is not affected. But I do not see this as a huge problem. GMail exposes your inbox via POP3 and hence it is possible to have your mails both offline and online. Google Calendar can be used to sync up appointments. What is missing from Google right now is a Wiki. That would make it a complete groupware solution. Google would probably integrate its docs and spreadsheets application when they are mature with your domain. Google is taking web to the next level. And it is way more than Web 2.0. But let us refrain from naming it Web 3.0. Just imagine if we have enough bandwidth and google lets us host our databases on its infrastructure. I am sure google would like it. :-)&lt;br /&gt;&lt;br /&gt;We are now using the Web as its creator Tim Berners Lee envisioned it to be. A readable and a writable medium. Web is no more a place for companies to advertise their business. It is now a formidable platform on which they conduct business. &lt;br /&gt;&lt;br /&gt;Its midnight and I am very tired. Its about time I hit the sack. Good night world.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-4761975199567585240?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/4761975199567585240/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=4761975199567585240' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/4761975199567585240'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/4761975199567585240'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2007/01/moving-back-to-blogger.html' title='Moving back to blogger'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-5399830927683432268</id><published>2006-11-23T03:25:00.000-08:00</published><updated>2006-11-23T03:26:08.500-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rubyclr'/><category scheme='http://www.blogger.com/atom/ns#' term='opensource'/><category scheme='http://www.blogger.com/atom/ns#' term='scripting'/><title type='text'>Rolling with RubyCLR</title><content type='html'>I downloaded &lt;a href="http://www.rubyclr.com/" title="RubyCLR"&gt;RubyCLR&lt;/a&gt; today to play around with it and found that it was much more productive than &lt;a href="http://www.codeplex.com/Wiki/View.aspx?ProjectName=IronPython" title="IronPython"&gt;IronPython&lt;/a&gt;. The reason is quite the same as what I mentioned in my &lt;a href="http://installneo.blogspot.com/2006/11/when-cross-platform-is-not-good-enough.html" title="previous blog entry"&gt;previous blog entry&lt;/a&gt;. The Ruby-CLR bridge, which is essentially a library, is implemented as a native &lt;a href="http://www.ruby-lang.org/" title="ruby"&gt;Ruby&lt;/a&gt; extension. So, this gives the developers the choice of using both C based modules and .NET based assemblies from the same script. And thus, in my opinion, RubyCLR is better than &lt;a href="http://jruby.codehaus.org/" title="JRuby"&gt;JRuby&lt;/a&gt;. We do not have to rewrite most of the native wrappers that are already written. In fact, some of them can be brought to .NET. I am not sure on how to embed Ruby as a scripting language for .NET applications. The other way is pretty clear from the samples that are distributed with the download.&lt;br /&gt;&lt;br /&gt;Go ahead. Try it out. You will be surprised on how productive you become.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-5399830927683432268?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/5399830927683432268/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=5399830927683432268' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/5399830927683432268'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/5399830927683432268'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2006/11/rolling-with-rubyclr.html' title='Rolling with RubyCLR'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-722547573037158128</id><published>2006-11-21T02:54:00.000-08:00</published><updated>2006-11-21T02:57:24.166-08:00</updated><title type='text'>Madai Thiranthu - A really cool Tamil Hip Hop Remix</title><content type='html'>&lt;p&gt;While I was browsing the net, I came across this amazing remix. As Yuvan is  busy butchering his father's masterpieces in the name of remixes, this group of  Malaysian hip hop artists have produced another masterpiece remixing the older  master piece by Ilayaraja.  &lt;/p&gt;&lt;p&gt; &lt;/p&gt; &lt;p&gt;&lt;a href="http://www.youtube.com/watch?v=uQSDr4609BU"&gt;http://www.youtube.com/watch?v=uQSDr4609BU&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;object height="350" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/uQSDr4609BU"&gt;&lt;param name="wmode" value="transparent"&gt;&lt;embed src="http://www.youtube.com/v/uQSDr4609BU" type="application/x-shockwave-flash" wmode="transparent" height="350" width="425"&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-722547573037158128?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/722547573037158128/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=722547573037158128' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/722547573037158128'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/722547573037158128'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2006/11/madai-thiranthu-really-cool-tamil-hip.html' title='Madai Thiranthu - A really cool Tamil Hip Hop Remix'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-7555560659616945765</id><published>2006-11-15T05:22:00.000-08:00</published><updated>2006-11-15T05:23:16.969-08:00</updated><title type='text'>When Cross Platform is not good enough...</title><content type='html'>I have been an avid fan of programming languages like C#, Python and Java as they take away most of the clunkiness of C/C++ code. &lt;a href="http://java.sun.com/" title="Java"&gt;Java&lt;/a&gt;, .NET/&lt;a href="http://www.mono-project.com/Main_Page" title="Mono"&gt;Mono&lt;/a&gt;, &lt;a href="http://www.python.org/" title="Python"&gt;Python&lt;/a&gt;, &lt;a href="http://www.ruby-lang.org/" title="Ruby"&gt;Ruby&lt;/a&gt; and all other similar languages make claims that they are cross platform compliant. But the truth is, the library developer is bound to a specific technology.&lt;br /&gt;&lt;br /&gt;For instance, the &lt;a href="http://bazaar-vcs.org/" title="bzr"&gt;bzr&lt;/a&gt; version control system is written entirely in python. It has quite some promising features but it can never measure up to &lt;a href="http://subversion.tigris.org/" title="Subversion"&gt;Subversion&lt;/a&gt;. Just imagine integrating bzr with &lt;a href="http://www.eclipse.org/" title="Eclipse"&gt;Eclipse&lt;/a&gt; or using it with Visual Studio 2005. I am sure that I am not the first person to raise this as a concern. It is a part of the &lt;a href="http://bazaar-vcs.org/FAQ" title="FAQ"&gt;FAQ&lt;/a&gt; &lt;a href="http://bazaar-vcs.org/FAQ#head-d7f8073f904f1e4b96e52d4c77f79e38cf0099f0" title="here"&gt;here&lt;/a&gt;. But my concern is not about the performance but the portability. It might, at the outset, seem as a funny argument as Python is supposed to be an extremely portable language so why should anyone have such a concern? The problem is not with the platform portability but with the technology portability. You would have to jump through several hoops before you can get bzr working with Java or .NET/Mono. Another argument might be that people could simply port bzr to &lt;a href="http://www.jython.org/" title="Jython"&gt;Jython&lt;/a&gt; or &lt;a href="http://www.codeplex.com/Wiki/View.aspx?ProjectName=IronPython" title="IronPython"&gt;IronPython&lt;/a&gt;. This might be possible with open source software but might not be the case with the closed source counterparts. There are a lot of good number of libraries written in Java, which unfortunately have to be rewritten in .NET. A testimony to this is the J* open source projects being ported to .NET and called as N*, like xUnit, xAnt, xVelocity, etc.&lt;br /&gt;&lt;br /&gt;I understand that Java, C#, Python or Ruby make developers insanely productive. But library developers have to resist the urge to develop libraries in these languages and try to write their libraries in C/C++. By libraries, I also mean the tools and toolkits that are associated with them. Cross platform portability is definitely a concern. But it can be addressed but portable libraries like &lt;a href="http://www.boost.org/" title="Boost"&gt;Boost&lt;/a&gt; or &lt;a href="http://apr.apache.org/" title="APR"&gt;APR&lt;/a&gt;. You can later provide bindings to higher languages in the .NET stack, Java, Python or Ruby using interface generators like &lt;a href="http://www.swig.org/" title="SWIG"&gt;SWIG&lt;/a&gt;. There are numerous projects that have followed this approach and are hugely succesful. For instance, &lt;a href="http://subversion.tigris.org/" title="Subversion"&gt;Subversion&lt;/a&gt;, &lt;a href="http://www.wxwidgets.org/" title="wxWidgets"&gt;wxWidgets&lt;/a&gt;, &lt;a href="http://www.gtk.org/" title="GTK"&gt;GTK&lt;/a&gt; , &lt;a href="http://www.sqlite.org/" title="SQLite"&gt;SQLite&lt;/a&gt;, &lt;a href="http://www.mysql.com/" title="MySQL"&gt;MySQL&lt;/a&gt; are all glorious examples of toolkits and libraries that have core C/C++ components and have language bindings to higher level languages.&lt;br /&gt;&lt;br /&gt;I am not saying that programming in Python or Ruby is bad. I absolutely love the way they make you productive. But high level languages are not the panacea for all programming problems. There are certain categories of software that ought to be written in C/C++ and not with higher languages. You can then write wrapper/helper libraries to make the access even simpler. But if the library developer ensures compliance across technologies, higher the chances of the library being usable and consequently popular.&lt;br /&gt;&lt;br /&gt;Just my 2 cents on library development.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-7555560659616945765?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/7555560659616945765/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=7555560659616945765' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/7555560659616945765'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/7555560659616945765'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2006/11/when-cross-platform-is-not-good-enough.html' title='When Cross Platform is not good enough...'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-110432261518999422</id><published>2004-12-29T04:16:00.000-08:00</published><updated>2006-11-14T12:19:11.163-08:00</updated><title type='text'>Configuration Data is such a Pain</title><content type='html'>I have finally got my computer to my new house in &lt;a href="http://hulk.bu.edu/misc/karnataka/cities/bangalore"&gt;Bangalore&lt;/a&gt;. I dont have access to the internet, so I will essentially by offline. I am yet to install &lt;a href="http://icsharpcode.com/OpenSource/SD"&gt;SharpDevelop&lt;/a&gt; and &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=9B3A2CA6-3647-4070-9F41-A333C6B9181D&amp;amp;displaylang=en"&gt;.NET Framework SDK v1.1&lt;/a&gt;. Hopefully, I should be able to get it done today. I had some time today morning but I was too busy playing NFS Hot Pursuit 2 and Quake 3. (No real souls to frag. Only bots. )&lt;br /&gt;&lt;br /&gt;Currently one of our installation packages does something that it should not be doing. It is handling configuration data for several applications. Clearly this created several issues during upgrades. Now, for the next schedule major release, we (the packaging team) decided that we would let the applications handle the configuration information. This was duly presented as a proposal to other "application development" teams in a meeting. The people were a little hot under the collar during the meeting. Other development groups suspected that we were doing this to brush off our responsibility. I am sure that other setup developers would also have faced such similar predicament.&lt;br /&gt;&lt;br /&gt;I was recently browsing through the &lt;a href="http://www.installshield.com/"&gt;InstallShield&lt;/a&gt; &lt;a href="http://community.installshield.com/"&gt;Community&lt;/a&gt; forums and found that mosth setup developers were invariably including configuration data as a part of their installation. I even saw one post where a setup developer had used a VBScript custom action with the FileSystemObject and tried to replace certain place holder texts in the installed configuration file. I am sure that many of us, who have burnt their fingers with VBScript and FSO, would agree with me. Logically speaking, there is nothing wrong with this approach. But we have to realize that we are introducing a element that can go wrong. Having deferred VBScript custom actions with FSO is a lot of fun while debugging.&lt;br /&gt;&lt;br /&gt;My recommended approach would be to have a small configurator utility, which would accept command line parameters and perform the same tasks. This serves two purposes.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;The configuration data is effectively taken out of the MSI. You can avoid slicing and dicing the CustomActionData property to get the desired values. There is one element less in the project that can go wrong.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The user need not run the installation, if he has specified incorrect configuration. He has the option of configuring the software after installing it. While installing on locked down environments, the setup author has to ensure that the permissions table is authored such that the current user has no problems writing on the the specified resources. This should'nt be a problem for registry keys or folders as their permission tokens can always be altered by the installer.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Finally, &lt;a href="http://www.geekswithblogs.net/rikoe"&gt;Riko&lt;/a&gt; is back. It seems that he is going to &lt;a href="http://www.geekswithblogs.net/rikoe/archive/2004/12/28/18643.aspx"&gt;submit his tallow source&lt;/a&gt; to the community. I can't wait to get my hands on it.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-110432261518999422?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/110432261518999422/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=110432261518999422' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/110432261518999422'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/110432261518999422'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2004/12/configuration-data-is-such-pain.html' title='Configuration Data is such a Pain'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-110379893653085235</id><published>2004-12-23T02:48:00.000-08:00</published><updated>2006-11-14T12:19:11.088-08:00</updated><title type='text'>My 2 cents</title><content type='html'>&lt;P&gt;If people were following the the WIX-Users Mailing list, they would find that it has been a little hot recently. The first instance (as far as my knowledge goes) was with &lt;A href="http://msmvps.com/michael/"&gt;Michael&lt;/A&gt; creating a validation tool for the WIX Toolset called '&lt;A href="http://www.deploynow.com/Articles/Details.aspx?ID=2"&gt;smoke&lt;/A&gt;'. I personally found it very useful as it could easily be included as a part of the build process. The output is in a structured XML format that makes it easier for us to crunch and build reports. But, some of the members in the group did not share the same level of enthusiasm. &lt;A href="http://msmvps.com/michael/"&gt;Michael&lt;/A&gt; seemed to be put off by that and included a &lt;A href="http://msmvps.com/michael/archive/2004/12/13/23808.aspx"&gt;disturbing update&lt;/A&gt; to his blog entry. &lt;A href="http://blogs.msdn.com/robmen"&gt;Rob&lt;/A&gt; immediately acknowledged it and posted a blog entry&amp;nbsp;about being &lt;A href="http://blogs.msdn.com/robmen/archive/2004/12/16/318015.aspx"&gt;thick skinned&lt;/A&gt;.&lt;/P&gt;&lt;br /&gt;&lt;P&gt;Recently, history repeated with Marc Bogers starting to ask about the ICE 33 warnings as Tallow populates the Registry table instead of the &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/registry_tables_group.asp"&gt;Registry Tables group&lt;/A&gt;. Firstly, Tallow is only a helper utility and is anything but perfect. It is useful but does not exactly produce usable WIX code. Heck, it doesn't even write to a file. &lt;A href="http://blogs.msdn.com/robmen"&gt;Rob&lt;/A&gt; had said that ICE33 warnings can be ignored as it created some "strange behavior". More precisely, the resiliency associated with advertisement would prompt the end user for the media when Windows Installer detects some inconsistencies with the CLSID registration. Michael dismissed the argument that it arose from sloppy authoring and had nothing to do with MSI itself. Follow Michael's &lt;A href="http://msmvps.com/michael/archive/2004/12/22/26726.aspx"&gt;blog entry on COM registration &lt;/A&gt;for more information. &lt;/P&gt;&lt;br /&gt;&lt;P&gt;As we all know, Rob does not agree on a lot of things like inserting GUIDs while generating output with Tallow, using the &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/registry_tables_group.asp"&gt;Registry Tables Group &lt;/A&gt;and so on. I am sure that he has good reasons behind them. I am also sure that many people (including me), have modified Tallow to suit their requirements. Some people are using &lt;A href="http://geekswithblogs.net/rikoe"&gt;Riko&lt;/A&gt;'s Tallow that does write to the Regsitry table's group using the Class and TypeLib elements. (On a totally different note, Riko, when are you going to release that code of yours?) I have a version of Tallow that creates components with GUIDs and names them appropriately. I am pretty sure that I am aware of the consequences and I have written code to persist the component information for future reference. &lt;/P&gt;&lt;br /&gt;&lt;P&gt;This freedom is the inherent beauty of open-source software. People can use their own ingenious imagination to tailor the tool to best suit their requirements. Of course, some of our opinions differ and we need a healthy debate to analyze these opinions and make the best of it. We should refrain from flaming and should try to embrace new ideas. Rob may be the BDFL for the &lt;A href="http://wix.sourceforge.net/"&gt;WIX Toolset&lt;/A&gt; but I am sure that he would like the WIX Toolset to be successful and that helps developers create better installers without breaking much sweat. I tried hard not to write about this topic but after reading Michael's blog and comments with certain &lt;A href="http://msmvps.com/michael/archive/2004/12/22/26809.aspx"&gt;conspiracy theories&lt;/A&gt;, I wanted to voice my opinion too. I am sorry if I have hurt anybody's feelings.&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-110379893653085235?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/110379893653085235/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=110379893653085235' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/110379893653085235'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/110379893653085235'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2004/12/my-2-cents.html' title='My 2 cents'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-110293843642983680</id><published>2004-12-13T03:47:00.000-08:00</published><updated>2006-11-14T12:19:11.004-08:00</updated><title type='text'>Using an InstallScript application as the setup launcher</title><content type='html'>&lt;P&gt;This, I guess, is my first &lt;A href="http://www.installshield.com/"&gt;InstallShield&lt;/A&gt; specific post. MSI is good in a lot of things but not when dealing with more than one package in a single transaction. MSI engine is designed to be run as a single instance and cannot be used effectively to install more than one package. Nested installations are possible but often lead to undesired consequences. Having a setup chainer is good but it involves writing code and handling reboots. So, for all who are using &lt;A href="http://www.installshield.com/products/installshield/default.asp"&gt;InstallShield DevStudio&lt;/A&gt; and up can benefit by using the &lt;A href="http://helpnet.installshield.com/Robo/BIN/Robo.dll?tpc=/robo/projects/InstallShieldXHelpLib/ProjectType_InstallScript.htm"&gt;InstallScript project&lt;/A&gt; as their setup launcher and monitor. We can effectively "script" a launcher application and have complete control over the installation process using the available libraries.&lt;/P&gt;&lt;br /&gt;&lt;P&gt;Why InstallScript....? I would not usually recommend InstallScript for any of the custom actions in the project, as the MSI-Scripting bridge is a little weak and has certain limitations. However, InstallScript libraries would cut down most of the code that you would have to write with a brand new C++ application. Also the scripting engine supports the silent mode. So you do not have to code separately for that either. But on the flip side, you would have an overhead of 1 Meg for the InstallScript engine. But this is okay considering the fresh set of bugs that you would introduce with the first version of the launcher application. For those not concerned about silent mode, you can check out the free open source setup launcher (&lt;A href="http://www.devage.com/dotNetInstaller/dotNetInstaller.html"&gt;dotNetInstaller&lt;/A&gt;).&lt;/P&gt;&lt;br /&gt;&lt;P&gt;The trick here is to use the InstallScript's program....endprogram syntax instead of the event based model. This makes sure that you do not register the application and does not call unknown events in between. Good old block scripting. &amp;lt;smile/&amp;gt; This also means that you need to take care of exceptions. If you are a setup developer from the good old InstallShield Professional 5.x days, you would immediately be at home with this kind of approach. So a simple script to just display a message box would be as below.&lt;/P&gt;&lt;br /&gt;&lt;P&gt;#include "ifx.h" //The standard header&lt;BR&gt;//Our program block starts here&lt;BR&gt;program&lt;BR&gt;&amp;nbsp;MessageBox("Hello World!",INFORMATION);&lt;BR&gt;endprogram&lt;/P&gt;&lt;br /&gt;&lt;P&gt;InstallScript engine just executes the statments present between the program and endprogram statements. As you can see, this approach gives you the flexibility of a complete scripting language with libraries custom made for creating installations. InstallScript projects are known for their flexibility but miss on the other aspects of MSI such as Elevated Privileges, Install on Demand, Source Resiliency and Self-healing. &lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-110293843642983680?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/110293843642983680/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=110293843642983680' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/110293843642983680'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/110293843642983680'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2004/12/using-installscript-application-as.html' title='Using an InstallScript application as the setup launcher'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-110191276539885140</id><published>2004-12-01T06:52:00.000-08:00</published><updated>2006-11-14T12:19:10.896-08:00</updated><title type='text'>Spying on Registry Entries</title><content type='html'>&lt;P&gt;I am probably letting out the best kept secret of installation industry. I always used to wonder and have now discovered how most of the installation tools spy on registry entries that are created during COM registration or similar processes without actually affecting the build system. The spying program creates temporary registry keys for each of the registry hives HKCR, HKLM, HKCU, HKU and it maps the registry hives to these temporary registry keys. It then triggers the registration function which creates registry entries withing the registry keys specified instead of including it in the hives. I came across this revelation while I was wading through the source code for Tallow in the WIX toolset.&lt;/P&gt;&lt;br /&gt;&lt;P&gt;The core of this spying exercise relies on functions exposed by the advapi32.dll. The actual hive to key mapping is performed by the &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/regoverridepredefkey.asp"&gt;RegOverridePredefKey()&lt;/A&gt; function. The handle to the registry key is passed by using the &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/regcreatekeyex.asp"&gt;RegCreateKeyEx()&lt;/A&gt; or the &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/regopenkeyex.asp"&gt;RegOpenKeyEx()&lt;/A&gt; function. After the mapping is done, you can invoke the DllRegisterServer() function after loading the library using the &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/loadlibrary.asp"&gt;LoadLibrary()&lt;/A&gt; function. This mapping would be active for all the registry entries created by that particular process. So out of process registration for exe files may not directly work with this method. For the sake of simplicity, I am going to extract COM Interop settings from a given assembly. So let us write a simple console app in C# to do this. This app would perform the mapping and write the registry entries to a REG file and wipe out the key after the file is written.&lt;/P&gt;&lt;br /&gt;&lt;P&gt;Extracting registration information from a DLL file is similar but involve the importing other functions from Kernel32.dll. So I am giving that a raincheck now. You can download the Wix toolset's source package if you are interested. To start off with, let us write a class with static members to import the functions from advapi32.dll and create wrappers for them. Ensure that you have &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemruntimeinteropservices.asp"&gt;System.Runtime.InteropServices&lt;/A&gt; namespace included.&lt;/P&gt;&lt;br /&gt;&lt;DIV class=cf&gt;&lt;br /&gt;&lt;P class=cl&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;class&lt;/FONT&gt;&lt;/SPAN&gt; OverRideRegistry&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb2&gt;&lt;FONT color=#008000&gt;//We first declare some stuff required. The are defined in winreg.h and windows.h&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;public&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;static&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;readonly&lt;/FONT&gt;&lt;/SPAN&gt; UIntPtr HkeyClassesRoot = (UIntPtr)0x80000000;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;public&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;static&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;readonly&lt;/FONT&gt;&lt;/SPAN&gt; UIntPtr HkeyCurrentUser = (UIntPtr)0x80000001;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;public&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;static&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;readonly&lt;/FONT&gt;&lt;/SPAN&gt; UIntPtr HkeyLocalMachine = (UIntPtr)0x80000002;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;public&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;static&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;readonly&lt;/FONT&gt;&lt;/SPAN&gt; UIntPtr HkeyUsers = (UIntPtr)0x80000003;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;public&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;const&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;uint&lt;/FONT&gt;&lt;/SPAN&gt; Delete = 0x00010000;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;public&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;const&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;uint&lt;/FONT&gt;&lt;/SPAN&gt; ReadOnly = 0x00020000;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;public&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;const&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;uint&lt;/FONT&gt;&lt;/SPAN&gt; WriteDac = 0x00040000;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;public&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;const&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;uint&lt;/FONT&gt;&lt;/SPAN&gt; WriteOwner = 0x00080000;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;public&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;const&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;uint&lt;/FONT&gt;&lt;/SPAN&gt; Synchronize = 0x00100000;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;public&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;const&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;uint&lt;/FONT&gt;&lt;/SPAN&gt; StandardRightsRequired = 0x000F0000;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;public&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;const&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;uint&lt;/FONT&gt;&lt;/SPAN&gt; StandardRightsAll = 0x001F0000;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;public&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;const&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;uint&lt;/FONT&gt;&lt;/SPAN&gt; GenericRead = 0x80000000;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;public&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;const&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;uint&lt;/FONT&gt;&lt;/SPAN&gt; GenericWrite = 0x40000000;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;public&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;const&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;uint&lt;/FONT&gt;&lt;/SPAN&gt; GenericExecute = 0x20000000;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;public&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;const&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;uint&lt;/FONT&gt;&lt;/SPAN&gt; GenericAll = 0x10000000;&lt;BR&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region&lt;/FONT&gt;&lt;/SPAN&gt; The Interop Import Stuff&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb2&gt;&lt;FONT color=#008000&gt;//we now import the functions exposed by advapi32.dll&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb2&gt;&lt;FONT color=#008000&gt;//Use RegCreateKeyEx to get handle to the openedKey&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [DllImport("advapi32.dll", EntryPoint="RegCreateKeyExW", CharSet=CharSet.Unicode, ExactSpelling=&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;true&lt;/FONT&gt;&lt;/SPAN&gt;, SetLastError=&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;true&lt;/FONT&gt;&lt;/SPAN&gt;)]&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;internal&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;static&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;extern&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;int&lt;/FONT&gt;&lt;/SPAN&gt; RegCreateKey(UIntPtr key, &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;string&lt;/FONT&gt;&lt;/SPAN&gt; subkey, &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;uint&lt;/FONT&gt;&lt;/SPAN&gt; reserved, &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;string&lt;/FONT&gt;&lt;/SPAN&gt; className, &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;uint&lt;/FONT&gt;&lt;/SPAN&gt; options, &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;uint&lt;/FONT&gt;&lt;/SPAN&gt; desiredSam, &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;uint&lt;/FONT&gt;&lt;/SPAN&gt; securityAttributes, &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;out&lt;/FONT&gt;&lt;/SPAN&gt; IntPtr openedKey, &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;out&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;uint&lt;/FONT&gt;&lt;/SPAN&gt; disposition);&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb2&gt;&lt;FONT color=#008000&gt;//This does the actual hive to key mapping&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [DllImport("advapi32.dll", EntryPoint="RegOverridePredefKey", CharSet=CharSet.Unicode, ExactSpelling=&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;true&lt;/FONT&gt;&lt;/SPAN&gt;, SetLastError=&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;true&lt;/FONT&gt;&lt;/SPAN&gt;)]&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;internal&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;static&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;extern&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;int&lt;/FONT&gt;&lt;/SPAN&gt; RegOverridePredefKey(UIntPtr key, IntPtr newKey);&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb2&gt;&lt;FONT color=#008000&gt;//Like good programmers, we release our handles.&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [DllImport("advapi32.dll", EntryPoint="RegCloseKey", CharSet=CharSet.Unicode, ExactSpelling=&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;true&lt;/FONT&gt;&lt;/SPAN&gt;, SetLastError=&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;true&lt;/FONT&gt;&lt;/SPAN&gt;)]&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;internal&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;static&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;extern&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;int&lt;/FONT&gt;&lt;/SPAN&gt; RegCloseKey(IntPtr key);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb2&gt;&lt;FONT color=#008000&gt;//Our interops are done :-)&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #endregion&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb2&gt;&lt;FONT color=#008000&gt;//Now we actually write wrapper functions to use the imported functions&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb2&gt;&lt;FONT color=#008000&gt;//Wrapper for creating Registry Keys&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;internal&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;static&lt;/FONT&gt;&lt;/SPAN&gt; IntPtr OpenRegistryKey(UIntPtr key, &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;string&lt;/FONT&gt;&lt;/SPAN&gt; path)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IntPtr newKey = IntPtr.Zero;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;uint&lt;/FONT&gt;&lt;/SPAN&gt; disposition = 0;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;uint&lt;/FONT&gt;&lt;/SPAN&gt; security = StandardRightsAll | GenericRead | GenericWrite | GenericExecute | GenericAll;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;int&lt;/FONT&gt;&lt;/SPAN&gt; error = RegCreateKey(key, path, 0, &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;null&lt;/FONT&gt;&lt;/SPAN&gt;, 0, security, 0, &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;out&lt;/FONT&gt;&lt;/SPAN&gt; newKey, &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;out&lt;/FONT&gt;&lt;/SPAN&gt; disposition);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;return&lt;/FONT&gt;&lt;/SPAN&gt; newKey;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb2&gt;&lt;FONT color=#008000&gt;//Wrapper for the mapping&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;internal&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;static&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;void&lt;/FONT&gt;&lt;/SPAN&gt; OverrideRegistryKey(UIntPtr key, IntPtr newKey)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;int&lt;/FONT&gt;&lt;/SPAN&gt; error = RegOverridePredefKey(key, newKey);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb2&gt;&lt;FONT color=#008000&gt;//Wrapper for freeing the handle&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;internal&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;static&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;void&lt;/FONT&gt;&lt;/SPAN&gt; CloseRegistryKey(IntPtr key)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;int&lt;/FONT&gt;&lt;/SPAN&gt; error = RegCloseKey(key);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;br /&gt;&lt;P class=cl&gt;Now that we have the helper class with the static methods, we can define our main Console App class, which would use the functions in the helper class to register the assembly and steal the registry entries. Let us define the functions that Map and Map the registry hives. I had initialized the RegLocation to a string "Software\\Vagmi\\RegInterop\\". So the extracted registry entries would be put in the HKLM hive within the specified path. Also not that I have mapped HKLM as the final mapping. Else all keys that are subsequently created would be created within our registry key.&lt;/P&gt;&lt;br /&gt;&lt;DIV class=cf&gt;&lt;br /&gt;&lt;P class=cl&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;void&lt;/FONT&gt;&lt;/SPAN&gt; MapRegHives()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MapRegHive(OverRideRegistry.HkeyClassesRoot,&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;this&lt;/FONT&gt;&lt;/SPAN&gt;.RegLocation+"HKCR");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MapRegHive(OverRideRegistry.HkeyCurrentUser,&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;this&lt;/FONT&gt;&lt;/SPAN&gt;.RegLocation+"HKCU");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MapRegHive(OverRideRegistry.HkeyUsers,&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;this&lt;/FONT&gt;&lt;/SPAN&gt;.RegLocation+"HKU");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MapRegHive(OverRideRegistry.HkeyLocalMachine,&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;this&lt;/FONT&gt;&lt;/SPAN&gt;.RegLocation+"HKLM");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;void&lt;/FONT&gt;&lt;/SPAN&gt; MapRegHive(UIntPtr key, &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;string&lt;/FONT&gt;&lt;/SPAN&gt; location)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("Mapping " + key + "&amp;nbsp; to " + location);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IntPtr createdKey=IntPtr.Zero;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;try&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; createdKey=OverRideRegistry.OpenRegistryKey(OverRideRegistry.HkeyLocalMachine,location);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OverRideRegistry.OverrideRegistryKey(key,createdKey);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;catch&lt;/FONT&gt;&lt;/SPAN&gt;(Exception e)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("Caught exception: " + e.Message);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;finally&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb2&gt;&lt;FONT color=#008000&gt;//close key like responsible programmers&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OverRideRegistry.CloseRegistryKey(createdKey);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb2&gt;&lt;FONT color=#008000&gt;//Functions to unmap registry hives.&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;void&lt;/FONT&gt;&lt;/SPAN&gt; UnMapRegHives()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OverRideRegistry.OverrideRegistryKey(OverRideRegistry.HkeyClassesRoot,IntPtr.Zero);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OverRideRegistry.OverrideRegistryKey(OverRideRegistry.HkeyCurrentUser,IntPtr.Zero);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OverRideRegistry.OverrideRegistryKey(OverRideRegistry.HkeyLocalMachine,IntPtr.Zero);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OverRideRegistry.OverrideRegistryKey(OverRideRegistry.HkeyUsers,IntPtr.Zero);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;br /&gt;&lt;P class=cl&gt;I then parse two command line arguments one for the DLL and another for the REG file to export. I then pass these as constructors to my class, which calls these functions. &lt;/P&gt;&lt;br /&gt;&lt;DIV class=cf&gt;&lt;br /&gt;&lt;P class=cl&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;public&lt;/FONT&gt;&lt;/SPAN&gt; RegSpyCOMInterop(&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;string&lt;/FONT&gt;&lt;/SPAN&gt; AssemblyPath, &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;string&lt;/FONT&gt;&lt;/SPAN&gt; RegFile)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;try&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Assembly a=Assembly.LoadFrom(AssemblyPath);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RegistrationServices regServices=&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;new&lt;/FONT&gt;&lt;/SPAN&gt; RegistrationServices();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb2&gt;&lt;FONT color=#008000&gt;//map hives to registry keys&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MapRegHives();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb2&gt;&lt;FONT color=#008000&gt;//Register assembly for COM interop&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; regServices.RegisterAssembly(a,AssemblyRegistrationFlags.SetCodeBase);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb2&gt;&lt;FONT color=#008000&gt;//Unmap hives&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UnMapRegHives();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WriteToRegFile(RegFile);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;catch&lt;/FONT&gt;&lt;/SPAN&gt;(Exception e)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("Caught Exception : " + e.Message);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;br /&gt;&lt;P class=cl&gt;The WriteToRegFile() function launches regedit and exports the hive that contains our keys. It then uses simple text replacement to change the values of the exported file to make the REG file functional.&lt;/P&gt;&lt;br /&gt;&lt;DIV class=cf&gt;&lt;br /&gt;&lt;P class=cl&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;public&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;void&lt;/FONT&gt;&lt;/SPAN&gt; WriteToRegFile(&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;string&lt;/FONT&gt;&lt;/SPAN&gt; regfile)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RegistryKey r=Registry.LocalMachine.OpenSubKey(RegLocation,&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;false&lt;/FONT&gt;&lt;/SPAN&gt;);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PathToDelete=r.Name + "\\";&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Process pr=&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;new&lt;/FONT&gt;&lt;/SPAN&gt; Process();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pr.StartInfo.FileName="regedit";&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pr.StartInfo.Arguments=" /e " + regfile + " " + r.Name;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pr.Start();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pr.WaitForExit();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;string&lt;/FONT&gt;&lt;/SPAN&gt; line;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; StreamReader reader=&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;new&lt;/FONT&gt;&lt;/SPAN&gt; StreamReader(regfile);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; StreamWriter writer=&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;new&lt;/FONT&gt;&lt;/SPAN&gt; StreamWriter("TempFile.txt");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;while&lt;/FONT&gt;&lt;/SPAN&gt;((line=reader.ReadLine())!=&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;null&lt;/FONT&gt;&lt;/SPAN&gt;)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; writer.WriteLine(processRegistryName(line));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; reader.Close();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; writer.Close();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; File.Copy("TempFile.txt",regfile,&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;true&lt;/FONT&gt;&lt;/SPAN&gt;);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; File.Delete("TempFile.txt");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; r.Flush();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; r.Close();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;br /&gt;&lt;P class=cl&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;public&lt;/FONT&gt;&lt;/SPAN&gt; String processRegistryName(&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;string&lt;/FONT&gt;&lt;/SPAN&gt; regname)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;string&lt;/FONT&gt;&lt;/SPAN&gt; newRegName="";&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; newRegName=regname.Replace(PathToDelete,"");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; newRegName=newRegName.Replace("[" + PathToDelete.Substring(0,PathToDelete.Length-1) + "]","");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; newRegName=newRegName.Replace("HKCR","HKEY_CLASS_ROOT");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; newRegName=newRegName.Replace("HKCU","HKEY_CURRENT_USER");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; newRegName=newRegName.Replace("HKLM","HKEY_LOCAL_MACHINE");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; newRegName=newRegName.Replace("HKU","HKEY_USERS");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;return&lt;/FONT&gt;&lt;/SPAN&gt; newRegName;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;br /&gt;&lt;P class=cl&gt;There you have it. A command line utility to extract COM Interop Registry entries. Hope this answered some of your queries regarding registration without affecting the target system. You can find the entire source code at &lt;A href="http://www.geekswithblogs.net/vagmi.mudumbai/articles/16581.aspx"&gt;http://www.geekswithblogs.net/vagmi.mudumbai/articles/16581.aspx&lt;/A&gt;.&lt;/P&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-110191276539885140?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/110191276539885140/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=110191276539885140' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/110191276539885140'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/110191276539885140'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2004/12/spying-on-registry-entries.html' title='Spying on Registry Entries'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-110127449454449185</id><published>2004-11-23T21:34:00.000-08:00</published><updated>2006-11-14T12:19:10.824-08:00</updated><title type='text'>Microsoft's Whitepaper on Patch Sequencing</title><content type='html'>&lt;P&gt;While browsing, I came across this excellent whitepaper on MSI 3.0 Patch Sequencing. &lt;/P&gt;&lt;br /&gt;&lt;P&gt;&lt;A href="http://www.microsoft.com/downloads/details.aspx?FamilyId=AD7AC91E-2493-4549-AE6F-BF5E007C12A3&amp;displaylang=en"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyId=AD7AC91E-2493-4549-AE6F-BF5E007C12A3&amp;amp;displaylang=en&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/7972422-110127449454449185?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/110127449454449185/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=110127449454449185' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/110127449454449185'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/110127449454449185'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2004/11/microsofts-whitepaper-on-patch.html' title='Microsoft&apos;s Whitepaper on Patch Sequencing'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-110121723992324057</id><published>2004-11-23T05:40:00.000-08:00</published><updated>2006-11-14T12:19:10.730-08:00</updated><title type='text'>Using WIX Toolset for Distributed Development</title><content type='html'>&lt;P&gt;When I talk to my fellow developers and other installation developers about the WIX Toolset, they do not fully understand the implications of the WIX Toolset in its own right but map its features to their favorite installation development tools. The WIX Toolset mostly ensures that you follow the best practices while authoring packages. The biggest advantage of the WIX Toolset over other applications is the support for distributed development. I have raved and ranted about this in my previous blog entries but I would substantiate it with actual WXS code this time. For starters, WXS file is an XML file that has to follow the schema as specified in the wix.xsd file in the 'doc' folder of your distribution. &lt;A href="http://blogs.msdn.com/robmen"&gt;Rob&lt;/A&gt; has an excellent &lt;A href="http://blogs.msdn.com/robmen/archive/2004/09/23/233684.aspx"&gt;demo&lt;/A&gt; on distributed development with the WIX toolset. But the quality of video is&amp;nbsp;very poor and the sample files are not yet available for us to tweak around with. So&amp;nbsp;I have come up with my own example.&lt;/P&gt;&lt;P&gt;Let us assume the following scenario. There are&amp;nbsp;group of installation and application&amp;nbsp;developers in the organization working on a setup project. Let us allocate roles (purely hypothetical. I am not a manager &amp;lt;grin/&amp;gt;) for our convenience. Let us assume that the application developers take care of maintaining a catalog of&amp;nbsp;components and resources that go into the product. The second developer takes care of assigning the appropriate components into the respective merge modules or features in a product. Let another developer be responsible for creating UIs. Additionally, each application developer creates his own fragments of files by hand or by using a simple tool. Let us assume that we have to package three files.&lt;/P&gt;&lt;OL&gt;&lt;br /&gt;&lt;LI&gt;Notepad.exe&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;ReadMe.txt&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;Calc.exe&lt;/LI&gt;&lt;/OL&gt;&lt;P&gt;Notepad.exe and Readme.txt are a logical unit and hence we would put them in a single component called Notepad.exe and set Notepad.exe as the key file of the component. We would also have Readme.txt as a companion file for Notepad.exe such that the versioning logic of Readme.txt is controlled by the versioning logic of Notepad.exe. Calc.exe is a standalone application that does not have anyother files. So here we go. The application developer codes his file named Dev1.wxs. Pretty simple isn't it? &lt;/P&gt;&lt;P&gt;&amp;lt;!--Dev1.wxs--&amp;gt;&lt;BR&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;lt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;&lt;FONT color=#800000&gt;Wix&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;xmlns&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="http://schemas.microsoft.com/wix/2003/01/wi"&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;lt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;&lt;FONT color=#800000&gt;Fragment&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;lt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;&lt;FONT color=#800000&gt;DirectoryRef&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;Id&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="INSTALLDIR"&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;lt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;&lt;FONT color=#800000&gt;Component&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;Id&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="Notepad.exe"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;Guid&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="12CC008F-89A6-422d-868B-B066606FFD99"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;DiskId&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="1"&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;lt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;&lt;FONT color=#800000&gt;File&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;Id&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="Notepad.exe"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;Name&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="Notepad.exe"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;LongName&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="Notepad.exe"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;KeyPath&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="yes"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;src&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="$(env.BUILDPATH)\Notepad.exe"&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;lt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;&lt;FONT color=#800000&gt;Shortcut&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;Id&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="LaunchNotepad"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;Advertise&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="no"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;Description&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="Launches Notepad"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;Directory&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="DesktopFolder"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;Name&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="Notepad"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;LongName&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="Launch Notepad"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;WorkingDirectory&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="INSTALLDIR"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;Icon&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="Notepad.ico"/&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;lt;/&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;&lt;FONT color=#800000&gt;File&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;lt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;&lt;FONT color=#800000&gt;File&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;Id&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="Readme.txt"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;Name&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="Readme.txt"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;LongName&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="Readme.txt"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;CompanionFile&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="Notepad.exe"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;src&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="$(env.BUILDPATH)\Readme.txt"/&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;lt;/&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;&lt;FONT color=#800000&gt;Component&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;lt;/&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;&lt;FONT color=#800000&gt;DirectoryRef&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff size=2&gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;Icon&lt;/FONT&gt;&lt;FONT color=#ff00ff size=2&gt; &lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;Id&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;="Notepad.ico"&lt;/FONT&gt;&lt;FONT color=#ff00ff size=2&gt; &lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;src&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;="$(env.BUILDPATH)\Notepad.ico"/&amp;gt;&lt;BR&gt;&amp;nbsp; &lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;lt;/&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;&lt;FONT color=#800000&gt;Fragment&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;lt;/&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;&lt;FONT color=#800000&gt;Wix&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;Now the second application developer creates his file dev2.wxs.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;lt;!--Dev2.wxs--&amp;gt;&lt;BR&gt;&amp;lt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;&lt;FONT color=#800000&gt;Wix&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;xmlns&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="http://schemas.microsoft.com/wix/2003/01/wi"&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;lt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;&lt;FONT color=#800000&gt;Fragment&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;lt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;&lt;FONT color=#800000&gt;DirectoryRef&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;Id&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="INSTALLDIR"&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;lt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;&lt;FONT color=#800000&gt;Component&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;Id&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="Calc.exe"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;Guid&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="2C5ECB67-E585-4301-BAF4-5380FE6C26AB"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;DiskId&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="1"&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;lt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;&lt;FONT color=#800000&gt;File&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;Id&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="Calc.exe"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;Name&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="Calc.exe"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;LongName&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="Calc.exe"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;KeyPath&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="yes"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;src&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="$(env.BUILDPATH)\Calc.exe"/&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;lt;/&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;&lt;FONT color=#800000&gt;Component&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;lt;/&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;&lt;FONT color=#800000&gt;DirectoryRef&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;lt;/&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;&lt;FONT color=#800000&gt;Fragment&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;lt;/&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;&lt;FONT color=#800000&gt;Wix&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=cb1&gt;By now, the UI guy would have created a new WXS file for UI or stole the UI from a premade package. I normally steal UI from premade(I just coined this word)&amp;nbsp;packages like Orca or some UI generated by freeware installers. Writing UI code for MSI using the WIX toolset is not exactly a pleasurable experience. &amp;lt;sigh/&amp;gt; So here goes the UI file. I am not going to include the WXS file here but if you need it, you can send me an email at &lt;A href="mailto:vagmi.mudumbai@gmail.com"&gt;vagmi.mudumbai@gmail.com&lt;/A&gt;. Now we have a file called dialogs.wxs which just has a bunch of dialogs, binaries, error texts, UITexts and properties defined for the UI.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=cb1&gt;Now we have to piece together each of these files and link them to our product. This is the MyProduct.wxs file which contains the feature-component mapping and the rest of the installation logic.&lt;/SPAN&gt;&lt;/P&gt;&lt;SPAN class=cb1&gt;&lt;DIV class=cf&gt;&lt;P class=cl&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;lt;!--MyProduct.wxs--&amp;gt;&lt;BR&gt;&amp;lt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;&lt;FONT color=#800000&gt;Wix&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;xmlns&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="http://schemas.microsoft.com/wix/2003/01/wi"&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;lt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;&lt;FONT color=#800000&gt;Product&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;Id&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="148E08FF-D7C4-46ed-8D4D-601C67FE0AFD"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;Language&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="1033"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;Name&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="MyProduct"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;Version&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="1.0.0"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;UpgradeCode&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="B7FE793A-800D-4c14-8CB4-B00AA84FF685"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;Manufacturer&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="Vagmi"&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;lt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;&lt;FONT color=#800000&gt;Package&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;Id&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="D1192FCD-BA01-4d8f-BA7B-663CE9934BDE"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;Compressed&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="yes"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;Description&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="My WIX Installation"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;InstallerVersion&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="200"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;Languages&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="1033"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;Manufacturer&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="Vagmi"/&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;lt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;&lt;FONT color=#800000&gt;Media&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;Cabinet&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="Data.cab"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;EmbedCab&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="yes"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;Id&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="1"/&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;lt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;&lt;FONT color=#800000&gt;Directory&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;Id&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="TARGETDIR"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;Name&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="SourceDir"&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;lt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;&lt;FONT color=#800000&gt;Directory&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;Id&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="ProgramFilesFolder"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;Name&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="PFiles"&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;lt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;&lt;FONT color=#800000&gt;Directory&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;Id&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="INSTALLDIR"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;Name&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="Vagmi"/&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;lt;/&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;&lt;FONT color=#800000&gt;Directory&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;lt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;&lt;FONT color=#800000&gt;Directory&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;Id&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="DesktopFolder"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;Name&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="DTFOLDER"/&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;lt;/&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;&lt;FONT color=#800000&gt;Directory&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;lt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;&lt;FONT color=#800000&gt;UI&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;lt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;&lt;FONT color=#800000&gt;InstallUISequence&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;lt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;&lt;FONT color=#800000&gt;Show&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;Dialog&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="SetupCompleteError"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;OnExit&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="error"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;/&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;lt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;&lt;FONT color=#800000&gt;Show&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;Dialog&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="SetupInterrupted"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;OnExit&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="cancel"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;/&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;lt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;&lt;FONT color=#800000&gt;Show&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;Dialog&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="SetupCompleteSuccess"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;OnExit&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="success"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;/&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;lt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;&lt;FONT color=#800000&gt;Show&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;Dialog&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="SetupInitialization"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;After&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="LaunchConditions"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;/&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;lt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;&lt;FONT color=#800000&gt;ResolveSource&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;Before&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="CostFinalize"&amp;gt;&amp;lt;![&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt;CDATA[Not Installed And Not PATCH]]&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;gt;&amp;lt;/&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;&lt;FONT color=#800000&gt;ResolveSource&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;lt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;&lt;FONT color=#800000&gt;Show&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;Dialog&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="InstallWelcome"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;After&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="MigrateFeatureStates"&amp;gt;&amp;lt;![&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt;CDATA[Not Installed And &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;(&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt;Not PATCH Or IS_MAJOR_UPGRADE&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;)]]&amp;gt;&amp;lt;/&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;&lt;FONT color=#800000&gt;Show&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;lt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;&lt;FONT color=#800000&gt;Show&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;Dialog&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="SetupResume"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;After&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="InstallWelcome"&amp;gt;&amp;lt;![&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt;CDATA[Installed And &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;(&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt;RESUME Or Preselected&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;)&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; And Not PATCH]]&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;gt;&amp;lt;/&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;&lt;FONT color=#800000&gt;Show&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;lt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;&lt;FONT color=#800000&gt;Show&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;Dialog&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="MaintenanceWelcome"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;After&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="SetupResume"&amp;gt;&amp;lt;![&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt;CDATA[Installed And Not RESUME And Not Preselected And Not PATCH]]&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;gt;&amp;lt;/&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;&lt;FONT color=#800000&gt;Show&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;lt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;&lt;FONT color=#800000&gt;Show&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;Dialog&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="SetupProgress"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;After&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="MaintenanceWelcome"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;/&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;lt;/&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;&lt;FONT color=#800000&gt;InstallUISequence&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;lt;/&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;&lt;FONT color=#800000&gt;UI&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;lt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;&lt;FONT color=#800000&gt;Feature&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;Id&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="TheOnlyFeature"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;ConfigurableDirectory&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="INSTALLDIR"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;Level&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="1"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;Title&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="TheOnlyFeature"&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;Description&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="TheOnlyFeature"&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;lt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;&lt;FONT color=#800000&gt;ComponentRef&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;Id&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="Notepad.exe"/&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;lt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;&lt;FONT color=#800000&gt;ComponentRef&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb3&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb4&gt;&lt;FONT color=#ff0000&gt;Id&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;="Calc.exe"/&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;lt;/&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;&lt;FONT color=#800000&gt;Feature&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp; &lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;lt;/&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;&lt;FONT color=#800000&gt;Product&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;lt;/&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;&lt;FONT color=#800000&gt;Wix&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&lt;FONT color=#0000ff&gt;&amp;gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/DIV&gt;&lt;!--EndFragment--&gt;&lt;/SPAN&gt;&lt;P&gt;&lt;SPAN class=cb1&gt;As you can clearly see, the complex job of creating an installer package is split among the developers. This is a great feature as it does away with Merge Modules and all the associated hassles with modularization. Further changes or corrections can be made independently without affecting other parts of the installation. The only part that needs automation is the generation of WXS fragments for the developers. Although it is a simple piece of code to write, we cannot expect all developers to be conversant with XML and learn the WIX toolset. All we&amp;nbsp;need is for them to specify the files and the destinations in a tool and a tool that should generate minimal WXS code for these fragments. I do not think that should be a problem considering the level of automation installation and build teams adopt for other tasks.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=cb1&gt;Building these is a straight forward task. &lt;/SPAN&gt;&lt;/P&gt;&lt;UL&gt;&lt;br /&gt;&lt;LI&gt;&lt;SPAN class=cb1&gt;Compile the files using the following command.&lt;BR&gt;candle dev1.wxs dev2.wxs dialogs.wxs myproduct.wxs&lt;BR&gt;&lt;BR&gt;This would produce dev1.wixobj, dev2.wixobj, dialogs.wixobj and myproduct.wixobj&lt;/SPAN&gt;&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;&lt;SPAN class=cb1&gt;You can then link the generated object files using light.&lt;BR&gt;light -out build/product.msi dev1.wixobj dev2.wixobj dialogs.wixobj myproduct.wixobj&lt;/SPAN&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;&lt;SPAN class=cb1&gt;The myproduct.msi file would be generated in a folder named 'build' under the current directory. &lt;/P&gt;&lt;/SPAN&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-110121723992324057?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/110121723992324057/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=110121723992324057' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/110121723992324057'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/110121723992324057'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2004/11/using-wix-toolset-for-distributed.html' title='Using WIX Toolset for Distributed Development'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-110111376888584073</id><published>2004-11-22T00:56:00.000-08:00</published><updated>2006-11-14T12:19:10.643-08:00</updated><title type='text'>WIX Tool</title><content type='html'>&lt;P&gt;I have become quite lazy off late. I caught up with the WIX chat only after &lt;A href="http://blogs.msdn.com/robmen"&gt;Rob&lt;/A&gt; posted the &lt;A href="http://blogs.msdn.com/robmen/archive/2004/11/20/267320.aspx"&gt;link&lt;/A&gt; on his blog. I was glad to find out that WIX was going to get integrated into Visual Studio.NET and there would be a MSBUILD task for WIX in Visual Studio .NET 2005. Very interesting indeed. Read the Windows Installer &lt;A href="http://msdn.microsoft.com/chats/transcripts/windows/windows_110904a.aspx"&gt;chat transcript&lt;/A&gt;&amp;nbsp;for more information.&lt;/P&gt;&lt;br /&gt;&lt;P&gt;There has been a lot of commotion in the wix-users list about a good tool that generates WIX code for us. It was really encouraging to find out that there are a lot of developers just like me who feel that it is important to have a WIX code gen tool at least for the painful UI parts. Also it would help us get the overall view of the Setup project. I would visualize the tool to be some sort of a modeler than a full blown tool like InstallShield. I would still like to edit the XML code by hand and use the tool only as a layer to automate the redundant tasks. This would of course save a lot of time for more interesting things for more important stuff. (Yes. Gaming does count as one of the important stuff.) &amp;lt;smile/&amp;gt;&lt;/P&gt;&lt;br /&gt;&lt;P&gt;I am no C# guru and I really have started learning C# and .NET only for the past 6 months. Yeah! I have been a little slack in joining the .NET bandwagon. I have started coding in C# for fun and I have started to play around with the WIX code right about now. I have been trying to serialize and de-serialize WIX objects into XML contents using the Serialize namespace. But reality is just dawning on me. XML Serialization support in the System.XML namespace is not up to the mark. At least not up to my expectation. I spend most of my code type checking stuff and writing my own wrapper classes to expose the public members as properties. As I said, I am no tools guru but I was hoping to get each of the WIX object into the property grid. This would ease out most of the work and present a decent WXS reader if not a tool to write WXS file. Gabor has started working on a C# based WIX Dialog editor. I cant wait to get its sources.&amp;nbsp;I am now looking for a&amp;nbsp;good free refactoring plug in for Visual Studio .NET 2003 to convert public variables into public properties. I thought of writing the addin myself but I really don't want to re-invent the wheel. But if I end up writing it, I promise to expose the code to the community. &amp;lt;smile/&amp;gt;&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-110111376888584073?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/110111376888584073/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=110111376888584073' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/110111376888584073'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/110111376888584073'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2004/11/wix-tool.html' title='WIX Tool'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-109948776143884760</id><published>2004-11-03T05:16:00.000-08:00</published><updated>2006-11-14T12:19:10.541-08:00</updated><title type='text'>Designing Good Setups</title><content type='html'>&lt;P&gt;I have been mulling over the essentials of designing good setups and I found that most of it boils down to the component rules and the way you identify the data that goes to the setup. Microsoft enforces a set of rules that you should follow while authoring components. So, if the components are well managed, your product is well managed to a certain extent. Once you have identified the "Resources" in the setup, you would have to segregate them into components. Resources are bits installed by the setup, which do not change during the lifetime of the application, unless changed by a better version of the product by means of an MSI operation (small update/ minor upgrade/ major upgrade). &lt;A href="http://blogs.msdn.com/robmen/"&gt;Rob&lt;/A&gt; has blogged about what &lt;A href="http://blogs.msdn.com/robmen/archive/2003/09/29/56470.aspx"&gt;setup is&lt;/A&gt; and explains Resources, Application Data and User Data in good detail. I have my own opinions on &lt;A href="http://installneo.blogspot.com/2004/10/handling-application-data.html"&gt;handling application data&lt;/A&gt;. User Data is never installed, managed or removed and hence does not bother us.&lt;/P&gt;&lt;br /&gt;&lt;P&gt;&lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/organizing_applications_into_components.asp"&gt;Components&lt;/A&gt; are logical group of resources like Files, Registry entries, COM information, ODBC Data, Shortcuts and so on. Component is considered the atomic unit of installation. This statement is quite misleading and I have queued up a blog for Windows Installer's wierd behaviors to deal with that &amp;lt;grin/&amp;gt;. &lt;/P&gt;&lt;br /&gt;&lt;UL&gt;&lt;br /&gt;&lt;LI&gt;As a rule of the thumb, you should place PE files (EXE, DLL, OCX and so on) individually in a component. Ensure that the key file that you select for a component is versioned. If the developer has not versioned the file, let him know that versioning a PE is very important to have a &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/default_file_versioning.asp"&gt;reliable upgrade&lt;/A&gt;. There are certain situations in which the setup developer has to assert his/her position to ensure the quality of the software shipped. After all if the installation fails, the customers would have no chance to further evaluate or use the product. If you have non-versioned resources that need to be upgraded, ensure that they are made companions to the key file of the component. This would ensure that the versioning logic for the component is consistent.&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;Never remove a resource or add a resouce to the component. If you have a file in the component, the only thing you can do is to bump up the file version or change the contents of the file itself. You can never add a file or remove a file from a component. This would result in incorrect reference counting and might prematurely remove resouces from the system or leave resource behind during uninstallation.&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;You cannot include resources going to multiple locations in the same component. Also you cannot change the destination of the component once declared. You would have to ensure that once the component design has been finialized, its destination's position in the directory product tree structure does not change. &lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;If you have same file, especially a key file included in two different components that go to the same destination directory (e.g., 32 bit and 64 bit files or different language versions) ensure that these components are mutually exclusive by setting appropriate conditions on the components.&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;Component code and name of the component must be the same.&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;Make sure that there is only one COM server per component. Also ensure that the component is not linked to multiple features and is linked only to a single feature.&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;Ensure that shortcuts are included in the same component that&amp;nbsp;has the file. Thus, the shortcuts are installed only when the file is installed. This might seem&amp;nbsp;very elementary but people from other installation worlds like InstallScript, find this particularly hard to digest.&amp;nbsp;&lt;/LI&gt;&lt;/UL&gt;&lt;br /&gt;&lt;P&gt;Microsoft has also included a nice little article on things that could happen &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/what_happens_if_the_component_rules_are_broken.asp"&gt;when component rules are broken&lt;/A&gt; in the Platform SDK.&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-109948776143884760?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/109948776143884760/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=109948776143884760' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/109948776143884760'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/109948776143884760'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2004/11/designing-good-setups.html' title='Designing Good Setups'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-109905259101067690</id><published>2004-10-29T05:22:00.000-07:00</published><updated>2006-11-14T12:19:10.386-08:00</updated><title type='text'>WIX features</title><content type='html'>After my recent cribbing about my wish-list for WIX, it is only fair that I talk about the advantages of &lt;a href="http:\\wix.sourceforge.net"&gt;WIX&lt;/a&gt; over other tools like InstallShield. I am primarily comparing it with InstallShield, as it is the only tool that I am aware of to an extent and is also the current market leader (in my opinion) in the installation tools market place.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1) XML Format:&lt;/b&gt; &lt;a href="http:\\wix.sourceforge.net"&gt;WIX&lt;/a&gt; source files are in a programmer friendly format. You are allowed to comment the code at any place, that makes the installation project source files as readable as the application's source files. Tools like &lt;a href="http://www.installshield.com/products/x"&gt;InstallShield X&lt;/a&gt; allow you to save your file in the XML format but editing the XML and adding comments to it is not really easy. Furthermore, the changes in the source code across versions can be easily tracked by diffing from the source control, which would be very inconvenient with binary files.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2) Distributed Development: &lt;/b&gt;Each setup developer or even the application developer can edit a small fragment of the project to produce multiple WXS files which can be compiled independently and linked in the final process to produce MSI/MSM files. To my knowledge, this feature is currently available only with WIX. Of course, you could use other tools to create Merge Modules, but they would only add to the confusion with the modularization of the columns than to aid the process of distributed development. You can use &lt;a href="http:\\wix.sourceforge.net"&gt;WIX&lt;/a&gt; to maintain the readability of code. You could include comments within the code to actually point to the WXS file from which the element is referenced.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3) Clean Installation:&lt;/b&gt; You do not have to go through a whole big deal of the installation process just to get the package authoring system available on the build and the design environments. The &lt;a href="http:\\wix.sourceforge.net"&gt;WIX&lt;/a&gt; package decompressed is only 3.56 MB including the documentation and comes completely with custom actions to work with IIS, SQL Server, hypercharged LockPermissions functionality and much more. There are no DLLs to be registered, no registry entries to be created. Just unzip it into a machine with .NET Framework 1.1 installed and &lt;a href="http:\\wix.sourceforge.net"&gt;WIX&lt;/a&gt; would run without any problems. You would need Platform SDK on the machine to work with merge modules. Or at least the mergemod.dll registered on the build machine.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;4) Custom Action Library:&lt;/b&gt; &lt;a href="http:\\wix.sourceforge.net"&gt;WIX&lt;/a&gt; comes with a custom action library to install/configure IIS websites and virtual directories. It is also present in InstallShield. &lt;a href="http:\\wix.sourceforge.net"&gt;WIX&lt;/a&gt; has support for SQL Server 2000 which is also present in &lt;a href="http://www.installshield.com"&gt;InstallShield&lt;/a&gt; X. So I guess that levels the playing field. What &lt;a href="http:\\wix.sourceforge.net"&gt;WIX&lt;/a&gt; currently does not have is the support for installing COM+ Applications. But people following the Wix-Users list would know that these are already been worked upon and there have been a couple of users who have implemented the code and are currently contributing it back to the community.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-109905259101067690?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/109905259101067690/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=109905259101067690' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/109905259101067690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/109905259101067690'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2004/10/wix-features.html' title='WIX features'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-109902008988579610</id><published>2004-10-28T20:18:00.000-07:00</published><updated>2006-11-14T12:19:10.238-08:00</updated><title type='text'>What does WIX need?</title><content type='html'>After a long time, I have got some time to get to my blog. After a long day of presentations, I guess it is only fair enough that I relax by concentrating sometime on my long forgotten blog. We in our organization primarily use InstallShield for most of our setup development needs. I and one of my colleagues were discussing the topic of distributed development. InstallShield is good in a lot of things but distributed development is not one of them.&lt;br /&gt;&lt;br /&gt;As a common sense approach, distributed development is done using merge modules. Although these may be discrete chunk of non reusable installation units, merge modules are the only way to enable Distributed development with InstallShield. I then truly realized the power of &lt;a href="http://wix.sourceforge.net"&gt;WIX&lt;/a&gt; which inherently supports distributed development. I then mentally started preparing a list of features that &lt;a href="http://wix.sourceforge.net"&gt;WIX&lt;/a&gt; ought to have to replace tools like InstallShield.&lt;br /&gt;&lt;br /&gt;1) &lt;b&gt;GUI&lt;/b&gt; - I guess WIXStudio need to be pushed a little harder. I personally do not believe that a development tool such as &lt;a href="http://wix.sourceforge.net"&gt;WIX&lt;/a&gt; really needs a GUI. But if the world were to run only on my beliefs, it would be a far better place than it is right now &lt;grin/&gt;.  &lt;a href="http://wix.sourceforge.net"&gt;WIX&lt;/a&gt; language is pretty straight forward and the tool nudges the developers on to the right track. Where the tool fails to point to the right direction, &lt;a href="http://sourceforge.net/mail/?group_id=105970"&gt;wix-users list&lt;/a&gt; does the job.&lt;br /&gt;&lt;br /&gt;2) &lt;b&gt;Bells and Whistles&lt;/b&gt; - Tallow is a cool tool but is unfortunately very buggy. As Rob suggested it is a fertile field for development and is constantly improving. I have seen some pretty encouraging messages in the Users list. I still have not become a part of the dev-list as yet, as I really cannot contribute at this point in time. I would however like to do so as soon as I have access to my computer at home. &lt;br /&gt;&lt;br /&gt;3) &lt;b&gt;Dialogs&lt;/b&gt; - It would be great to have a dialog editor. If not a full blown IDE for WIX, the least setup developers expect would be to have a dialog editor. &lt;a href="http://blogs.msdn.com/robmen"&gt;Rob&lt;/a&gt; would argue that setup need not have a user interface, but in reality, dialogs are required for a enterprise setup of a decent quality. I have posted a message on WIX-Users-list for a list of free/open source MSI editors with visual Dialog editors. We could then dark the setup and create a WXS fragment.&lt;br /&gt;&lt;br /&gt;4) &lt;b&gt;Documentation&lt;/b&gt; – Last but not the least, &lt;a href="http://wix.sourceforge.net"&gt;WIX&lt;/a&gt; really needs a lot more documentation. I have been really busy off-late and have not been able to contribute as much to &lt;a href="http://wix.sourceforge.net"&gt;WIX&lt;/a&gt; as before. I hope the &lt;a href="http://wix.sourceforge.net/wiki"&gt;WIX Wiki&lt;/a&gt; would grow to fill this need.&lt;br /&gt;&lt;br /&gt;IMHO, WIX is still the best tool to create installations for large projects.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-109902008988579610?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/109902008988579610/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=109902008988579610' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/109902008988579610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/109902008988579610'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2004/10/what-does-wix-need.html' title='What does WIX need?'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-109783769709898627</id><published>2004-10-15T03:52:00.000-07:00</published><updated>2006-11-14T12:19:10.141-08:00</updated><title type='text'>Good Bye!</title><content type='html'>Imagine a blog entry where I talk about my last day in my organization. Incidentally &lt;a href="http://blogs.msdn.com/robmen"&gt;Rob&lt;/a&gt; &lt;a href="http://blogs.msdn.com/robmen/archive/2004/10/15/242655.aspx"&gt;is moving&lt;/a&gt; to the Longhorn Windows Setup team. &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-109783769709898627?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://vaags.blogspot.com/2004/10/good-bye.html' title='Good Bye!'/><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/109783769709898627/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=109783769709898627' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/109783769709898627'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/109783769709898627'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2004/10/good-bye.html' title='Good Bye!'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-109722599089021136</id><published>2004-10-08T01:47:00.000-07:00</published><updated>2006-11-14T12:19:10.029-08:00</updated><title type='text'>Riko's Blog Entry on "Resources and Data"</title><content type='html'>Imagine a blog entry where Riko speaks on the Resources, User Data and Application Data. As noted in his blog, he is yet to make his point. &lt;smile/&gt; It is an excellent blog entry. Also read Rob's entry on what &lt;a href="http://blogs.msdn.com/robmen/archive/2003/09/29/56470.aspx"&gt;setup is&lt;/a&gt;. There are a couple of links to the same entry in Riko's article too.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-109722599089021136?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://setupstories.blogspot.com/2004/10/resources-and-data.html' title='Riko&apos;s Blog Entry on &quot;Resources and Data&quot;'/><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/109722599089021136/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=109722599089021136' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/109722599089021136'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/109722599089021136'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2004/10/rikos-blog-entry-on-resources-and-data.html' title='Riko&apos;s Blog Entry on &quot;Resources and Data&quot;'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-109713304813932028</id><published>2004-10-07T01:06:00.000-07:00</published><updated>2006-11-14T12:19:09.916-08:00</updated><title type='text'>Handling Application Data</title><content type='html'>Recently, I had initiated a thread in the WIX users list regarding the inclusion of application data in the MSI package. My thanks to Riko, who shared his views on that. It has always been tricky and will continue to be a tricky situation to deal with application data. Most applications include their application runtime and configuration data as registry entries, INI or XML files. An unassuming developer might package these registry entries with the Main application's component, as they are dependent on the main application. This would work fine during the first install, but would cause significant issues during an upgrade. &lt;a href="http://www.pduck.com/aboutme.htm"&gt;Geoff&lt;/a&gt; has blogged one &lt;a href="http://www.pduck.com/2004/08/stop-overwriting-my-registry-entries.html"&gt;such scenario&lt;/a&gt;. This blog tries to capture some of my thoughts regarding such Application Data. &lt;br /&gt;&lt;br /&gt;For starters, lets look at what happens when you include the application data in the MSI package. The user, to configure the software the way they want, usually modifies these entries. Many times, it is the application itself that changes or writes data to the registry, INI or XML files to persist the configuration state of the application. Assuming we have included such files and registry entries grouped in the same component as the main executable. We can argue that it would be a good design as these entries are logically bound to the application and have no sense existing as a standalone unit. The application would roll out pretty smooth and will have no problems until you hit a point when you have to upgrade. Let us consider a minor upgrade, no major changes, a few DLLs modified and couple of executables added. Let main executable file have its version bumped. As the executable is the key file of the component, it qualifies for an upgrade. Let us also consider changes made to the XML files and a few Registry entries to accommodate the change. During an upgrade, all hell would break loose. The registry would be overwritten and the registry might be left with conflicting entries and some XML files would updated, the others may be left untouched as it would have a greater modified date. If you are really unlucky, the testing team might not quite get the tests done right. The Result: &lt;b&gt;Total Chaos&lt;/b&gt;. &lt;br /&gt;&lt;br /&gt;So how should these things be handled? The answer to this question is not straightforward and seems to be pretty tricky. The most ideal scenario would be to let the application handle its own configuration. The application should be able to create these registry entries and XML files during the first run. The setup developer then has to merely author the RemoveFile and RemoveReigstry tables to get the files out during uninstallation. As far as XML handling is concerned, it is best left to the application to handle it. MSI does not support XML handling and we need robust custom actions to do it for us. Handling XML data/SQL Data during upgrades can only be done using custom code. It would be desirable if this code is present on the application's end and not on the installer's end. If you do have to include the application data in the MSI package, the following guidelines may be useful.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1) Identify and Isolate the Application Data:&lt;/b&gt;&lt;br /&gt;Clearly identify the resources like registry entries, INI Files and other configuration files that are to be used by the application. Use the INIFile table to author INI Files. Avoid including the INI file itself in the File table. Once identified, include the application data in a separate component. Use multiple components, if necessary.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2) Minor Upgrade and Uninstall Scenario:&lt;/b&gt;&lt;br /&gt;If the application creates extra files or registry entries, ensure that the &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/removefile_table.asp"&gt;RemoveFile&lt;/a&gt; and the &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/removeregistry_table.asp"&gt;RemoveRegistry&lt;/a&gt; tables are populated. The problem is that these tables are referred to even during installation of the component. So you would have to set the &lt;b&gt;Never Overwrite bit&lt;/b&gt; of the &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/component_table.asp"&gt;component&lt;/a&gt; to make sure that this component is never marked for an upgrade. Code the upgrade logic for the application data in to the application itself. In the unlikely event of it not being feasible, write custom actions to achieve the same. Avoid writing custom actions for tasks that can be handled by the application. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;3) Major Upgrade Scenario:&lt;/b&gt;&lt;br /&gt;Certain applications like InstallShield X, schedule the &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/removeexistingproducts_action.asp"&gt;RemoveExistingProducts action&lt;/a&gt; right before the InstallInitialize action. This is not the most efficient placement for this action. The most efficient placement for this action would be after the InstallFinalize action. I will talk about this in detail another time, if you haven't figured it out as yet. If the authoring tool places the RemoveExistingProducts action before InstallInitialize, manually schedule it after InstallFinalize. There are certain custom actions in InstallShield X (I guess Component Services) that are not very happy with this placement, although I am not very sure about this. In these cases, you would have to use related locator (AppSearch, RegLocator, IniLocator, etc.,) and signature tables to get save the information into properties and reuse them in the install. This is a very elaborate and time-consuming exercise. The shorter and a devilish way to get around this is to write custom actions to read the values in the registry and store them in a text file, back up your application data files and restore them back with another set of custom actions. As unscientific as it might sound, a lot of people have used it to get out of this mess. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/robmen"&gt;Rob&lt;/a&gt; is currently working on a similar blog entry. I can't wait to read on what he has to say about this.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-109713304813932028?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/109713304813932028/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=109713304813932028' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/109713304813932028'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/109713304813932028'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2004/10/handling-application-data.html' title='Handling Application Data'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-109688111997039026</id><published>2004-10-04T02:06:00.000-07:00</published><updated>2006-11-14T12:19:09.806-08:00</updated><title type='text'>Designing Upgrades - Part I</title><content type='html'>The previous week had been really busy. With five new recruits on board, I was asked to give them a quick introduction to InstallShield X and Windows Installer. It was broken up into 5 sessions, 3 hours each. And of course, I had my routine to take care of. So, after all this hard work, I decided to pamper myself with a movie the weekend. Before that I have decided to write something about designing upgrades with Windows Installer and WIX. I have split this article into two for easy consumption.&lt;br /&gt;&lt;br /&gt;Designing upgrades are fairly basic and I have seen a lot of people in the forum having a little trouble getting started with the upgrades. But once they understand the concept of upgrades from the Windows Installer's perspective, it becomes a cakewalk. So, for starters, let me just talk about the different types of upgrades that you can perform with Windows Installer and implement the same using WIX. This article is designed only to be a quick start guide and is no means a complete guide for an upgrade. If you want to know more about upgrades, read the &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/patching_and_upgrades.asp"&gt;Upgrades and Patching&lt;/a&gt; section of the Windows Installer SDK documentation.&lt;br /&gt;&lt;br /&gt;Windows Installer keeps track of products and packages using GUIDs. There are three important GUIDs that you need to know to understand upgrades.&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/productcode_property.asp"&gt;ProductCode&lt;/a&gt; - This uniquely identifies a product. This value is written to the Property table under the name ProductCode.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/upgradecode_property.asp"&gt;UpgradeCode&lt;/a&gt; - This GUID is used to logically bind related products. This value is written to the Property table under the name UpgradeCode.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/revision_number_summary_property.asp"&gt;Package Code&lt;/a&gt; - This uniquely identifies a package. Almost any change in the MSI package, mandates a new Package GUID. This value is written to the summary information sream under the name of 'Revision Number'.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;And then there is the &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/productversion_property.asp"&gt;ProductVersion property&lt;/a&gt;, which specifies the version of the product. Windows Installer recognizes three types of upgrades. In all these upgrades, the package code will always change.&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;When the upgrade just changes the application files but does not change the Product Code or the Product version, it is termed as a &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/small_updates.asp"&gt;small update&lt;/a&gt;. &lt;/li&gt;&lt;br /&gt;&lt;li&gt;When the upgrade changes only the ProductVersion but does not change the ProductCode, it is termed as a &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/minor_upgrades.asp"&gt;minor upgrade&lt;/a&gt;.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;When both the ProductCode and ProductVersion changes, it is termed as a &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/major_upgrades.asp"&gt;Major Upgrade&lt;/a&gt;.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;The small update and the minor upgrade can be installed over the existing installation. Usually, they only make changes to the parts of applications that have been changed. There are usually no major design changes to the product tree, excepting a few additions and modifications.&lt;br /&gt;&lt;br /&gt;The major upgrade however, installs a completely new product and uninstalls the existing version of the product(s). Minor upgrade and small update can be targetted only at a particular product but Major upgrades can target more than one product. Major upgrade usually would have major changes made to the product tree. There might be situations that you might have to &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/changing_the_product_code.asp"&gt;change the product code&lt;/a&gt;. In those cases, you would have no other choice but to perform a major upgrade.&lt;br /&gt;&lt;br /&gt;So, as long as you do not have to change the product code, you can perform a small update or a minor upgrade. Minor upgrade would allow you to track the upgrade applied by looking at the ProductVersion. You can apply a minor upgrade or small update using the following command line.&lt;br /&gt;&lt;br /&gt;msiexec.exe /i &lt;Path_To_MSIFile.msi&gt; REINSTALL=ALL REINSTALLMODE=vomus&lt;br /&gt;&lt;br /&gt;The value of the &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/reinstall_property.asp"&gt;REINSTALL property&lt;/a&gt; is a list of features delimited by commas that are to be reinstalled. The features listed must be present in the Feature column of the Feature table. The &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/reinstallmode_property.asp"&gt;REINSTALLMODE property&lt;/a&gt; is a string containing letters specifying the type of reinstall to perform. Options are case-insensitive and order-independent. This property should normally always be used in conjunction with the REINSTALL property. However, this property can also be used during installation, not just reinstall. &lt;br /&gt;&lt;br /&gt;To design a major upgrade, you would have to author the &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/upgrade_table.asp"&gt;Upgrade table&lt;/a&gt;. The upgrade table allows you to filter products and subsequently features based on the UpgradeCode, ProductVersion and Language. The Remove column of the upgrade table can be used to specify the list of features to be removed. Windows Installer will remove all the features, if the column is null. The ActionProperty column can be used to specify the name of a property. For the major upgrade to work, you need to have &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/findrelatedproducts_action.asp"&gt;FindRelatedProductsAction&lt;/a&gt; and  &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/removeexistingproducts_action.asp"&gt;RemoveExistingProducts action&lt;/a&gt; in the &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/installexecutesequence_table.asp"&gt;InstallExecuteSequence table&lt;/a&gt;.  The FindRelatedProducts action reads the settings in the upgrade table and stores the matching ProductCode(s) in the property specified by the ActionProperty column of the Upgrade Table. The RemoveExistingProducts action removes the product during installation. The most efficient placement for the RemoveExistingProducts action is after the InstallFinalize action. However, tools like InstallShield X, sequence this action in between InstallValidate and InstallInitialize actions.&lt;br /&gt;&lt;br /&gt;To be continued...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-109688111997039026?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/109688111997039026/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=109688111997039026' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/109688111997039026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/109688111997039026'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2004/10/designing-upgrades-part-i.html' title='Designing Upgrades - Part I'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-109621364400366884</id><published>2004-09-26T08:42:00.000-07:00</published><updated>2006-11-14T12:19:09.715-08:00</updated><title type='text'>Installing Windows Services (Created with .NET) with WIX</title><content type='html'>This is a pretty obscure topic and there is not enough literature on this. Installing a .NET Service is a fairly simple task. The Visual Studio.NET interface allows you to add the System.Configuration.Installer class to your assembly that enables managed installations. Developers often test their services by using the installutil.exe command line tool. But this tool is not the most appropriate for packaging as it shows an ugly command window during installation, which no setup developer would desire. Microsoft, includes a DLL named installutillib.dll with a single MSI entry point function named ManagedInstall. This function can be called via a MSI custom action to handle the four overridable functions exposed by the Installer Class. I am an InstallShield X user and installing .NET service is as easy as setting a property for the component from the IDE. I was a little lost when I wanted to achieve the same with WIX. Although, I knew that I could create these custom actions myself, I was hunting for a way by which I could do it in an easier fashion with WIX. After hours of searching the WiX.chm file, I decided to get on with it myself. I still am not sure if its hidden somewhere in the Wix.chm file.&lt;br /&gt;&lt;br /&gt;I was a little skeptical about this and hence started of with an empty .NET enabled Windows Service that does nothing. I added the Installer class to the service and built it. I was too lazy to change the name. So my service was just called Service1 as christened by VS.NET 2003. Once we have our service executable ready, we have to create a little configuration file in XML that specifies the supported frameworks. I called it the IUConfig.XML For people wondering what IU stands for, it is short for InstallUtil &amp;lt;smile/&amp;gt;. The file is fairly simple and it goes something like this.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&amp;lt;?xml version="1.0"?&amp;gt;&lt;br /&gt;&amp;lt;configuration&amp;gt;&lt;br /&gt;  &amp;lt;startup&amp;gt;&lt;br /&gt;    &amp;lt;supportedRuntime version="v1.1.4322"/&amp;gt;&lt;br /&gt;  &amp;lt;/startup&amp;gt;&lt;br /&gt;&amp;lt;/configuration&amp;gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I put my InstallUtilLib.dll, FirstWindowsService.exe (My Windows Service) and IUConfig.xml in a folder called src. You can find the InstallUtilLib.dll in your [WindowsFolder]\Microsoft.NET\Framework\v1.1.4322\ directory. Once you have these three files, its time to start coding the WXS file. Again, just for the sake of simplicity, I am going to install only this service and nothing else. So here is my WXS file. As you can see it is not much. It has only a feature with one component, containing the service executable and the iuconfig.xml file. I have added the InstallUtilLib.dll as a binary.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&amp;lt;?xml version='1.0'?&amp;gt;&lt;br /&gt;&amp;lt;Wix xmlns='http://schemas.microsoft.com/wix/2003/01/wi'&amp;gt;&lt;br /&gt;&amp;lt;Product Id='F47A6F48-86C1-47A8-B404-35656C908BEB' Name='DotNetService' Language='1033' Version='1.0.0.0' Manufacturer='Vagmi' UpgradeCode='5BDA92CF-5D2B-4638-8550-4B8BE5BA8F24'&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;Package Id='????????-????-????-????-????????????' Description='Dot Net Service' Comments='Creating a .NET service' Manufacturer='Vagmi' InstallerVersion='200' Compressed='yes'/&amp;gt;&lt;br /&gt;  &amp;lt;Media Id='1' Cabinet='dotnet.cab' EmbedCab='yes' /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;Directory Id='TARGETDIR' Name='SourceDir'&amp;gt;&lt;br /&gt;  &amp;lt;Directory Id='ProgramFilesFolder' Name='PFiles'&amp;gt;&lt;br /&gt;    &amp;lt;Directory Id='DOTNETSERVICE' Name='DotNet' LongName='DotNetService'&amp;gt;&lt;br /&gt;      &amp;lt;Component Id='TheService' Guid='FF15180D-B296-4F30-9385-0F15B8ACC1FF'&amp;gt;&lt;br /&gt;        &amp;lt;File Id='WindowsService' Name='Firstw~1.exe' LongName='FirstWindowsService.exe' KeyPath='yes' DiskId='1' src='src\FirstWindowsService.exe' /&amp;gt;&lt;br /&gt;	&amp;lt;File Id='ConfigFile' Name='IuConfig.xml' LongName='IuConfig.xml' DiskId='1' src='src\IuConfig.xml' CompanionFile='WindowsService'/&amp;gt;&lt;br /&gt;      &amp;lt;/Component&amp;gt;&lt;br /&gt;    &amp;lt;/Directory&amp;gt;&lt;br /&gt;  &amp;lt;/Directory&amp;gt;&lt;br /&gt;&amp;lt;/Directory&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;Feature Id='TheOnlyFeature' Description='Feature contains the single component' Level='1'&amp;gt;&lt;br /&gt;&amp;lt;ComponentRef Id='TheService'/&amp;gt;&lt;br /&gt;&amp;lt;/Feature&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- Including the InstallUtilLib.dll. This file does all the magic of installing the services. --&amp;gt;&lt;br /&gt;&amp;lt;Binary Id='InstallUtil' src='src\InstallUtilLib.dll' /&amp;gt;&lt;br /&gt;&amp;lt;/Product&amp;gt;&lt;br /&gt;&amp;lt;/Wix&amp;gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;To perform a managed install of the service, we need four custom actions - two deferred custom actions for installing and uninstalling, one commit custom action and one rollback custom action. As these custom actions execute in the higher security context, we need to pass data to these custom actions using four separate 'Set Property (Type 51)' custom actions. The ManagedInstall function expects the following parameters. The exact functionality of the parameters is still a mystery to me and I have to yet reasearch on it. But for now, we would take this for granted.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;/installtype=notransaction /action=(install/uninstall/commit/rollback) /LogFile= "PathTo\Assembly" "PathTo\iuconfig.xml"&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;So the code for custom actions would look something like this.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&amp;lt;CustomAction Id='InstallServiceSetProp' Property='InstallService' Value='/installtype=notransaction /action=install /LogFile= "[#WindowsService]" "[DOTNETSERVICE]iuconfig.xml"'/&amp;gt;&lt;br /&gt;&amp;lt;CustomAction Id='InstallService' BinaryKey='InstallUtil' DllEntry='ManagedInstall' Execute='deferred' /&amp;gt;&lt;br /&gt;&amp;lt;CustomAction Id='UnInstallServiceSetProp' Property='UnInstallService' Value='/installtype=notransaction /action=uninstall /LogFile= "[#WindowsService]" "[DOTNETSERVICE]iuconfig.xml"'/&amp;gt;&lt;br /&gt;&amp;lt;CustomAction Id='UnInstallService' BinaryKey='InstallUtil' DllEntry='ManagedInstall' Execute='deferred' /&amp;gt;&lt;br /&gt;&amp;lt;CustomAction Id='CommitServiceSetProp' Property='CommitService' Value='/installtype=notransaction /action=commit /LogFile= "[#WindowsService]" "[DOTNETSERVICE]iuconfig.xml"'/&amp;gt;&lt;br /&gt;&amp;lt;CustomAction Id='CommitService' BinaryKey='InstallUtil' DllEntry='ManagedInstall' Execute='commit' /&amp;gt;&lt;br /&gt;&amp;lt;CustomAction Id='RollbackServiceSetProp' Property='RollbackService' Value='/installtype=notransaction /action=rollback /LogFile= "[#WindowsService]" "[DOTNETSERVICE]iuconfig.xml"'/&amp;gt;&lt;br /&gt;&amp;lt;CustomAction Id='RollbackService' BinaryKey='InstallUtil' DllEntry='ManagedInstall' Execute='rollback' /&amp;gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;You would not have to sequence these custom actions such that the uninstall custom actions run before the RemoveFiles action, and install, rollback &amp; commit custom actions are scheduled after the InstallFiles action in the same order. So your &amp;lt;InstallExecuteSequence&amp;gt; would look something like this. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;&amp;lt;InstallExecuteSequence&amp;gt;&lt;br /&gt;&amp;lt;Custom Action='UnInstallServiceSetProp' After='MsiUnpublishAssemblies'&amp;gt;$TheService=2&amp;lt;/Custom&amp;gt;&lt;br /&gt;&amp;lt;Custom Action='UnInstallService' After='UnInstallServiceSetProp'&amp;gt;$TheService=2&amp;lt;/Custom&amp;gt;&lt;br /&gt;&amp;lt;Custom Action='InstallServiceSetProp' After='StartServices'&amp;gt;$TheService&amp;gt;2&amp;lt;/Custom&amp;gt;&lt;br /&gt;&amp;lt;Custom Action='InstallService' After='InstallServiceSetProp'&amp;gt;$TheService&amp;gt;2&amp;lt;/Custom&amp;gt;&lt;br /&gt;&amp;lt;Custom Action='RollbackServiceSetProp' After='InstallService'&amp;gt;$TheService&amp;gt;2&amp;lt;/Custom&amp;gt;&lt;br /&gt;&amp;lt;Custom Action='RollbackService' After='RollbackServiceSetProp'&amp;gt;$TheService&amp;gt;2&amp;lt;/Custom&amp;gt;&lt;br /&gt;&amp;lt;Custom Action='CommitServiceSetProp' After='RollbackService'&amp;gt;$TheService&amp;gt;2&amp;lt;/Custom&amp;gt;&lt;br /&gt;&amp;lt;Custom Action='CommitService' After='CommitServiceSetProp'&amp;gt;$TheService&amp;gt;2&amp;lt;/Custom&amp;gt;&lt;br /&gt;&amp;lt;/InstallExecuteSequence&amp;gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Putting all this together, we would have a file like this.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&amp;lt;?xml version='1.0'?&amp;gt;&lt;br /&gt;&amp;lt;Wix xmlns='http://schemas.microsoft.com/wix/2003/01/wi'&amp;gt;&lt;br /&gt;&amp;lt;Product Id='F47A6F48-86C1-47A8-B404-35656C908BEB' Name='DotNetService' Language='1033' Version='1.0.0.0' Manufacturer='Vagmi' UpgradeCode='5BDA92CF-5D2B-4638-8550-4B8BE5BA8F24'&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;Package Id='????????-????-????-????-????????????' Description='Dot Net Service' Comments='Creating a .NET service' Manufacturer='Vagmi' InstallerVersion='200' Compressed='yes'/&amp;gt;&lt;br /&gt;  &amp;lt;Media Id='1' Cabinet='dotnet.cab' EmbedCab='yes' /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;Directory Id='TARGETDIR' Name='SourceDir'&amp;gt;&lt;br /&gt;  &amp;lt;Directory Id='ProgramFilesFolder' Name='PFiles'&amp;gt;&lt;br /&gt;    &amp;lt;Directory Id='DOTNETSERVICE' Name='DotNet' LongName='DotNetService'&amp;gt;&lt;br /&gt;      &amp;lt;Component Id='TheService' Guid='FF15180D-B296-4F30-9385-0F15B8ACC1FF'&amp;gt;&lt;br /&gt;        &amp;lt;File Id='WindowsService' Name='Firstw~1.exe' LongName='FirstWindowsService.exe' KeyPath='yes' DiskId='1' src='src\FirstWindowsService.exe' /&amp;gt;&lt;br /&gt;	&amp;lt;File Id='ConfigFile' Name='IuConfig.xml' LongName='IuConfig.xml' DiskId='1' src='src\IuConfig.xml' CompanionFile='WindowsService'/&amp;gt;&lt;br /&gt;      &amp;lt;/Component&amp;gt;&lt;br /&gt;    &amp;lt;/Directory&amp;gt;&lt;br /&gt;  &amp;lt;/Directory&amp;gt;&lt;br /&gt;&amp;lt;/Directory&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;Feature Id='TheOnlyFeature' Description='Feature contains the single component' Level='1'&amp;gt;&lt;br /&gt;&amp;lt;ComponentRef Id='TheService'/&amp;gt;&lt;br /&gt;&amp;lt;/Feature&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- Including the InstallUtilLib.dll. This file does all the magic of installing the services. --&amp;gt;&lt;br /&gt;&amp;lt;Binary Id='InstallUtil' src='src\InstallUtilLib.dll' /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!--Write custom actions to install, uninstall, commit and rollback the changes--&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;CustomAction Id='InstallServiceSetProp' Property='InstallService' Value='/installtype=notransaction /action=install /LogFile= "[#WindowsService]" "[DOTNETSERVICE]iuconfig.xml"'/&amp;gt;&lt;br /&gt;&amp;lt;CustomAction Id='InstallService' BinaryKey='InstallUtil' DllEntry='ManagedInstall' Execute='deferred' /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;CustomAction Id='UnInstallServiceSetProp' Property='UnInstallService' Value='/installtype=notransaction /action=uninstall /LogFile= "[#WindowsService]" "[DOTNETSERVICE]iuconfig.xml"'/&amp;gt;&lt;br /&gt;&amp;lt;CustomAction Id='UnInstallService' BinaryKey='InstallUtil' DllEntry='ManagedInstall' Execute='deferred' /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;CustomAction Id='CommitServiceSetProp' Property='CommitService' Value='/installtype=notransaction /action=commit /LogFile= "[#WindowsService]" "[DOTNETSERVICE]iuconfig.xml"'/&amp;gt;&lt;br /&gt;&amp;lt;CustomAction Id='CommitService' BinaryKey='InstallUtil' DllEntry='ManagedInstall' Execute='commit' /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;CustomAction Id='RollbackServiceSetProp' Property='RollbackService' Value='/installtype=notransaction /action=rollback /LogFile= "[#WindowsService]" "[DOTNETSERVICE]iuconfig.xml"'/&amp;gt;&lt;br /&gt;&amp;lt;CustomAction Id='RollbackService' BinaryKey='InstallUtil' DllEntry='ManagedInstall' Execute='rollback' /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- Now to sequence these CAs in the execute sequence --&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;InstallExecuteSequence&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;Custom Action='UnInstallServiceSetProp' After='MsiUnpublishAssemblies'&amp;gt;$TheService=2&amp;lt;/Custom&amp;gt;&lt;br /&gt;&amp;lt;Custom Action='UnInstallService' After='UnInstallServiceSetProp'&amp;gt;$TheService=2&amp;lt;/Custom&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;Custom Action='InstallServiceSetProp' After='StartServices'&amp;gt;$TheService&amp;gt;2&amp;lt;/Custom&amp;gt;&lt;br /&gt;&amp;lt;Custom Action='InstallService' After='InstallServiceSetProp'&amp;gt;$TheService&amp;gt;2&amp;lt;/Custom&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;Custom Action='RollbackServiceSetProp' After='InstallService'&amp;gt;$TheService&amp;gt;2&amp;lt;/Custom&amp;gt;&lt;br /&gt;&amp;lt;Custom Action='RollbackService' After='RollbackServiceSetProp'&amp;gt;$TheService&amp;gt;2&amp;lt;/Custom&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;Custom Action='CommitServiceSetProp' After='RollbackService'&amp;gt;$TheService&amp;gt;2&amp;lt;/Custom&amp;gt;&lt;br /&gt;&amp;lt;Custom Action='CommitService' After='CommitServiceSetProp'&amp;gt;$TheService&amp;gt;2&amp;lt;/Custom&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/InstallExecuteSequence&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!--Now we're done--&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/Product&amp;gt;&lt;br /&gt;&amp;lt;/Wix&amp;gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Despite all my skepticism, the above code ran perfectly fine. Now, I have to work on the real services. Hope you find this useful.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-109621364400366884?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/109621364400366884/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=109621364400366884' title='15 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/109621364400366884'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/109621364400366884'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2004/09/installing-windows-services-created.html' title='Installing Windows Services (Created with .NET) with WIX'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-109612816862467880</id><published>2004-09-25T09:00:00.000-07:00</published><updated>2006-11-14T12:19:09.645-08:00</updated><title type='text'>To Nest or To Chain or To Merge</title><content type='html'>This blog entry is for relatively novice setup developers and not for the die-hard Windows Installer gurus. Normally different groups in an organization develop components of software, which can be used standalone or as a part of a suite of products. This is a very normal practice. So they go ahead and create a software package with a complete setup.exe and a separate MSI for it. But when they plan to integrate it with the suite. That is when the setup developer's headache starts. The setup developer might be hard pressed for time and would choose nested install of some sort to cut down time. This article discusses a few techniques to handle it in a better fashion.&lt;br /&gt;&lt;br /&gt;Firstly, &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/nested_installation_actions.asp"&gt;nested installs&lt;/a&gt; are evil. Let me tell you why. They can never be patched and cannot be cleanly removed from the target system. That alone should drive you away from using nested installs. You perform a nested installation. And Boom! The next thing you know is that you have lost control over the life cycle of your application, your house has been burgled and your wife has run away with your neighbor. Well, it was a slight exaggeration but you get the picture. &lt;br /&gt;&lt;br /&gt;A smarter way to handle this, as many argue would be to call the child install by launching the MSI package's setup.exe or launch msiexec and pass appropriate command line parameters to install the package. This is equally bad. Such installations do not have their rollback logic integrated with the parent installer. Thus if the nested setup fails, you do not have any way to roll back the parent setup reliably or the vice-versa. Furthermore, Windows Installer's architecture allows only one installation at a point to make changes to the system. Having two installations modify system resources might not be the smartest thing to do.&lt;br /&gt;&lt;br /&gt;The only way out of this mess is to use something called as the Merge Module. Merge Module is an atomic unit consisting of components, custom actions and various resources like files and registry entries. These merge modules can be integrated into the main installer at design time by the merge tool. You can either use tools like InstallShield to include merge modules in the application or use WIX's &lt;Merge&gt; tag to include the merge module during build. The advantage of using the merge module is that the components in the merge module remain immutable. Thus it ensures that setup developers follow some of the many important component design rules. A resource going to a location will always have the same component GUID regardless of the product its being installed with. Windows Installer will then be able to do clean refcounting of the components and will give you a solid setup.&lt;br /&gt;&lt;br /&gt;Beyond all this, if the setup were a third party setup, you would have to use the MSI package unless the vendor agrees that you can repackage his setup. Buts lets just assume that he does not. Even in that case, it is recommended that you keep the logic of the third-party setup miles away from your application. You can handle the installation of the third party application from the bootstrapper. There are a couple of applications that do that. &lt;a href="http://www.installshield.com/products/x"&gt;InstallShield X Premier and Professional editions&lt;/a&gt; have a neat feature called as Setup Prerequisites, which let you call other MSI or non-MSI based installations from the bootstrapper. If you would like to stay open source, then you can use DevAge’s &lt;a href="http://devage.com/dotNetInstaller/dotNetInstaller.html"&gt;DotNetInstaller&lt;/a&gt; to achieve the same. Both of them are very easy to use. InstallShield’s solution comes with a price tag, sporting a snazzy killer interface and excellent documentation. While the DotNetInstaller is not a setup creation program but is just a bootstrapper and it is free.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-109612816862467880?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/109612816862467880/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=109612816862467880' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/109612816862467880'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/109612816862467880'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2004/09/to-nest-or-to-chain-or-to-merge.html' title='To Nest or To Chain or To Merge'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-109611361620232411</id><published>2004-09-25T04:30:00.000-07:00</published><updated>2006-11-14T12:19:09.556-08:00</updated><title type='text'>All About WIX</title><content type='html'>Of late, I was very busy amidst many meetings. My friends would know the reasons for that&lt;wink/&gt;. As soon as I got away from my day job (actually afternoon, I work from 1PM to 10PM), I got really involved with &lt;a href="http://sourceforge.net/projects/wix"&gt;WIX&lt;/a&gt;. I have found this tool very versatile, stable and extremely lightweight. I believe that this is used internally at Microsoft by MS Office team. The MS Office team actually created Windows Installer (Codenamed Darwin) and hence it is only fair to assume that they use every feature of Windows Installer. This should give you some idea of the versatility of this tool. For folks who don’t know what WIX is, Rob has included a link to the &lt;a href="http://blogs.msdn.com/robmen/archive/2004/09/23/233684.aspx"&gt;Introduction to Windows Installer XML video&lt;/a&gt; in his &lt;a href="http://blogs.msdn.com/robmen"&gt;blog&lt;/a&gt;. He gives a broad overview of the tool and demonstrates the usability of this tool in real-time. Although this tool is versatile, learning it would be difficult if you do not know Windows Installer. Unfortunately, there are not enough good resources to learn Windows Installer. I did my learning with Bob Baker's books published by &lt;a href="http://www.installshield.com/ispress"&gt;InstallShield Press&lt;/a&gt;. I supplemented my knowledge of Windows Installer with the Mike Gunderloy's book &lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/0782127452/103-8672555-0991068?v=glance"&gt;VB/VBA's developers Guide for Windows Installer&lt;/a&gt;. I have to yet read &lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/1590592972/103-8672555-0991068?v=glance"&gt;Phil's &lt;i&gt;The Definitive Guide to Windows Installer&lt;/i&gt;&lt;/a&gt;. I am not sure if I could get hold of it in the near future, as it is not available in the local bookshops. But the bible or should I say the Gita of Windows Installer (MSI.chm) is my lifesaver any day.&lt;br /&gt;&lt;br /&gt;It was pretty fun working with WIX and I believe that all setup developers must seriously consider this tool as an alternative to other commercial tools. There are a number of high-level utilities which help you automate most of the rudimentary tasks with the XML file but are still a fertile field for more development. There is currently no CodeDOM available for WIX so generating the WIX source is not as easy. But I believe that there are a &lt;a href="http://codeblooded.com/blog/archive/2004/04/24/145.aspx"&gt;couple of initiatives&lt;/a&gt; for the same. So for people who have a phobia for editing text files, WIX is NOT for you, atleast until the higher-level apps come in. The documentation is still skimpy but I believe that we should be able to see that changing shortly. WIX, however has a very active users community to extend help when you get stuck.  As the tool is &lt;b&gt;open-source&lt;/b&gt;, you can go ahead and fix a bug yourself depending on the criticality. There is a lot of scope for development for the tools like Tallow and sca.dll. Tallow.exe is a all purpose utility which does some rudimentary code gen, extracts self-reg entries, extracts registration information for assembles, process .rc files to create WIX UI fragments and the like. Sca.dll provides several custom actions like creating WebSites/Virtual directories, Users, run SQL Scripts, etc. Since the .wxs files are plain XML files, they are much easier to check in and check out than binary formats used by commercial tools like InstallShield. BTW, InstallShield does support XML format to store its project file but is nowhere close to the level of distributed application development functionality supported by WIX. Watch the video for more information about this. So if you are all set to download WIX and get running with it, jump &lt;a href="http://sourceforge.net/projects/wix"&gt;here&lt;/a&gt; and click on the download link. You might also want to read an &lt;a href="http://www.ondotnet.com/pub/a/dotnet/2004/04/19/wix.html"&gt;article about WIX on O'Reilly&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I just finished stealing UI from one of my InstallShield Basic MSI projects by "dark"ing (decompiling) the built MSI and cleaning up the WXS file and editing it down to size. I had the custom actions and InstallShield specific properties cleaned out and removed the branding. Thanks to the folks at Wix-Users mailing list, I have successfully separated the UI from my main product's installation and have documented the instructions to include the exact &lt;InstallUISequence&gt; and &lt;AdminUISequence&gt; to be used. I am still a developer so don’t expect me to write many lines of verbose comments. It is just a commented out block of code that you can cut and paste in the main WXS file. If you would like to have a copy of this .wxs file, please email me at &lt;a href="mailto://vagmi.mudumbai@gmail.com"&gt;vagmi.mudumbai@gmail.com&lt;/a&gt;.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-109611361620232411?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/109611361620232411/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=109611361620232411' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/109611361620232411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/109611361620232411'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2004/09/all-about-wix.html' title='All About WIX'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-109360434842258722</id><published>2004-08-27T03:57:00.000-07:00</published><updated>2006-11-14T12:19:09.403-08:00</updated><title type='text'>Self-Registration vs. Registry tables group</title><content type='html'>COM Servers are every Setup developer's nightmare. One of my friends, a release engineer, expressed her extreme frustration over the technique that they had used to register COM Servers. The setup developer had written 100s of lines of code to launch RegSvr32 using the '/s' switch to register these COM Servers. In theory, the process of registration of a COM Server is perfectly fine when done via the regsvr32 utility. But there are certain disadvantages while doing that from the MSI Engineer's perspective. Firstly, all the dependencies of the server need to be registered in a specific order. And secondly, the user performing the installation should have administrative rights. The latter aspect makes setup developers and administrators loathe the registration process. &lt;br /&gt;&lt;br /&gt;Further, system administrators do not know the registry settings and COM interfaces that are exposed by the COM object. COM objects do not support reflection and hence are essentially black boxes. Windows Installer has a '&lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/selfreg_table.asp"&gt;SelfReg&lt;/a&gt;' table which can be used to self-register COM servers. There are several disadvantages while using this table.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Order of registration cannot be specified. Thus if the DLL has dependencies and the dependencies are not registered already, the self-registration would fail.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Rollback cannot be done reliably&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Self-Registration requires administrative privileges&lt;/li&gt;&lt;br /&gt;&lt;li&gt;You cannot exploit the install-on-demand features of Windows Installer&lt;/li&gt;&lt;br /&gt;&lt;li&gt;You cannot register EXE (Out of process) servers.&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Tools like &lt;a href="http://www.installshield.com/products/x"&gt;InstallShield X&lt;/a&gt; provide alternative methods to perform self-registration. This works around certain limitations like specifying the order of registration and registering EXE files. But largely there are limitations that are not in sync with Windows Installer's philosophy of a setup. Speaking of Setup Philosophy, RobMen's blog on his &lt;a href="http://blogs.msdn.com/robmen/archive/2004/05/16/132928.aspx"&gt;philosophical musings&lt;/a&gt; is really worth a read. I personally consider performing self-registration a fiendish act. Microsoft does not absolutely recommend it. Instead it recommends the use of &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/registry_tables_group.asp"&gt;Registry Table group&lt;/a&gt;. These are a set of tables like Class, ProgId, Typelib, MIME, Extension and so forth that can be used to store COM information. Most of this information should be available in the generated IDL file for the COM component. If you have any trouble figuring it out, you can peep into the registry during the registration process using various registry-spying tools and extract the appropriate information. Thankfully, tools like &lt;a href="http://www.installshield.com/products/x"&gt;InstallShield X&lt;/a&gt; abstract this process. For example, using InstallShield X you can extract COM information from the key file of the component during the build time by setting the "COM Extract at Build" attribute of the component in the InstallShield X IDE. Although this makes life easy for a lot of setup developers, this technique has &lt;a href="http://support.installshield.com/kb/view.asp?articleid=Q105681"&gt;its share of pains&lt;/a&gt;. Although not perfect, this technique would solve most of the issues related with COM Registration.&lt;br /&gt;&lt;br /&gt;InstallShield also provides a simple utility call RegSpyUI.exe that helps users look at COM information for a specific DLL or exe. This tool is undocumented, unsupported and hence I do not know all the bad things that it might do. But it is a really cool utility, which helps us work around such nasty limitations. Search the InstallShield X or DevStudio installation directory for this tool. There are a few references to this tool in the &lt;a href="http://community.installshield.com"&gt;InstallShield Communities&lt;/a&gt;. So if something bad happens to your computer, don’t blame me. You have been warned. &lt;/wink&gt;&lt;br /&gt;&lt;br /&gt;Some of the motivating factors for authoring these tables as opposed to self-registration are:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;You can forget about dependencies. Since all the information is already authored in the table, you do not need the COM servers registered in order.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;You can register all kinds of COM Components (DLL, EXE, OCX and the like.)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;You do not need administrative privileges. Since the registration is carried out by the standard actions, you can exploit MSI's support for &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/how_do_i_install_a_package_with_elevated_privileges_as_a_non_admin.asp"&gt;elevated privileges&lt;/a&gt;. This is a boon for people handling locked down environments.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;You can now support Installation-on-Demand for these COM Components. I would cover this in detail some other day.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;With all these facts by your side, I am now sure that you can convince any setup developer to use the &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/registry_tables_group.asp"&gt;Registry Table Group&lt;/a&gt; instead of performing self-registration.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-109360434842258722?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/109360434842258722/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=109360434842258722' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/109360434842258722'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/109360434842258722'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2004/08/self-registration-vs-registry-tables.html' title='Self-Registration vs. Registry tables group'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-109310228207419504</id><published>2004-08-21T08:30:00.000-07:00</published><updated>2006-11-14T12:19:09.326-08:00</updated><title type='text'>Reading Windows Installer Logs</title><content type='html'>As we all know Windows Installer is a complicated and a elegant technology. Its beastly complexities are beautifully abstracted by the authoring packages like InstallShield X, DevStudio and Developer. But we live in a less than perfect world and Murphy’s Law still holds good for the Windows Installer world too. There might be several reasons why an Installation might fail. Some errors might be meaningful while others might just spit out a cryptic error message with an error number during installation. The only way to make sense of these would be to look at the log files generated during installation. You can generate a log file for the installation using the following command line.&lt;br /&gt;&lt;br /&gt;msiexec /i productname.msi /l*v package.log&lt;br /&gt;&lt;br /&gt;This command generates a verbose log file logging all errors, warnings and debug messages and produces a huge log file in the text format. The first look at the log file might be slightly intimidating. This article tries to break the ice with the basics of reading the log file to troubleshoot problems with installation. Discussing all the error messages and its aspects is out of scope of this article. If you have specific questions, feel free to drop me a word. (at installneo@yahoo.com)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;The Bottom Up Approach:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Whenever I read a log file, I start reading it from the bottom of the file. You might dismiss this technique as one of my eccentricities but I believe that this is the quickest, if not the most efficient, way of reading a log file in case of errors like 1603 or 1721. As a convention, the letter 'C' within brackets denotes the client context and the letter 'S' denotes the server context. So all messages in the log, which start as below, are messages in the client's context.&lt;br /&gt;&lt;br /&gt;MSI (c) (A0:4C): Doing action: INSTALL&lt;br /&gt;Action start 0:12:20: INSTALL.&lt;br /&gt;MSI (c) (A0:4C): UI Sequence table 'InstallUISequence' is present and populated.&lt;br /&gt;MSI (c) (A0:4C): Running UISequence&lt;br /&gt;&lt;br /&gt;All messages in the log which start as below are messages from the MSI running in the server's context.&lt;br /&gt;&lt;br /&gt;MSI (s) (1C:7C): Doing action: INSTALL&lt;br /&gt;Action start 0:12:54: INSTALL.&lt;br /&gt;MSI (s) (1C:7C): Running ExecuteSequence&lt;br /&gt;&lt;br /&gt;Let us first analyze a successful log file and get ready to compare the anomalies with a not so perfect log file. I have used a simple Basic MSI project created with InstallShield X that just installs notepad.exe and I have disabled Update Ser. What we should be looking at is actions that do not have a return code of 1. You would find lines similar to the ones below just above the Server context property dump.&lt;br /&gt;&lt;br /&gt;MSI (c) (04:B0): Doing action: SetupCompleteSuccess&lt;br /&gt;Action start 18:03:47: SetupCompleteSuccess.&lt;br /&gt;Action 18:03:47: SetupCompleteSuccess. Dialog created&lt;br /&gt;&lt;em&gt;Action ended 18:03:48: SetupCompleteSuccess. Return value 2.&lt;/em&gt;&lt;br /&gt;Action ended 18:03:48: INSTALL. Return value 1.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Hmm... What does this mean? The "&lt;em&gt;Action ended 18:03:48: SetupCompleteSuccess. Return value 2.&lt;/em&gt;" message indicates that user cancelled the action or the operation was aborted due to a user instruction. But god knows that I did not instruct it stop. There must be something else that is wrong. The most obvious place to look for it would be the "Finish" button in the SetupCompleteSuccess dialog. You would find a line like the one below once you click on the Behavior tab of the dialog and select the OK control. If you insist on doing it via Orca, you can look at the ControlEvent table for the OK control in the SetupCompleteSuccess dialog.&lt;br /&gt;&lt;br /&gt;EndDialog - Exit - 1&lt;br /&gt;&lt;br /&gt;BINGO! We have found the culprit. The argument for the control event must be 'Return' instead of 'Exit'. Refer Windows Installer SDK help library article titled "EndDialog ControlEvent" for more information. Rebuild the project after changing it to 'Return' and you would find that none of the actions have return values other than '1'.&lt;br /&gt;&lt;br /&gt;We have thus finally solved a trivial problem with the help of the log file, which would have gone unnoticed otherwise. Ah! Sweet Perfection.&lt;br /&gt;&lt;br /&gt;:-)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Deferred Custom Actions:&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;One of the common places where users get confused is with deferred custom actions. &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/deferred_execution_custom_actions.asp"&gt;Deferred Execution Custom Actions&lt;/a&gt; are not executed the first time the installer processes the custom actions in the Execute Sequence table. They are instead written to the MSI script. All these actions are executed within the InstallFinalize action.  In these cases, you would have to look at the return value of the InstallFinalize action. A few lines above the line that indicates the return value of InstallFinalize would hint the action that failed. Let us verify this with a simple VBScript Custom Action that does nothing else but cause the install to fail &amp;lt;/wink&amp;gt;. This is the code for the VBScript.&lt;br /&gt;&lt;br /&gt;function MyFunction&lt;br /&gt;MyFunction=1603&lt;br /&gt;end function&lt;br /&gt;&lt;br /&gt;I then create a Type 1030 custom action (VBScript Stored in Binary Table + Deferred Execution). This custom action is scheduled after InstallFiles action in the Install Execute Sequence. Run and log the installation. The installation proceeds and comes up with a dialog, which states that the Installation operation has failed. Let us look into the log for more information.&lt;br /&gt;&lt;br /&gt;The final few lines in the log file complain that installation failed. But it still does  have not enough information to identify an error.&lt;br /&gt;&lt;br /&gt;MSI (c) (34:30): Product: SimpleInstaller -- Installation operation failed.&lt;br /&gt;&lt;br /&gt;MSI (c) (34:30): Grabbed execution mutex.&lt;br /&gt;MSI (c) (34:30): Cleaning up uninstalled install packages, if any exist&lt;br /&gt;MSI (c) (34:30): MainEngineThread is returning 1603&lt;br /&gt;&lt;br /&gt;Above the client contexts' property dump, the following lines of code indicate that INSTALL (Top level action) returns a value of 3 and the main thread is returning 1603. The SetupCompleteError is the same as we discussed earlier. This does not give much information either.&lt;br /&gt;&lt;br /&gt;MSI (s) (DC:D8): MainEngineThread is returning 1603&lt;br /&gt;MSI (c) (34:30): Back from server. Return value: 1603&lt;br /&gt;MSI (c) (34:30): Decrementing counter to disable shutdown. If counter &gt;= 0, shutdown will be denied.  Counter after decrement: -1&lt;br /&gt;Action ended 19:24:28: ExecuteAction. Return value 3.&lt;br /&gt;MSI (c) (34:30): Doing action: SetupCompleteError&lt;br /&gt;Action start 19:24:28: SetupCompleteError.&lt;br /&gt;Action 19:24:29: SetupCompleteError. Dialog created&lt;br /&gt;Action ended 19:24:30: SetupCompleteError. Return value 2.&lt;br /&gt;Action ended 19:24:30: INSTALL. Return value 3.&lt;br /&gt;&lt;br /&gt;Assuming that you have opened the log in notepad, search quickly for the word 'InstallFinalize' and specify the direction of search as up. You will now be able to see the following lines. &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;...&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;Our custom action is being called&lt;/strong&gt;&lt;br /&gt;MSI (s) (DC:D8): Executing op: ActionStart(Name=NewCustomAction1,,)&lt;br /&gt;Action 19:24:28: NewCustomAction1. &lt;br /&gt;MSI (s) (DC:D8): Executing op: CustomActionSchedule(Action=NewCustomAction1,ActionType=1030,Source=function MyFunction&lt;br /&gt;MyFunction=1603&lt;br /&gt;end function,Target=MyFunction,)&lt;br /&gt;MSI (s) (DC:D8): Creating MSIHANDLE (3) of type 790536 for thread 2008&lt;br /&gt;MSI (s) (DC:D8): Creating MSIHANDLE (4) of type 0 for thread 2008&lt;br /&gt;MSI (s) (DC:D8): Closing MSIHANDLE (4) of type 0 for thread 2008&lt;br /&gt;MSI (s) (DC:D8): Closing MSIHANDLE (3) of type 790536 for thread 2008&lt;br /&gt;&lt;strong&gt;Our custom action fails causing the InstallFinalize action to fail&lt;/strong&gt;&lt;br /&gt;&lt;em&gt;Action ended 19:24:28: InstallFinalize. Return value 3.&lt;/em&gt;&lt;br /&gt;&lt;strong&gt;Initiate Rollback&lt;/strong&gt;&lt;br /&gt;MSI (s) (DC:D8): User policy value 'DisableRollback' is 0&lt;br /&gt;MSI (s) (DC:D8): Machine policy value 'DisableRollback' is 0&lt;br /&gt;MSI (s) (DC:D8): Executing op: Header&lt;br /&gt;&lt;strong&gt;...&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;Rolls back changes&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;As you would have aptly guessed, the lines in bold are my comments. So you can nail most of troublesome deferred custom action using this technique.&lt;br /&gt;&lt;br /&gt;I am really sleepy and have got some real work to do. I am sure I would touch on the log files again covering more aspects. Love it or Hate it, feel free to post your comments.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-109310228207419504?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/109310228207419504/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=109310228207419504' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/109310228207419504'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/109310228207419504'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2004/08/reading-windows-installer-logs.html' title='Reading Windows Installer Logs'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7972422.post-109267112323395525</id><published>2004-08-16T08:42:00.000-07:00</published><updated>2006-11-14T12:19:09.235-08:00</updated><title type='text'>This is the beginning of....</title><content type='html'>I have just started this blog to document some of the interesting and difficult...ahem..challenging scenarios I faced while supporting people who package applications. I always wanted to write  technical articles. I guess this would be a start.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7972422-109267112323395525?l=blog.vagmim.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vagmim.com/feeds/109267112323395525/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7972422&amp;postID=109267112323395525' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/109267112323395525'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7972422/posts/default/109267112323395525'/><link rel='alternate' type='text/html' href='http://blog.vagmim.com/2004/08/this-is-beginning-of.html' title='This is the beginning of....'/><author><name>Vagmi</name><uri>http://www.blogger.com/profile/07174754039645505638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://photos1.blogger.com/img/148/1524/320/Vagmi.jpg'/></author><thr:total>2</thr:total></entry></feed>
