<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Adventures of a Setup Developer</title>
        <link>http://geekswithblogs.net/Vagmi.Mudumbai/Default.aspx</link>
        <description>my musings about setups and other things in my life</description>
        <language>hi-IN</language>
        <copyright>Vagmi Mudumbai</copyright>
        <managingEditor>jjulian@geekswithblogs.net</managingEditor>
        <generator>Subtext Version 0.0.0.0</generator>
        <image>
            <title>Adventures of a Setup Developer</title>
            <url>http://geekswithblogs.net/images/RSS2Image.gif</url>
            <link>http://geekswithblogs.net/Vagmi.Mudumbai/Default.aspx</link>
            <width>77</width>
            <height>60</height>
        </image>
        <item>
            <title>Moving back to blogger</title>
            <category>Personal</category>
            <link>http://geekswithblogs.net/Vagmi.Mudumbai/archive/2007/01/09/103106.aspx</link>
            <description>I have &lt;a href="http://installneo.blogspot.com/2007/01/moving-back-to-blogger.html"&gt;moved back&lt;/a&gt; to blogger. Please update your subscriptions. Inconvenience regretted. :-)

Wish you all a very happy and prosperous new year.&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=103106"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=103106" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/Vagmi.Mudumbai/aggbug/103106.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Vagmi Mudumbai</dc:creator>
            <guid>http://geekswithblogs.net/Vagmi.Mudumbai/archive/2007/01/09/103106.aspx</guid>
            <pubDate>Tue, 09 Jan 2007 14:36:00 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/Vagmi.Mudumbai/comments/103106.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/Vagmi.Mudumbai/archive/2007/01/09/103106.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/Vagmi.Mudumbai/comments/commentRss/103106.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/Vagmi.Mudumbai/services/trackbacks/103106.aspx</trackback:ping>
        </item>
        <item>
            <title>Happy Diwali</title>
            <category>Personal</category>
            <link>http://geekswithblogs.net/Vagmi.Mudumbai/archive/2006/10/19/94537.aspx</link>
            <description>&lt;p&gt;This post is for all the indians both in India and abroad who crib about the situations there. These two clips show more than what I would like to say. It is time for all of us to accept this progress and enjoy it. Yes, we do have our problems. We still have incidents of communal riots. We are still bombed by terrorists. Much of Rural India is still to get the taste of this improvement. But we are living in an age with comforts that our previous generation could have only dreamed of. So be happy about it and do your part in making it better.&lt;/p&gt;
&lt;p&gt;
India before&lt;br&gt;
&lt;a href="http://www.youtube.com/watch?v=mKJSDYvxHzw&amp;mode=related&amp;search="&gt;http://www.youtube.com/watch?v=mKJSDYvxHzw&amp;mode=related&amp;search=&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
India Now&lt;br&gt;
&lt;a href="http://www.youtube.com/watch?v=Y_j-N3QkaVE"&gt;http://www.youtube.com/watch?v=Y_j-N3QkaVE&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Happy Diwali and Id Mubarak.
Jai hind.&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=94537"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=94537" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/Vagmi.Mudumbai/aggbug/94537.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Vagmi Mudumbai</dc:creator>
            <guid>http://geekswithblogs.net/Vagmi.Mudumbai/archive/2006/10/19/94537.aspx</guid>
            <pubDate>Fri, 20 Oct 2006 02:13:00 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/Vagmi.Mudumbai/comments/94537.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/Vagmi.Mudumbai/archive/2006/10/19/94537.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/Vagmi.Mudumbai/comments/commentRss/94537.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/Vagmi.Mudumbai/services/trackbacks/94537.aspx</trackback:ping>
        </item>
        <item>
            <title>Uninstall a component during minor upgrade</title>
            <category>Setup</category>
            <link>http://geekswithblogs.net/Vagmi.Mudumbai/archive/2006/06/11/81426.aspx</link>
            <description>It is bound to happen. You will have a developer come up to you one day
and say, "Remember the DLL file that we shipped in the previous
release, we have consolidated its functionality into the core library.
We need to remove that library in the latest release." You as a Windows
Installer developer would then be frustrated after finding out that you
cannot remove components during a minor upgrade and you will have to
manage with all the ugliness of a major upgrade. &amp;nbsp;I will write
about the ugliness of a major upgrade in some other blog.&lt;br&gt;
&lt;br&gt;
So if you really have to remove the DLL, you need not have to go
through the trouble of major upgrade. We can actually uninstall
components during a minor upgrade. But the catch is that you should not
remove the component from the existing MSI.&amp;nbsp;My colleague Kajal
Biswas calls this process as "Puncturing the component". Let me detail
the process of puncturing the component.&lt;br&gt;
&lt;ol&gt;
  &lt;li&gt;Consider the component abc.dll which has to be
removed.&amp;nbsp;&lt;/li&gt;
  &lt;li&gt;Collect the Registry, CLSID and the COM information if you
have
dynamically acquired them, you will have to fill them in manually
later. This is usually the reason why I do not use COM Extract at
Build. I usually use 'Extract COM Information' feature of InstallShield
DevStudio. This would ensure that I can find out the exact registry
entries and COM Settings. &amp;nbsp;If you had used the WiX Toolset, it
is
pretty straight forward. You will just have to go to the next step and
you can ignore this completely.&lt;/li&gt;
  &lt;li&gt;Replace abc.dll file with a zero byte&amp;nbsp;file with
the same name.&lt;/li&gt;
  &lt;li&gt;Set the transitive bit of the component. If you are using
InstallShield DevStudio, simply set the 'Reevaluate Condition' field in
the component property to 'Yes'.&amp;nbsp;&lt;/li&gt;
  &lt;li&gt;Replace any existing condition on the component with a
condition
that evaluates to false. As a habit, I and my colleagues enter the
paradoxical '1=0' as the component condition. You can also enter
something meaningful like 'GoToHell=666' or something like that.&lt;/li&gt;
&lt;/ol&gt;
During a minor upgrade, if the feature associated with the component is
reinstalled, the trasitive bit with also force the state of the
component to be reevaluated. And since the component is present and the
condition is false, the component will be uninstalled during a minor
upgrade. It is hack. But it works.
&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=81426"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=81426" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/Vagmi.Mudumbai/aggbug/81426.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Vagmi Mudumbai</dc:creator>
            <guid>http://geekswithblogs.net/Vagmi.Mudumbai/archive/2006/06/11/81426.aspx</guid>
            <pubDate>Sun, 11 Jun 2006 11:42:00 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/Vagmi.Mudumbai/comments/81426.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/Vagmi.Mudumbai/archive/2006/06/11/81426.aspx#feedback</comments>
            <slash:comments>3</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/Vagmi.Mudumbai/comments/commentRss/81426.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/Vagmi.Mudumbai/services/trackbacks/81426.aspx</trackback:ping>
        </item>
        <item>
            <title>The transitive bit gotcha!</title>
            <category>Setup</category>
            <link>http://geekswithblogs.net/Vagmi.Mudumbai/archive/2006/04/02/74061.aspx</link>
            <description>&lt;p&gt;
