<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>Open Source</title>
        <link>http://geekswithblogs.net/Vagmi.Mudumbai/category/2576.aspx</link>
        <description>My rants about open source.</description>
        <language>hi-IN</language>
        <copyright>Vagmi Mudumbai</copyright>
        <managingEditor>jjulian@geekswithblogs.net</managingEditor>
        <generator>Subtext Version 0.0.0.0</generator>
        <item>
            <title>Printing 42 - A not so straightforward Boo way</title>
            <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>
            <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>
            <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>Multi Platform versus Cross Platform</title>
            <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>
            <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>
            <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>
    </channel>
</rss>