Windows Installer's &lt;a href="http://msdn.microsoft.com/library/en-us/msi/setup/component_table.asp?frame=true"&gt;transitive bit&lt;/a&gt; is a really cool thing. It allows you to author your components in such a way that it would install if component's condition is true and uninstall if it is false even during upgrades. Well almost. Refer the &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/using_transitive_components.asp"&gt;documentation&lt;/a&gt; for more information. So this can be used to get rid of pesky components that you need to uninstall during a minor upgrade. Now we thought this stuff was really neat and applied it to all the components. We had our justifications that this setup will always be done by admins and will always be per machine. None of the components wrote anything off to HKEY_CURRENT_USER and we were pretty much safe in assuming that it would not be the case in the future either. So we turned on the transitive bit for all our components. The software behaved exceptionally well. The maintenance was driven via a external wrapper which always passed the REINSTALL parameter and hence everything worked very well.
&lt;/p&gt;
&lt;p&gt;
This allowed our MSI to behave as a state machine. You could simply throw in a bunch of properties and set its state and it would just install the ones that are required. This basically solves the problem of setup types and you do not have to write custom actions to set the feature request states.
&lt;/p&gt;
&lt;p&gt;
We had tested most of the scenarios on different operating systems and it seemed to function just fine. We had it going through the last round of validation when we got a call from one of the landscape administrators that the product had uninstalled itself. Windows Installer had triggered a repair after the application of a hotfix by one of the developers and had completely uninstalled the application. The reason being that the Windows Installer repair operation also re-evaluates the component conditions and decides that they should not exist on the machine. The problem rested in the fact that even though we did persist the properties to be retrieved later, but that was entirely upto the bootstrapper to do it as the bootstrapper was the single entity that would do all the MSI related maintenance activities. So when the MSI repair started, which of course is as good as a quick reinstall, it ran through the entire InstallExecuteSequence table and found that most of the components were not supposed to be on the machine and had them removed. The solution was fairly simple. We had to persist all the properties and its values in the registry and we had to author AppSearch entries for all the properties and do a sort of quick check for the settings and swap the values with the actual ones during such a repair operation.
&lt;p&gt;
&lt;p&gt;
So if you plan to use the MSI transitive bit for your components, be very careful. You have been warned.
&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=74061"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=74061" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/Vagmi.Mudumbai/aggbug/74061.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Vagmi Mudumbai</dc:creator>
            <guid>http://geekswithblogs.net/Vagmi.Mudumbai/archive/2006/04/02/74061.aspx</guid>
            <pubDate>Sun, 02 Apr 2006 11:09:00 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/Vagmi.Mudumbai/comments/74061.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/Vagmi.Mudumbai/archive/2006/04/02/74061.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/Vagmi.Mudumbai/comments/commentRss/74061.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/Vagmi.Mudumbai/services/trackbacks/74061.aspx</trackback:ping>
        </item>
        <item>
            <title>Printing 42 - A not so straightforward Boo way</title>
            <category>Open Source</category>
            <category>Personal</category>
            <link>http://geekswithblogs.net/Vagmi.Mudumbai/archive/2006/01/24/66849.aspx</link>
            <description>I was recently working with Reflection and &lt;a
href="http://boo.codehaus.org"&gt;Boo&lt;/a&gt; and thought
this was funny. Hey.. nobody told life is simple right. So, here it
goes. :-)&lt;br&gt;
&lt;br&gt;
i as int&lt;br&gt;
i=i.GetType().GetMethod("Parse",[typeof(string)].ToArray(typeof(System.Type))).Invoke(null,["42"].ToArray())&lt;br&gt;
print "Answer to the question of life, universe and everything is ", i
&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=66849"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=66849" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/Vagmi.Mudumbai/aggbug/66849.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Vagmi Mudumbai</dc:creator>
            <guid>http://geekswithblogs.net/Vagmi.Mudumbai/archive/2006/01/24/66849.aspx</guid>
            <pubDate>Tue, 24 Jan 2006 13:30:00 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/Vagmi.Mudumbai/comments/66849.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/Vagmi.Mudumbai/archive/2006/01/24/66849.aspx#feedback</comments>
            <slash:comments>4</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/Vagmi.Mudumbai/comments/commentRss/66849.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/Vagmi.Mudumbai/services/trackbacks/66849.aspx</trackback:ping>
        </item>
        <item>
            <title>GPLv3 draft posted</title>
            <category>Open Source</category>
            <link>http://geekswithblogs.net/Vagmi.Mudumbai/archive/2006/01/17/66134.aspx</link>
            <description>The new &lt;a href="http://gplv3.fsf.org/draft"&gt;GPLv3 draft&lt;/a&gt; has been posted for &lt;a href="http://gplv3.fsf.org/comments/"&gt;discussion&lt;/a&gt;. The &lt;a href="http://gplv3.fsf.org/rationale"&gt;Rationale Document&lt;/a&gt; explains the changes.&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=66134"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=66134" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/Vagmi.Mudumbai/aggbug/66134.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Vagmi Mudumbai</dc:creator>
            <guid>http://geekswithblogs.net/Vagmi.Mudumbai/archive/2006/01/17/66134.aspx</guid>
            <pubDate>Tue, 17 Jan 2006 22:59:00 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/Vagmi.Mudumbai/comments/66134.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/Vagmi.Mudumbai/archive/2006/01/17/66134.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/Vagmi.Mudumbai/comments/commentRss/66134.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/Vagmi.Mudumbai/services/trackbacks/66134.aspx</trackback:ping>
        </item>
        <item>
            <title>Lawrence Lessig on Transparent Creativity</title>
            <category>Open Source</category>
            <link>http://geekswithblogs.net/Vagmi.Mudumbai/archive/2005/10/18/57270.aspx</link>
            <description>I found &lt;a href="http://lessig.org/freeculture/free.html"&gt;this flash presentation&lt;/a&gt; while I was browsing the web today. It was Lawrence Lessig's address at OSCON 2002. An extremely interesting presentation. &lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=57270"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=57270" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/Vagmi.Mudumbai/aggbug/57270.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Vagmi Mudumbai</dc:creator>
            <guid>http://geekswithblogs.net/Vagmi.Mudumbai/archive/2005/10/18/57270.aspx</guid>
            <pubDate>Tue, 18 Oct 2005 20:24:00 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/Vagmi.Mudumbai/comments/57270.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/Vagmi.Mudumbai/archive/2005/10/18/57270.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/Vagmi.Mudumbai/comments/commentRss/57270.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/Vagmi.Mudumbai/services/trackbacks/57270.aspx</trackback:ping>
        </item>
        <item>
            <title>The "South Park" me.</title>
            <category>Personal</category>
            <link>http://geekswithblogs.net/Vagmi.Mudumbai/archive/2005/10/18/57260.aspx</link>
            <description>I came across an &lt;a href="http://spstudio.elena.hosting-friends.de/spstudio.html"&gt;interesting site&lt;/a&gt; to create &lt;a href="http://en.wikipedia.org/wiki/Southpark"&gt;SouthPark&lt;/a&gt; style cartoon characters. If I had been a SouthPark character, I would have probably have looked like this.

&lt;p align=left&gt;&lt;img src="http://geekswithblogs.net/images/geekswithblogs_net/vagmi.mudumbai/1205/o_me.gif"/&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=57260"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=57260" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/Vagmi.Mudumbai/aggbug/57260.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Vagmi Mudumbai</dc:creator>
            <guid>http://geekswithblogs.net/Vagmi.Mudumbai/archive/2005/10/18/57260.aspx</guid>
            <pubDate>Tue, 18 Oct 2005 17:37:00 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/Vagmi.Mudumbai/comments/57260.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/Vagmi.Mudumbai/archive/2005/10/18/57260.aspx#feedback</comments>
            <slash:comments>4</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/Vagmi.Mudumbai/comments/commentRss/57260.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/Vagmi.Mudumbai/services/trackbacks/57260.aspx</trackback:ping>
        </item>
        <item>
            <title>Multi Platform versus Cross Platform</title>
            <category>Open Source</category>
            <category>Setup</category>
            <link>http://geekswithblogs.net/Vagmi.Mudumbai/archive/2005/10/07/56307.aspx</link>
            <description>&lt;p&gt;
I have lately been pondering over methods to deploy cross platform
products. I investigated certain options like 
&lt;a href="http://www.installshield.com/products/installshield/premier/universal.asp"&gt;
InstallShield's Universal Project&lt;/a&gt; and 
&lt;a href="http://zerog.com/installanywhere-create-deploy-java-multiplatform-installers.html"&gt;
ZeroG's InstallAnywhere&lt;/a&gt;. 
But to tell the truth, it goes against the philosophy of installation. 
They rely on the presence of the right version of JRE. Some installations 
also package the native versions of JRE along with the installation 
package. This is quite an overhead. Other products use their custom 
homegrown installers. As most of the setup developers and administrators 
know, homegrown installers are a disaster waiting to happen. A good
installation technology should do the following.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Installation - This is the easy part.

&lt;li&gt;Rollback in case of failure
&lt;li&gt;Support for dependency and conflict resolution.
&lt;li&gt;Support for transactional install/uninstall operations. This is
very important for the integrity of the system.
&lt;li&gt;Support for upgrades.
&lt;li&gt;Heal installed applications.
&lt;/ul&gt;

&lt;p&gt;Creating a custom installation technology with all these features is
difficult if not impossible. Also it is an investment that is not
required when you can reuse the wheel. Each of the operating systems
or the platform targeted have a native installation technology which
support all of the above points in some way or the other. Most of
these cross platform applications are deployed on Windows, Linux or
Solaris. Windows has the Windows Installer a.k.a MSI package format to
keep an inventory of software that is installed in an extremely
fine granular level. Linux has 
&lt;a href="http://www.rpm.org"&gt;
RPM &lt;/a&gt; and &lt;a href="http://www.debian.org/doc/manuals/distribute-deb/distribute-deb.html"&gt;DEB&lt;/a&gt; 
formats which deal with
packages at a more coarse scale than Windows Installer but have
excellent dependency and conflict resolution. Solaris has its native
&lt;a href="http://docs.sun.com/app/docs/doc/817-0406"&gt;
PKG&lt;/a&gt; format to install packages.


&lt;p&gt;So instead of a cross-platform installation program, we could have
a cross platform tool to create multiple installation packages for multiple
platforms. One of the biggest problems working in this direction would
be that the setup engineer should have a knowledge of all the
platforms that he is packing the application for. This is usually not a
easy job. For instance, I could handle Windows MSI and Linux's  RPM &amp;amp; DEB files
but would be a completely lost on a Solaris platform.

&lt;p&gt;The biggest challenge would also be the fact that the customization
scripts and custom actions would need to be coded by the setup
engineer for each platform or package format. But this is a small 
price to pay for the amount of flexibility that can be achieved. The 
software deployment becomes a breeze and would significantly lower the 
(holy grail of three letter acronyms) TCO.&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=56307"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=56307" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/Vagmi.Mudumbai/aggbug/56307.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Vagmi Mudumbai</dc:creator>
            <guid>http://geekswithblogs.net/Vagmi.Mudumbai/archive/2005/10/07/56307.aspx</guid>
            <pubDate>Fri, 07 Oct 2005 20:22:00 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/Vagmi.Mudumbai/comments/56307.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/Vagmi.Mudumbai/archive/2005/10/07/56307.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/Vagmi.Mudumbai/comments/commentRss/56307.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/Vagmi.Mudumbai/services/trackbacks/56307.aspx</trackback:ping>
        </item>
        <item>
            <title>Ruby/Rake and Python Decorators</title>
            <category>Open Source</category>
            <link>http://geekswithblogs.net/Vagmi.Mudumbai/archive/2005/09/01/51811.aspx</link>
            <description>&lt;DIV class=serendipity_entry_body&gt;
&lt;P&gt;I had been experimenting with &lt;A href="http://www.ruby-lang.org/"&gt;&lt;FONT color=#003366&gt;Ruby&lt;/FONT&gt;&lt;/A&gt;/&lt;A href="http://rake.rubyforge.org/"&gt;&lt;FONT color=#003366&gt;Rake&lt;/FONT&gt;&lt;/A&gt;. I took a little while for me to get adjusted to Ruby's syntax. I love &lt;A href="http://martinfowler.com/bliki/Closure.html"&gt;&lt;FONT color=#003366&gt;closures&lt;/FONT&gt;&lt;/A&gt; in Ruby and their effective use in Rake. I was trying if I could do the same in &lt;A href="http://www.python.org/"&gt;&lt;FONT color=#003366&gt;Python&lt;/FONT&gt;&lt;/A&gt;. As always, I came up with a very shabby code as the first attempt. &lt;/P&gt;
&lt;P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;DIV class=serendipity_entry_extended&gt;&lt;A id=extended&gt;&lt;/A&gt;
&lt;P&gt;#run target.py&lt;BR&gt;# the global dict to store targets&lt;BR&gt;targets={} &lt;BR&gt;#defining and adding a target &lt;BR&gt;class Target: &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def __init__(self,name='',dependencies=[],fn=None):&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.name=name&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.dependencies=dependencies&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.fn=fn&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.done=False&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.success=False&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def run(self):&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(not self.done):&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;self.success=self.fn(self)&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;self.done=True&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return self.success&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def describetarget(self):&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print self.fn.__doc__&lt;BR&gt;&lt;BR&gt;def addtarget(name,dependencies,callable): &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;objtarget=Target(name,dependencies,callable)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;targets[name]=objtarget&lt;BR&gt;&lt;BR&gt;# now to add the actual target &lt;BR&gt;&lt;BR&gt;def sayHello(target): &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'''Prints hello world with the calling targets' name'''&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print "hello world from " + target.name&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return True&lt;BR&gt;addtarget('sayhello',[],sayHello) &lt;BR&gt;&lt;BR&gt;#run the target &lt;BR&gt;targets['sayhello'].run()&lt;BR&gt;&lt;BR&gt;As you can clearly see, you would have to first define the function and add it later as the target. For simplicity sake have not written the logic of constructing the dependency tree. You can see that this is nowhere close to writing the same code in Ruby. Consider the following.&lt;BR&gt;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT: bold; TEXT-DECORATION: underline"&gt;Python Code:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-WEIGHT: bold; TEXT-DECORATION: underline"&gt;&lt;/SPAN&gt;def sayHello(target): &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'''Prints hello world with the calling targets' name'''&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print "hello world from " + target.name&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return True&lt;BR&gt;addtarget('sayhello',[],sayHello) &lt;BR&gt;&lt;BR&gt;Versus&lt;BR&gt;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT: bold; TEXT-DECORATION: underline"&gt;Rake Code:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-WEIGHT: bold; TEXT-DECORATION: underline"&gt;&lt;/SPAN&gt;task :mytask do |t| &lt;BR&gt;print 'hello world ' + t.name &lt;BR&gt;end&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT: bold; TEXT-DECORATION: underline"&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;The magic of ruby code is in closures. Python does support closures. Python 2.4 also has a new feature called &lt;A href="http://www.python.org/peps/pep-0318.html"&gt;&lt;FONT color=#003366&gt;decorators&lt;/FONT&gt;&lt;/A&gt; which can do the same thing. This is what I did in Python using decorators.&lt;BR&gt;&lt;BR&gt;#runtargetwithdecorator.py&lt;BR&gt;#global dict to store targets&lt;BR&gt;targets={}&lt;BR&gt;&lt;BR&gt;#the target class&lt;BR&gt;class Target:&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def __init__(self,name='',dependencies=[],fn=None):&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.name=name&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.dependencies=dependencies&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.fn=fn&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.done=False&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.success=False&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def run(self):&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(not self.done):&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;self.success=self.fn(self)&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;self.done=True&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return self.success&lt;BR&gt;&lt;BR&gt;#the target decorator function&lt;BR&gt;&lt;BR&gt;def target(name,dependencies=[]):&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def decorator(f):&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mytarget=Target(name,dependenc&lt;WBR&gt;ies,f)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;targets[name]=mytarget&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return f&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return decorator&lt;BR&gt;&lt;BR&gt;#implementing the decorator&lt;BR&gt;@target('mytarget')&lt;BR&gt;def MyFunction(target):&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print "hello world", target.name&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return True&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;targets['mytarget'].run()&lt;BR&gt;&lt;BR&gt;Now consider the following.&lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;&lt;U&gt;Python code:&lt;/U&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;@target('mytarget')&lt;BR&gt;def MyFunction(target):&lt;BR&gt;&amp;nbsp;&amp;nbsp; print "hello world", target.name&lt;BR&gt;&amp;nbsp; &amp;nbsp;return True&lt;BR&gt;&lt;BR&gt;versus&lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;&lt;U&gt;Ruby code:&lt;/U&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;task :mytask do |t|&lt;BR&gt;&amp;nbsp; &amp;nbsp;print 'hello world ' + t.name&lt;BR&gt;end&lt;BR&gt;&lt;BR&gt;Now the python code is a lot more easlier to read than its counterpart in Ruby. Python may not be an effective DSL for build languages but is definitely a lot easier to read and understand than Ruby's code. But you cannot have a empty defaults target defined in python. You should have a valid callable after the @decorator. For example, to my knowledge, you cannot write the following code in python without the following function. &lt;/P&gt;
&lt;P&gt;@target('default',['mytarget1','mytarget2']) &lt;BR&gt;def somefn(target):&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;pass&lt;BR&gt;&lt;BR&gt;But you can write the following code in ruby without any closure method.&lt;BR&gt;&lt;BR&gt;task :default =&amp;gt; [:mytask1,:mytask2]&lt;/P&gt;
&lt;P&gt;In spite of Rake's simplicity, I still would prefer writing Python code. I guess it is just my personal preference. No offence to Rake fans. :-)&amp;nbsp;&lt;/SCRIPT /&gt; &lt;/P&gt;&lt;/DIV&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=51811"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=51811" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/Vagmi.Mudumbai/aggbug/51811.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Vagmi Mudumbai</dc:creator>
            <guid>http://geekswithblogs.net/Vagmi.Mudumbai/archive/2005/09/01/51811.aspx</guid>
            <pubDate>Thu, 01 Sep 2005 17:40:00 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/Vagmi.Mudumbai/comments/51811.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/Vagmi.Mudumbai/archive/2005/09/01/51811.aspx#feedback</comments>
            <slash:comments>8</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/Vagmi.Mudumbai/comments/commentRss/51811.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/Vagmi.Mudumbai/services/trackbacks/51811.aspx</trackback:ping>
        </item>
        <item>
            <title>The importance of Free and Liberal Open Source Software (FLOSS) in the Indian context</title>
            <category>Open Source</category>
            <link>http://geekswithblogs.net/Vagmi.Mudumbai/archive/2005/08/30/51573.aspx</link>
            <description>There exists a lot of literature written on Free and Liberal Open
Source Software(&lt;a href="http://www.gnu.org"&gt;GNU&lt;/a&gt;/&lt;a
 href="http://www.fsf.org"&gt;FSF&lt;/a&gt;). This is what I
feel
about it. I had recently been to a school to give an introduction about
computers to some kids in a village near Pondicherry. I had access to a
laptop and showed them a quick presentation on the basics of computers.
I was aware of the fact that the school syllabus has &lt;a
 href="http://www.microsoft.com"&gt;Microsoft&lt;/a&gt; Windows
as the primary platform for education. Most kids think paint is cool.
What would they say if they saw &lt;a href="http://www.gimp.org/"&gt;GIMP&lt;/a&gt;?
But the government has to
realize that providing a computer and upgrading the license of the
operating system is a costly business. Most of the schools in India run
on a shoe string budget. Let us do the math now.&lt;br&gt;
&lt;br&gt;
&lt;table border="1"
 cellpadding="2" cellspacing="0"&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Number of students for a class (at least)&lt;/td&gt;
      &lt;td style="text-align: right;"&gt;30&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Number of client licenses to be purchased if the
computer is shared by 3 users&lt;/td&gt;
      &lt;td style="text-align: right;"&gt;10&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Cost of a computer (approx)&lt;/td&gt;
      &lt;td style="text-align: right;"&gt;Rs. 10,000/-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Cost of a Microsoft Windows client license (approx)&lt;/td&gt;
      &lt;td style="text-align: right;"&gt;Rs. 2,500/-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Cost of a Microsoft Windows Server range operating
system&lt;/td&gt;
      &lt;td style="text-align: right;"&gt;Rs. 40,000/-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Total cost for client operating system licenses&lt;/td&gt;
      &lt;td style="text-align: right;"&gt;Rs. 25,000/-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Total cost of the workstations (hardware)&lt;/td&gt;
      &lt;td style="text-align: right;"&gt;Rs. 1,00,000/-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Cost of the server hardware (basic p4 based desktop to
act as a&amp;nbsp;database server/Web Server)&lt;/td&gt;
      &lt;td style="text-align: right;"&gt;Rs. 30,000/-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Total cost of setting up 10 terminals with 1 server&lt;/td&gt;
      &lt;td style="text-align: right;"&gt;Rs. 1,95,000/-&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
&lt;br&gt;
I have not included the cost of buying software like Microsoft Visual
Studio .NET 2003 and Microsoft SQL Server, which would each cost about
35,000 and 45,000 approximately.&amp;nbsp;Please let me know if my
figures are
wrong. And the SQL Server is for 45,000 is only a standard 5-client
edition. Also there exists a problem with upgrades. You would have to
pay for them too.&amp;nbsp;You would need to get two licenses which
would mean a
catastrophic cost for a simple school to setup. The common solution
that various schools adopt is to pirate the software. This is much more
rampant in the schools in the private sector. A crackdown on such
schools would put most of the schools out of business. The moment you
open a new school/college you open up a software piracy den and promote
criminals. Let us look at the figures for Linux.&lt;br&gt;
&lt;br&gt;
&lt;table  border="1"
 cellpadding="2" cellspacing="0" &gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Number of students for a class (at least)&lt;/td&gt;
      &lt;td style="text-align: right;"&gt;30&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Number of client licenses to be purchased if the
computer is shared by 3 users&lt;/td&gt;
      &lt;td style="text-align: right;"&gt;10&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Cost of a computer (approx)&lt;/td&gt;
      &lt;td style="text-align: right;"&gt;Rs. 10,000/-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Cost of a Microsoft Windows client license (approx)&lt;/td&gt;
      &lt;td style="text-align: right;"&gt;Rs. 0/-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Cost of a Microsoft Windows Server range operating
system&lt;/td&gt;
      &lt;td style="text-align: right;"&gt;Rs. 0/-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Total cost for client operating system licenses&lt;/td&gt;
      &lt;td style="text-align: right;"&gt;Rs. 0/-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Total cost of the workstations (hardware)&lt;/td&gt;
      &lt;td style="text-align: right;"&gt;Rs. 1,00,000/-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Cost of the server hardware (basic p4 based desktop to
act as a&amp;nbsp;database server/Web Server)&lt;/td&gt;
      &lt;td style="text-align: right;"&gt;Rs. 30,000/-&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Total cost of setting up 10 terminals with 1 server&lt;/td&gt;
      &lt;td style="text-align: right;"&gt;Rs. 1,30,000/-&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
&lt;br&gt;
As it is clearly seen, it is important for all the schools in
India to adopt Free and Liberal Open Source Software. This step would
mean the following advantages for the Indian society. &lt;br&gt;
&lt;br&gt;
&lt;ol&gt;
  &lt;li&gt;The cost of setting up new computer labs is significantly
lowered.&lt;/li&gt;
  &lt;li&gt;Students will gain the ability to produce software on open
source platforms.&lt;/li&gt;
  &lt;li&gt;Projects targetted at open source platform can serve the
Indian Society.&lt;/li&gt;
  &lt;li&gt;This will free the small businesses from the requirement of
purchasing pricey software. They could use open source software built
by our future software professionals.&lt;/li&gt;
  &lt;li&gt;Open Source Software engineers in my belief have a better
understanding of the underlying technology and can really benefit from
the community.&lt;/li&gt;
&lt;/ol&gt;
Necessity is the mother of invention. As more and more people adopt
open source software, I am sure that they in turn will create a need
for better software. I have been using Linux on and off for the past
several years and have seen it progress in leaps and bounds. I would
strongly suggest open source operating systems like &lt;a
 href="http://www.freebsd.org/"&gt;FreeBSD&lt;/a&gt; or &lt;a
 href="http://www.linux.org/"&gt;Linux&lt;/a&gt; as the
operating systems. They have a host of open source products to suffice
every need in the closed source world. I do agree that there are open
source products available in the closed source platform that are on par
with their commercial counterparts. For example, &lt;a
 href="http://www.icsharpcode.com/OpenSource/SD/Default.aspx"&gt;SharpDevelop&lt;/a&gt;
would suffice the need of any normal C# programmer who has not been
pampered with Visual Studio .NET 2003 features. But on the other hand
you have &lt;a href="http://www.eclipse.org"&gt;Eclipse&lt;/a&gt;
which would seem VS.NET 2003 seem like a baby. &lt;a
 href="http://www.mysql.com"&gt;MySQL&lt;/a&gt; competes with
Microsoft SQL Server in the DB Server arena. &lt;a
 href="http://www.php.net"&gt;PHP&lt;/a&gt; can serve as a
commendable alternative to ASP and ASP.NET. &lt;a
 href="http://www.apache.org"&gt;Apache&lt;/a&gt; Web Server
gives IIS a run for their money in the Web Server segment. &lt;a
 href="http://java.sun.com"&gt;Java&lt;/a&gt; and &lt;a
 href="http://www.mono-project.com/Main_Page"&gt;Mono&lt;/a&gt;
provide solid cross platform application frameworks. Even though Java
is not strictly open source, its free availability on open source
platform makes it a lucrative option. Apart for these compilable
languages, &lt;a href="http://www.python.org"&gt;Python&lt;/a&gt;
and &lt;a href="http://www.ruby-lang.org"&gt;Ruby&lt;/a&gt;
offer a quick application development cycle which is ideal for
developing small business tools.&lt;br&gt;
&lt;br&gt;
It is now time for the educational institutions in India to decide if
they still want to pay a huge sum or indulge in criminal practices to
learn/teach software or adopt the clean and relatively hassle free path
of Open Source software to produce better software engineers.
&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=51573"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=51573" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/Vagmi.Mudumbai/aggbug/51573.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Vagmi Mudumbai</dc:creator>
            <guid>http://geekswithblogs.net/Vagmi.Mudumbai/archive/2005/08/30/51573.aspx</guid>
            <pubDate>Tue, 30 Aug 2005 20:45:00 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/Vagmi.Mudumbai/comments/51573.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/Vagmi.Mudumbai/archive/2005/08/30/51573.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/Vagmi.Mudumbai/comments/commentRss/51573.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/Vagmi.Mudumbai/services/trackbacks/51573.aspx</trackback:ping>
        </item>
        <item>
            <title>Revisiting Linux</title>
            <category>Personal</category>
            <link>http://geekswithblogs.net/Vagmi.Mudumbai/archive/2005/07/01/45222.aspx</link>
            <description>&lt;P&gt;After a hectic schedule, I decided to give myself a break. So I decided that I will install Linux just for fun to refresh my memory on the linux front. It is also a small bet with my colleague that I could be productive and have fun with Linux just the way I work with Windows. I was arguing on the fact that there is no better learning platform than Linux. I've worked only on &lt;A href="www.redhat.com"&gt;RedHat&lt;/A&gt; 7,8,9 distros that are distributed with magazines. There is this old joke about Open Source communities vs. Closed source vendors . It goes something like this. &lt;/P? &lt;p&gt;"Commercial vendors sell software but give away free T-Shirts. Open source communities give free software but sell T-Shirts."&lt;/P&gt;
&lt;P&gt;So, here I am blogging from my linux (yeah!!!) machine. It has been a long time since I had worked on any of the linux distros. I tried downloading Fedora, but it was just too big. So is Novell Desktop Linux. I've got the bandwidth and everything but shelling so much space for it from my hard disk did not seem worth it. Who needs so much stuff anyway. So I settled for &lt;A href="http://www.ubuntulinux.com"&gt;Ubuntu&lt;/A&gt;. Ubuntu still retains the open source passion that makes it attractive. The installation was lightweight and text based which suits me. I do not want any fancy graphics for the installation. Ubuntu installed GNOME by default and to my surprise had disabled the root account. I first felt a little uncomfortable running as a non-privileged user. We've all got used to running as administrator on our windows machines. People would laugh if you said you did not have administrative privileges on a Windows Machine. But on a linux machine it is normal that you are a restricted user. Everytime I used Nautilus to copy files I was reminded that I was running under a non-privileged user login. Although I could launch Nautilus itself with sudo, I used the command line. I still remembered basic linux commands. That was quite a relief.&lt;/P&gt;
&lt;P&gt;Unfortunately, I was not able to listen to &lt;A href="http://launch.yahoo.com"&gt;LaunchCast&lt;/A&gt; and I miss my MSN Radio already. :-( Apart from that I am pretty happy with the distribution. It seems to be pretty stable. I have installed (rather extracted) &lt;A href="http://www.eclipse.org"&gt;Eclipse&lt;/A&gt;, the latest Java Runtime and the &lt;A href="http://pydev.sf.net"&gt;pydev&lt;/A&gt; Eclipse plugin. It is a pretty neat. If time permits, I will try to write a small sudoku puzzle solver in Python on my Linux machine. And finally, just for the pure visual treat and to prove that everything is working, here is the screenshot of my desktop.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://photos19.flickr.com/22826822_340a81c3b8_o_d.png"&gt;&lt;IMG src="http://photos19.flickr.com/22826822_340a81c3b8_d.jpg"&gt;&lt;/A&gt;&lt;/P&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=45222"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=45222" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/Vagmi.Mudumbai/aggbug/45222.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Vagmi Mudumbai</dc:creator>
            <guid>http://geekswithblogs.net/Vagmi.Mudumbai/archive/2005/07/01/45222.aspx</guid>
            <pubDate>Sat, 02 Jul 2005 01:41:00 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/Vagmi.Mudumbai/comments/45222.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/Vagmi.Mudumbai/archive/2005/07/01/45222.aspx#feedback</comments>
            <slash:comments>8</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/Vagmi.Mudumbai/comments/commentRss/45222.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/Vagmi.Mudumbai/services/trackbacks/45222.aspx</trackback:ping>
        </item>
        <item>
            <title>Anders Helsberg + Whiteboard + C# = really cool</title>
            <category>Setup</category>
            <link>http://geekswithblogs.net/Vagmi.Mudumbai/archive/2005/04/27/38495.aspx</link>
            <description>&lt;!-- Converted from text/plain format --&gt;&amp;nbsp;&lt;FONT face=Verdana size=2&gt;While I was browsing the MSDN, I came across this very &lt;/FONT&gt;&lt;A href="http://msdn.microsoft.com/msdntv/episode.aspx?xml=episodes/en/20040624csharpah/manifest.xml"&gt;&lt;FONT face=Verdana size=2&gt;interesting video&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Verdana size=2&gt; which features &lt;/FONT&gt;&lt;A href="http://en.wikipedia.org/wiki/Anders_Hejlsberg"&gt;&lt;FONT face=Verdana size=2&gt;Anders Helsberg&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=2&gt; and his skills with the whiteboard. I really wish&amp;nbsp;&lt;SPAN class=476013103-27042005&gt;that &lt;/SPAN&gt;he&amp;nbsp;&lt;SPAN class=476013103-27042005&gt;teach&lt;/SPAN&gt; me programming.&lt;SPAN class=476013103-27042005&gt; A must see for every C# programmer.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=38495"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=38495" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/Vagmi.Mudumbai/aggbug/38495.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Vagmi Mudumbai</dc:creator>
            <guid>http://geekswithblogs.net/Vagmi.Mudumbai/archive/2005/04/27/38495.aspx</guid>
            <pubDate>Wed, 27 Apr 2005 14:36:00 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/Vagmi.Mudumbai/comments/38495.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/Vagmi.Mudumbai/archive/2005/04/27/38495.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/Vagmi.Mudumbai/comments/commentRss/38495.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/Vagmi.Mudumbai/services/trackbacks/38495.aspx</trackback:ping>
        </item>
        <item>
            <title>My Nerd Score</title>
            <category>Personal</category>
            <link>http://geekswithblogs.net/Vagmi.Mudumbai/archive/2005/04/19/36832.aspx</link>
            <description>&lt;P&gt;This morning I was working on something and my mind kept wandering. So I just went blog browsing and I saw the link to a nerd quiz. Not finding anything better to do, I took it. Here is the score.&lt;/P&gt;&lt;br&gt;
&lt;P&gt;&amp;nbsp;&lt;A href="http://www.nerdtests.com/ft_nq.php?im"&gt;&lt;IMG alt="I am nerdier than 88% of all people. Are you nerdier? Click here to find out!" src="http://www.nerdtests.com/images/ft/nq.php?val=8765"&gt; &lt;/A&gt;&lt;/P&gt;&lt;br&gt;
&lt;P&gt;Guess, I am not that nerdy after all. Okay, time to get back to work. &amp;lt;SMILE /&amp;gt;&lt;/P&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=36832"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=36832" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/Vagmi.Mudumbai/aggbug/36832.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Vagmi Mudumbai</dc:creator>
            <guid>http://geekswithblogs.net/Vagmi.Mudumbai/archive/2005/04/19/36832.aspx</guid>
            <pubDate>Tue, 19 Apr 2005 15:01:00 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/Vagmi.Mudumbai/comments/36832.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/Vagmi.Mudumbai/archive/2005/04/19/36832.aspx#feedback</comments>
            <slash:comments>3</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/Vagmi.Mudumbai/comments/commentRss/36832.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/Vagmi.Mudumbai/services/trackbacks/36832.aspx</trackback:ping>
        </item>
        <item>
            <title>Writing managed code custom actions</title>
            <category>Setup</category>
            <link>http://geekswithblogs.net/Vagmi.Mudumbai/archive/2005/03/28/27473.aspx</link>
            <description>&lt;DIV&gt;&lt;FONT face=Verdana size=2&gt;&lt;SPAN class=403183203-28032005&gt;With the new .NET framework API providing such wonderful functionality, everybody is programming in C# or VB.NET&amp;nbsp;except setup developers. There was quite some commotion in the WIX users list on writing managed custom actions. It was finally decided that it is generally harmful to write managed code custom actions as they would&amp;nbsp;depend on .NET Framework and having dependencies for setup is plain bad design. But IMHO, we can use managed code custom actions if we are 100% sure that it would be present on the target platform or if it is a prerequisite and a part of your &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/launchconditions_action.asp"&gt;LaunchConditions&lt;/A&gt;.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT face=Verdana size=2&gt;&lt;SPAN class=403183203-28032005&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;Writing managed code custom actions can be tricky.&amp;nbsp;&lt;SPAN class=403183203-28032005&gt;The easiest way is to &lt;/SPAN&gt;implement the &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemconfigurationinstallinstallerclasstopic.asp"&gt;System.Configuration.Install.Installer&lt;/A&gt; class. This Installer class has four methods which can be executed during the MSI thread.&amp;nbsp;&lt;SPAN class=403183203-28032005&gt;The Installer class was only meant for developers to do some dirty stuff. But it is far from perfect to be used as a part of the MSI thread. Some of my strong reasons for not using the Installer class&amp;nbsp;are as below.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;FONT face=Verdana size=2&gt;&lt;SPAN class=403183203-28032005&gt;&lt;A href="http://installneo.blogspot.com/2004/09/installing-windows-services-created.html"&gt;InstallUtilLib.DLL&lt;/A&gt; is not completely silent. It still pops up an ugly message box with it fails.&lt;/SPAN&gt;&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT face=Verdana size=2&gt;&lt;SPAN class=403183203-28032005&gt;The methods do not have access to the MSI thread. So&amp;nbsp;we would not be able to use properties or write to the MSI log file.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;DIV&gt;&lt;FONT face=Verdana size=2&gt;&lt;SPAN class=403183203-28032005&gt;We are then left with only one choice. Writing DLLs with C++ which export functions which use managed code. One of the several places that this could be used is handling XML configuration data. Windows Installer supports writing properties to both INI and Registry files but we do not have such facility for XML files. I guess this should be on the TODO list for the next version of Windows Installer &amp;lt;smile/&amp;gt;. But until then we would have to do it ourselves. There is a neat task in &lt;A href="http://nant.sf.net/"&gt;NAnt&lt;/A&gt; named &lt;A href="http://nant.sourceforge.net/release/latest/help/tasks/xmlpoke.html"&gt;&amp;lt;xmlpoke&amp;gt;&lt;/A&gt;. This custom action is&amp;nbsp;programmed in pretty much the same way without namespace support. Given the path to the XML file and the XPath expression, we would be able to replace the value with our own using the installer. And it should also support properties.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT face=Verdana size=2&gt;&lt;SPAN class=403183203-28032005&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT face=Verdana size=2&gt;&lt;SPAN class=403183203-28032005&gt;I start off by creating a class library project in VS.NET 2003 and start editing the ProjectName.CPP file. Note that you would have to create a Module Definition file to support exporting the DLL functions that you write as symbols. Now for the fun stuff.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT face=Verdana size=2&gt;&lt;SPAN class=403183203-28032005&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT face=Verdana size=2&gt;&lt;SPAN class=403183203-28032005&gt;Lets first write functions that can write to the log file.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT face=Verdana size=2&gt;&lt;SPAN class=403183203-28032005&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV dir=ltr style="MARGIN-RIGHT: 0px"&gt;&lt;SPAN class=403183203-28032005&gt;&lt;FONT color=#0000ff&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT face=Verdana size=1&gt;UINT WriteToLog(MSIHANDLE hMSI, CHAR *strMessage)&lt;BR&gt;{&lt;/FONT&gt;&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;P&gt;&lt;FONT face=Verdana size=1&gt;MSIHANDLE hrec=MsiCreateRecord(1);&lt;BR&gt;MsiRecordSetString(hrec,0, strMessage);&lt;BR&gt;MsiProcessMessage(hMSI,INSTALLMESSAGE_INFO,hrec);&lt;BR&gt;MsiCloseHandle(hrec);&lt;BR&gt;&lt;FONT color=#0000ff&gt;return&lt;/FONT&gt; ERROR_SUCCESS;&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face=Verdana size=1&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class=403183203-28032005&gt;&lt;FONT face=Verdana size=2&gt;The above function is a pretty simple function that just writes any string of characters to the log file. While this function is good enough, we will write another function that accepts the managed String type.&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;SPAN class=403183203-28032005&gt;&lt;FONT color=#0000ff size=2&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT face=Verdana&gt;&lt;FONT color=#0000ff size=1&gt;void&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=1&gt;&lt;FONT face=Verdana&gt; WriteToLog1(MSIHANDLE hMSI, String* strMessage)&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face=Verdana&gt;{&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;P&gt;&lt;FONT size=1&gt;&lt;FONT face=Verdana&gt;CHAR* strMessageArr={0};&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face=Verdana&gt;strMessageArr=(&lt;/FONT&gt;&lt;FONT face=Verdana&gt;&lt;FONT color=#0000ff&gt;char&lt;/FONT&gt;*)(&lt;FONT color=#0000ff&gt;void&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=1&gt;&lt;FONT face=Verdana&gt;*)Marshal::StringToHGlobalAnsi(strMessage);&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face=Verdana&gt;WriteToLog(hMSI,strMessageArr);&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face=Verdana size=1&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=+0&gt;&lt;SPAN class=403183203-28032005&gt;&lt;FONT face=Verdana size=2&gt;This functions accepts&amp;nbsp;the managed&amp;nbsp;String* and Marshals it to a character array and then writes it to the log file. Now that we have the logging functions ready, lets concentrate on the actual juice. The idea here is that we use a deferred custom action to poke values into the XML file. The custom action expects data in a '|' delimited list in the following format.&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class=403183203-28032005&gt;&lt;FONT face=Verdana size=2&gt;[XMLFILEPATH]|[XPATHEXPRESSION]|[NEWVALUE]&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class=403183203-28032005&gt;&lt;FONT face=Verdana size=2&gt;A immediate &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/obtaining_context_information_for_deferred_execution_custom_actions.asp"&gt;type 51&lt;/A&gt; custom action sets the &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vsintro7/html/vxgrfcustomactiondataproperty.asp"&gt;CustomActionData&lt;/A&gt; property in the above format.&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;FONT size=+0&gt;&lt;SPAN class=403183203-28032005&gt;&lt;FONT color=#0000ff size=2&gt;
&lt;P&gt;&lt;FONT face=Verdana size=1&gt;extern&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=1&gt; "C" &lt;FONT color=#0000ff&gt;__declspec&lt;/FONT&gt;(&lt;FONT color=#0000ff&gt;dllexport&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face=Verdana size=1&gt;) UINT XmlPoke(MSIHANDLE hMSI)&lt;BR&gt;{&lt;/FONT&gt;&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;P&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=1&gt;TCHAR propval[261]={0};&lt;BR&gt;DWORD len=261;&lt;BR&gt;MsiGetProperty(hMSI,TEXT("CustomActionData"),propval,&amp;amp;len);&lt;BR&gt;WriteToLog(hMSI,propval);&lt;BR&gt;String *str=&lt;FONT color=#0000ff&gt;new&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=1&gt; String(propval);&lt;BR&gt;String *delims="|";&lt;BR&gt;Char delim[]=delims-&amp;gt;ToCharArray();&lt;BR&gt;String* split[]=str-&amp;gt;Split(delim);&lt;BR&gt;FileInfo* fi=&lt;FONT color=#0000ff&gt;new&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face=Verdana size=1&gt; FileInfo(split[0]);&lt;BR&gt;&lt;FONT color=#0000ff&gt;if&lt;/FONT&gt;(fi-&amp;gt;Exists){&lt;/FONT&gt;&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;P&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=1&gt;&lt;FONT color=#0000ff&gt;try&lt;/FONT&gt;{&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;P&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=1&gt;XmlDocument* xdoc=&lt;FONT color=#0000ff&gt;new&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=1&gt; XmlDocument();&lt;BR&gt;xdoc-&amp;gt;Load(split[0]);&lt;BR&gt;XmlNodeList * nl=xdoc-&amp;gt;SelectNodes(split[1]);&lt;BR&gt;IEnumerator * nodesenum=nl-&amp;gt;GetEnumerator();&lt;BR&gt;WriteToLog1(hMSI,split[1]);&lt;BR&gt;&lt;FONT color=#0000ff&gt;while&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=1&gt;&lt;FONT face=Verdana&gt;(nodesenum-&amp;gt;MoveNext())&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face=Verdana&gt;{&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;P&gt;&lt;FONT size=1&gt;&lt;FONT face=Verdana&gt;XmlNode* xNode=&lt;/FONT&gt;&lt;FONT face=Verdana color=#0000ff&gt;__try_cast&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=1&gt;&amp;lt;XmlNode*&amp;gt;(nodesenum-&amp;gt;Current);&lt;BR&gt;String* oldValue1=xNode-&amp;gt;InnerXml;&lt;BR&gt;WriteToLog1(hMSI,String::Concat(oldValue1, &lt;FONT color=#0000ff&gt;new&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face=Verdana size=1&gt; String(" was the old value")));&lt;BR&gt;xNode-&amp;gt;InnerXml=split[2];&lt;BR&gt;String* NewValue="New Value is ";&lt;BR&gt;WriteToLog1(hMSI,String::Concat(NewValue,split[2])); &lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face=Verdana size=1&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=1&gt;xdoc-&amp;gt;Save(split[0]);&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face=Verdana size=1&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=1&gt;&lt;FONT face=Verdana color=#0000ff&gt;catch&lt;/FONT&gt;&lt;FONT face=Verdana&gt;(Exception* exc){&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;P&gt;&lt;FONT face=Verdana size=1&gt;WriteToLog1(hMSI,exc-&amp;gt;Message);&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face=Verdana size=1&gt;}&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face=Verdana size=1&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&lt;FONT face=Verdana size=1&gt;else&lt;/FONT&gt;&lt;/P&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=Verdana size=1&gt;{&lt;/FONT&gt;&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;P&gt;&lt;FONT face=Verdana size=1&gt;WriteToLog(hMSI,"Error: The file does not exist");&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face=Verdana size=1&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=1&gt;&lt;FONT face=Verdana color=#0000ff&gt;return&lt;/FONT&gt;&lt;FONT face=Verdana&gt; ERROR_SUCCESS;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face=Verdana size=1&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class=403183203-28032005&gt;&lt;FONT face=Verdana size=2&gt;The above function reads the CustomActionData property and splits it into an array. I assume that setup developers are good and they always give good data. So I have only gone for rudimentary error handling. The custom action never fails unless the error is catastrophic and is not handled by the try-catch block. It tries find if the XML file exists and if it does, it loads the XML file. I then use the SelectNodes() function to select the list of nodes as per the XPath expression. And finally I set the InnerXml value of the function to the new value. I also log these values as and when required. Thats it... as simple as it seems.&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class=403183203-28032005&gt;&lt;FONT face=Verdana size=2&gt;Dont forget to have the following header files and namespaces on top of the file. You would also have to include reference to System.Xml.Dll.&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;SPAN class=403183203-28032005&gt;&lt;FONT color=#0000ff&gt;
&lt;P&gt;&lt;FONT face=Verdana size=1&gt;#include&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face=Verdana size=1&gt; "stdafx.h"&lt;BR&gt;&lt;FONT color=#0000ff&gt;#include&lt;/FONT&gt; "windows.h"&lt;SPAN class=403183203-28032005&gt; &lt;FONT color=#008000&gt;//Required by MSI.h&lt;/FONT&gt;&lt;/SPAN&gt;&lt;BR&gt;&lt;FONT color=#0000ff&gt;#include&lt;/FONT&gt; "XmlTasksManaged.h"&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=1&gt;&lt;FONT color=#0000ff&gt;&lt;FONT color=#008000&gt;//The MSI Stuff&lt;/FONT&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;#include&lt;/FONT&gt; "Msi.h"&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN class=403183203-28032005&gt;&lt;FONT face=Verdana size=1&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=1&gt;&lt;FONT color=#0000ff&gt;#include&lt;/FONT&gt; "MsiQuery.h"&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#008000&gt;&lt;BR&gt;&lt;FONT face=Verdana size=1&gt;//.NET Stuff goes here&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=1&gt;&lt;FONT color=#0000ff&gt;using&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;namespace&lt;/FONT&gt; System;&lt;BR&gt;&lt;FONT color=#0000ff&gt;using&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;namespace&lt;/FONT&gt; System::IO;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN class=403183203-28032005&gt;&lt;FONT face=Verdana size=1&gt; &lt;/FONT&gt;&lt;FONT face=Verdana color=#008000 size=1&gt;//For the FileInfo Object&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=1&gt;&lt;FONT color=#0000ff&gt;using&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;namespace&lt;/FONT&gt; System::Collections;&lt;SPAN class=403183203-28032005&gt; &lt;/SPAN&gt;&lt;FONT color=#008000&gt;//&lt;SPAN class=403183203-28032005&gt;For the IEnumerator&lt;/SPAN&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;FONT color=#0000ff&gt;using&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;namespace&lt;/FONT&gt; System::Xml;&lt;SPAN class=403183203-28032005&gt; &lt;FONT color=#008000&gt;//The XML Stuff&lt;/FONT&gt;&lt;/SPAN&gt;&lt;BR&gt;&lt;FONT color=#0000ff&gt;using&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;namespace&lt;/FONT&gt; System::Runtime::InteropServices;&lt;SPAN class=403183203-28032005&gt; &lt;FONT color=#008000&gt;//For the Marshal object&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=+0&gt;&lt;FONT color=#008000 size=1&gt;&lt;SPAN class=403183203-28032005&gt;&lt;SPAN class=403183203-28032005&gt;&lt;FONT face=Verdana color=#000000 size=2&gt;As mentioned earlier the Namespace support is still not included.&amp;nbsp;It is not a very difficult&amp;nbsp;functionality to add.&amp;nbsp;We can pass it to the CustomActionData property. We can then cut and slice the CustomActionData property as we please. &amp;lt;smile/&amp;gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=27473"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=27473" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/Vagmi.Mudumbai/aggbug/27473.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Vagmi Mudumbai</dc:creator>
            <guid>http://geekswithblogs.net/Vagmi.Mudumbai/archive/2005/03/28/27473.aspx</guid>
            <pubDate>Tue, 29 Mar 2005 01:55:00 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/Vagmi.Mudumbai/comments/27473.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/Vagmi.Mudumbai/archive/2005/03/28/27473.aspx#feedback</comments>
            <slash:comments>15</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/Vagmi.Mudumbai/comments/commentRss/27473.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/Vagmi.Mudumbai/services/trackbacks/27473.aspx</trackback:ping>
        </item>
    </channel>
</rss>