<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Much Rice</title>
	<atom:link href="http://bahuvrihi.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://bahuvrihi.wordpress.com</link>
	<description>Adjectives and Nouns</description>
	<lastBuildDate>Tue, 08 Sep 2009 15:45:32 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='bahuvrihi.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/2ab066697b21225f9c032add8ee3343e?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>Much Rice</title>
		<link>http://bahuvrihi.wordpress.com</link>
	</image>
			<item>
		<title>Modules and Ancestors</title>
		<link>http://bahuvrihi.wordpress.com/2009/09/07/modules-and-ancestors/</link>
		<comments>http://bahuvrihi.wordpress.com/2009/09/07/modules-and-ancestors/#comments</comments>
		<pubDate>Tue, 08 Sep 2009 03:58:08 +0000</pubDate>
		<dc:creator>bahuvrihi</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://bahuvrihi.wordpress.com/?p=90</guid>
		<description><![CDATA[In studying the inheritance of methods I came across what I consider a surprising behavior of modules included into classes. 
First, when you include a module into a class, the module methods are available in the class and they also propagate down to subclasses.  This is reflected in the fact that the module is [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bahuvrihi.wordpress.com&blog=1395556&post=90&subd=bahuvrihi&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>In studying the inheritance of methods I came across what I consider a surprising behavior of modules included into classes. </p>
<p>First, when you include a module into a class, the module methods are available in the class and they also propagate down to subclasses.  This is reflected in the fact that the module is added to the ancestors of both the including class and all subclasses (be the defined before or after the include).</p>
<pre style="overflow:auto;color:#321987;font-size:1.2em;">
class LateIntoClassTest &lt; Test::Unit::TestCase

  class A
  end

  class B &lt; A
  end

  module LateInClass
  end

  class A
    include LateInClass
  end

  class C &lt; A
  end

  def test_including_a_module_into_a_superclass_adds_to_ancestors
    # LateInClass is added to A
    assert_equal [A, LateInClass, Object, Kernel], A.ancestors

    # LateInClass is added to B
    assert_equal [B, A, LateInClass, Object, Kernel], B.ancestors

    # LateInClass is added to C
    assert_equal [C, A, LateInClass, Object, Kernel], C.ancestors
  end
end</pre>
<p>What is surprising (at least to me), is that the same is not true when you include a module into an included module.  I thought modules were kind of like superclasses; if you add to a module then you add to everything that uses the module. Not so.</p>
<p>Here you can see LateInModule is not added to classes that already include A.  By contrast, classes defined after the &#8216;late&#8217; include will add LateInModule to their ancestors.</p>
<pre style="overflow:auto;color:#321987;font-size:1.2em;">
class LateIntoModuleTest &lt; Test::Unit::TestCase

  module A
  end

  class B
    include A
  end

  module LateInModule
  end

  module A
    include LateInModule
  end

  class C
    include A
  end

  def test_including_into_an_included_module_DOES_NOT_add_to_ancestors
    # LateInModule is added to A
    assert_equal [A, LateInModule], A.ancestors

    # LateInModule is missing from B
    assert_equal [B, A, Object, Kernel], B.ancestors

    # LateInModule is added to C
    assert_equal [C, A, LateInModule, Object, Kernel], C.ancestors
  end
end</pre>
<p>You might take from this the lesson that modules are not superclasses, they are collections of methods poured into a class by include.  But that isn&#8217;t the full story either.  After all, you can modify a module and still have those changes propagate into an including class.</p>
<pre style="overflow:auto;color:#321987;font-size:1.2em;">
class LateModuleModificationTest &lt; Test::Unit::TestCase

  module A
  end

  class B
    include A
  end

  module A
    def late_method; true; end
  end

  def test_included_modules_MAY_be_modified
    assert_equal true, B.new.late_method
  end
end</pre>
<p>I find it tricky to express this behavior descriptively, even though the cause is clear; modules only add to ancestors when first included in a class.  </p>
<p><em>Update: for those who are interested, Redmine <a href="http://redmine.ruby-lang.org/issues/show/1586">has a feature request</a> regarding how modules get added to ancestors.</em></p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/bahuvrihi.wordpress.com/90/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/bahuvrihi.wordpress.com/90/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/bahuvrihi.wordpress.com/90/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/bahuvrihi.wordpress.com/90/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/bahuvrihi.wordpress.com/90/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/bahuvrihi.wordpress.com/90/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/bahuvrihi.wordpress.com/90/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/bahuvrihi.wordpress.com/90/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/bahuvrihi.wordpress.com/90/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/bahuvrihi.wordpress.com/90/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bahuvrihi.wordpress.com&blog=1395556&post=90&subd=bahuvrihi&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://bahuvrihi.wordpress.com/2009/09/07/modules-and-ancestors/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2e2d8c8ff86e18bf49f777f39028823e?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">bahuvrihi</media:title>
		</media:content>
	</item>
		<item>
		<title>RubyConf 2008</title>
		<link>http://bahuvrihi.wordpress.com/2008/11/09/rubyconf-2008/</link>
		<comments>http://bahuvrihi.wordpress.com/2008/11/09/rubyconf-2008/#comments</comments>
		<pubDate>Sun, 09 Nov 2008 14:15:16 +0000</pubDate>
		<dc:creator>bahuvrihi</dc:creator>
				<category><![CDATA[Gems]]></category>
		<category><![CDATA[tap]]></category>

		<guid isPermaLink="false">http://bahuvrihi.wordpress.com/?p=71</guid>
		<description><![CDATA[Just finished presenting Tap at this year&#8217;s RubyConf.  Here are the slides.
Tap &#8211;[Not] a Talk About Replacing Rake
       <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bahuvrihi.wordpress.com&blog=1395556&post=71&subd=bahuvrihi&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Just finished presenting <a title="Tap (Task Application)" href="http://tap.rubyforge.org">Tap</a> at this year&#8217;s RubyConf.  Here are the slides.</p>
<p><a title="View Tap --[Not] a Talk About Replacing Rake document on Scribd" href="http://www.scribd.com/doc/7841001/Tap-Not-a-Talk-About-Replacing-Rake">Tap &#8211;[Not] a Talk About Replacing Rake</a></p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/bahuvrihi.wordpress.com/71/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/bahuvrihi.wordpress.com/71/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/bahuvrihi.wordpress.com/71/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/bahuvrihi.wordpress.com/71/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/bahuvrihi.wordpress.com/71/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/bahuvrihi.wordpress.com/71/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/bahuvrihi.wordpress.com/71/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/bahuvrihi.wordpress.com/71/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/bahuvrihi.wordpress.com/71/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/bahuvrihi.wordpress.com/71/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bahuvrihi.wordpress.com&blog=1395556&post=71&subd=bahuvrihi&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://bahuvrihi.wordpress.com/2008/11/09/rubyconf-2008/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2e2d8c8ff86e18bf49f777f39028823e?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">bahuvrihi</media:title>
		</media:content>
	</item>
		<item>
		<title>Entering a newline on Windows</title>
		<link>http://bahuvrihi.wordpress.com/2008/10/12/entering-a-newline-on-windows/</link>
		<comments>http://bahuvrihi.wordpress.com/2008/10/12/entering-a-newline-on-windows/#comments</comments>
		<pubDate>Sun, 12 Oct 2008 16:19:07 +0000</pubDate>
		<dc:creator>bahuvrihi</dc:creator>
				<category><![CDATA[Snippits]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://bahuvrihi.wordpress.com/?p=64</guid>
		<description><![CDATA[Getting a line feed into an input on *nix is pretty easy, all you do is hit return in the middle of a quoted input:
  % ruby -e 'puts ARGV.inspect' 'line one
  &#62; line two'
  ["line one\nline two"]
On Windows, it&#8217;s more verbose.  Use a caret, the MS-DOS escape character, to ignore the [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bahuvrihi.wordpress.com&blog=1395556&post=64&subd=bahuvrihi&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Getting a line feed into an input on *nix is pretty easy, all you do is hit return in the middle of a quoted input:</p>
<pre style="overflow:auto;color:#321987;">  % ruby -e 'puts ARGV.inspect' 'line one
  &gt; line two'
  ["line one\nline two"]</pre>
<p>On Windows, it&#8217;s more verbose.  Use a caret, the MS-DOS escape character, to ignore the next line feed:</p>
<pre style="overflow:auto;color:#321987;">  % ruby -e 'puts ARGV.inspect' 'line one^
  More?
  More? line two'
  ["line one\nline two"]</pre>
<p>Notice that pressing enter <em>every other line</em> is what actually puts the &#8220;\n&#8221; into the argument .  Keep using carets to enter more lines.</p>
<p>The syntax on Windows isn&#8217;t exactly pretty, and sadly it doesn&#8217;t work with gem executables; the .bat scripts generated by rubygems re-processes inputs before calling the .rb executable and the extra lines get lost in translation.  Still, it&#8217;s nice to know it&#8217;s (sort-of) possible!</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/bahuvrihi.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/bahuvrihi.wordpress.com/64/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/bahuvrihi.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/bahuvrihi.wordpress.com/64/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/bahuvrihi.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/bahuvrihi.wordpress.com/64/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/bahuvrihi.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/bahuvrihi.wordpress.com/64/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/bahuvrihi.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/bahuvrihi.wordpress.com/64/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bahuvrihi.wordpress.com&blog=1395556&post=64&subd=bahuvrihi&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://bahuvrihi.wordpress.com/2008/10/12/entering-a-newline-on-windows/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2e2d8c8ff86e18bf49f777f39028823e?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">bahuvrihi</media:title>
		</media:content>
	</item>
		<item>
		<title>Require/Load Profiler</title>
		<link>http://bahuvrihi.wordpress.com/2008/08/16/requireload-profiler/</link>
		<comments>http://bahuvrihi.wordpress.com/2008/08/16/requireload-profiler/#comments</comments>
		<pubDate>Sat, 16 Aug 2008 21:47:00 +0000</pubDate>
		<dc:creator>bahuvrihi</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://bahuvrihi.wordpress.com/?p=57</guid>
		<description><![CDATA[I&#8217;ve been trying to speed up the command line response of tap by judiciously loading only what needs be loaded up front.  This script has proven quite helpful&#8230; it&#8217;s a profiler for require/load.  Simply add the requires you want to profile at the end of the script and run it from the command line:
 [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bahuvrihi.wordpress.com&blog=1395556&post=57&subd=bahuvrihi&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>I&#8217;ve been trying to speed up the command line response of <a href="http://bahuvrihi.wordpress.com/2008/08/08/distributable-tasks-and-workflows/">tap</a> by judiciously loading only what needs be loaded up front.  <a href="http://gist.github.com/5732">This script</a> has proven quite helpful&#8230; it&#8217;s a profiler for require/load.  Simply add the requires you want to profile at the end of the script and run it from the command line:</p>
<pre style="overflow:auto;color:#321987;">  % ruby profile_load_time.rb
  ================================================================================
  Require/Load Profile (time in ms)
  * Load times &gt; 0.5 ms
  - duplicate requires
  ================================================================================
  * 21.6: yaml
  *   0.5: stringio
      0.2: yaml/error
  *   2.1: yaml/syck
  *     0.7: syck
  *     1.2: yaml/basenode
          0.3: yaml/ypath
      0.3: yaml/tag
      0.3: yaml/stream
      0.3: yaml/constants
  *   15.9: yaml/rubytypes
  *     11.8: date
  *       1.2: rational
  *       4.0: date/format
  -         0.1: rational
  *   0.9: yaml/types</pre>
<p>The output flags <tt>requires</tt> that take longer than 0.5 ms, and <tt>requires</tt> that occur multiple times.  Long requires are often good candidates for autoload&#8230; if you want to have YAML available but feel 22 ms is too long to wait up front:</p>
<pre style="overflow:auto;color:#321987;">  autoload(:YAML, 'yaml')</pre>
<p>Then the file will be required the first time YAML gets used, if at all.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/bahuvrihi.wordpress.com/57/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/bahuvrihi.wordpress.com/57/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/bahuvrihi.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/bahuvrihi.wordpress.com/57/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/bahuvrihi.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/bahuvrihi.wordpress.com/57/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/bahuvrihi.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/bahuvrihi.wordpress.com/57/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/bahuvrihi.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/bahuvrihi.wordpress.com/57/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/bahuvrihi.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/bahuvrihi.wordpress.com/57/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bahuvrihi.wordpress.com&blog=1395556&post=57&subd=bahuvrihi&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://bahuvrihi.wordpress.com/2008/08/16/requireload-profiler/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2e2d8c8ff86e18bf49f777f39028823e?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">bahuvrihi</media:title>
		</media:content>
	</item>
		<item>
		<title>Distributable Tasks and Workflows</title>
		<link>http://bahuvrihi.wordpress.com/2008/08/08/distributable-tasks-and-workflows/</link>
		<comments>http://bahuvrihi.wordpress.com/2008/08/08/distributable-tasks-and-workflows/#comments</comments>
		<pubDate>Fri, 08 Aug 2008 14:08:35 +0000</pubDate>
		<dc:creator>bahuvrihi</dc:creator>
				<category><![CDATA[Gems]]></category>

		<guid isPermaLink="false">http://bahuvrihi.wordpress.com/?p=26</guid>
		<description><![CDATA[I ran into trouble when I tried turning rake into something it is not.  Rake is a build program designed for build-like tasks; rake is not a platform for general-purpose task libraries.  Given it&#8217;s design goals, rake very sensibly does not facilitate extensive documentation (who needs it to compile something),  inputs (although this [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bahuvrihi.wordpress.com&blog=1395556&post=26&subd=bahuvrihi&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>I ran into trouble when I tried turning rake into something it is not.  Rake is a build program designed for build-like tasks; rake is not a platform for general-purpose task libraries.  Given it&#8217;s design goals, rake very sensibly does not facilitate extensive documentation (who needs it to compile something),  inputs (although this has changed somewhat), configuration, testing, or distribution.</p>
<p>It&#8217;s also a dependency-based system; workflows constructed by rake are synthesized in reverse &#8212; it&#8217;ll be you, not your program, that gets forked when you try to make an imperative workflow.  It&#8217;s simply the nature of rake!  Rake is an <em>excellent </em>build program, but these types of things are in a different domain.</p>
<h3><strong><a href="http://tap.rubyforge.org">Tap (Task Application)</a></strong></h3>
<p>Tap was originally designed as a simple workflow engine, but it&#8217;s evolved into a general-purpose framework for creating configurable, distributable task libraries.  Tap tasks can be defined in much the same way as a Rake task:</p>
<pre style="overflow:auto;color:#321987;font-size:1.2em;">  # Goodnight::manifest your basic goodnight moon task
  # Prints the input with a configurable message.
  Tap.task 'goodnight', {:message=&gt; 'goodnight'} do |task, input|
    task.log task.message, input
    "#{task.message} #{input}"
  end</pre>
<p>Tap pulls documentation out of task declarations to generate manifests:</p>
<pre style="overflow:auto;color:#321987;font-size:1.2em;">  % tap run -T
  sample:
    goodnight # your basic goodnight moon task
  tap:
    dump # the default dump task
    rake # run rake tasks</pre>
<p>And help:</p>
<pre style="overflow:auto;color:#321987;font-size:1.2em;">  % tap run -- goodnight --help
  Goodnight -- your basic goodnight moon task
  ------------------------------------------------------------------
    Says goodnight with a configurable message.
  ------------------------------------------------------------------
  usage: tap run -- goodnight NAME

  configurations:
          --message MESSAGE a goodnight message

  options:
      -h, --help Print this help
          --name NAME Specify a name
          --use FILE Loads inputs from file</pre>
<p>Tasks are immediately available to run with inputs and configurations:</p>
<pre style="overflow:auto;color:#321987;font-size:1.2em;">  % tap run -- goodnight moon
    I[00:09:55] goodnight moon

  % tap run -- goodnight moon --message hello
    I[00:10:01] hello moon</pre>
<p>Task declarations define classes which naturally support namespaces, subclassing and testing.   When the shorthand declaration is not enough, task classes can be defined in the standard way:</p>
<pre style="overflow:auto;color:#321987;font-size:1.2em;">  # Hello::manifest a hello world task
  # A more complicated hello world task illustrating
  # config blocks and a full task class definition.
  #
  class Hello &lt; Tap::Task

    config :greeting, 'hello', &amp;c.string    # a greeting string
    config :reverse, false, &amp;c.flag         # maps to a flag

    def process(name)
      message = reverse ? greeting.reverse : greeting

      log message, name
      "#{message} #{name} result"
    end
  end

  task = Hello.new
  task.process('world')     # =&gt; "hello world result"
  task.reverse = true
  task.process('world')     # =&gt; "olleh world result"
  task.greeting = :symbol   # !&gt; ValidationError</pre>
<p>Configurations map to methods and can utilize a validation/transformation block.  Tap defines a number of common blocks (ex c.integer, c.regexp, etc.) that may also imply metadata for the command line (ex c.flag):</p>
<pre style="overflow:auto;color:#321987;font-size:1.2em;">  % tap run -- hello world --reverse
  I[20:04:33]              olleh world</pre>
<h3>Distribution</h3>
<p>Tap supports distribution of tasks as gems.  To illustrate, say we installed the <a href="http://tap.rubyforge.org/sample_tasks">sample_tasks</a> gem.  Now our manifest looks like this:</p>
<pre style="overflow:auto;color:#321987;font-size:1.2em;">  % tap run -T
  sample:
    goodnight   # your basic goodnight moon task
    hello       # a hello world task
  sample_tasks:
    concat      # concatenate files with formatting
    copy        # copies files
    grep        # search for lines matching a pattern
    print_tree  # print a directory tree
  tap:
    dump        # the default dump task
    rake        # run rake tasks</pre>
<p>Tap checks the installed gems for a &#8216;tap.yml&#8217; configuration file or a &#8216;tapfile.rb&#8217; task file; any gems with one (or both) of these files gets pulled into the execution environment.  Now tasks can be specified either by a short name when there isn&#8217;t a name conflict (ex goodnight, print_tree), or by a full name that includes the environment (ex sample:goodnight, sample_tasks:print_tree).</p>
<pre style="overflow:auto;color:#321987;font-size:1.2em;">  % tap run -- sample_tasks:print_tree .
  .
  |- Rakefile
  |- lib
  |- sample.gemspec
  |- tapfile.rb
  `- test
      |- tap_test_helper.rb
      |- tap_test_suite.rb
      `- tapfile_test.rb</pre>
<p>Not bad, eh?</p>
<h3>Workflows and the Roadmap</h3>
<p>Tap support simple workflows in the imperative style.  Tasks can be assigned an on_complete block that executes when the task completes, allowing results to be examined and new tasks to be enqued as needed.</p>
<pre style="overflow:auto;color:#321987;font-size:1.2em;">  app = Tap::App.instance
  t1 = Tap.task('t1') {|t| 'hellO'}
  t2 = Tap.task('t2') {|t, input| input + ' woRld' }
  t3 = Tap.task('t3') {|t, input| input.downcase }
  t4 = Tap.task('t4') {|t, input| input.upcase }
  t5 = Tap.task('t5') {|t, input| input + "!" }

  # sequence t1, t2
  app.sequence(t1, t2)

  # fork t2 results to t3 and t4
  app.fork(t2, t3, t4)

  # unsynchronized merge of t3 and t4 into t5
  app.merge(t5, t3, t4)

  app.enq(t1)
  app.run

  app.results(t5)       # =&gt; ["hello world!", "HELLO WORLD!"]</pre>
<p>True support for workflows from the command line is lacking right now, but it will be coming soon.  Here&#8217;s a short list of what else is planned:</p>
<ul>
<li>Global Rake Tasks (hopefully!).  I should be able to find and load rakefiles using the Tap execution environment.  Tap already allows you to incorporate local rake tasks into a workflow using the &#8216;rake&#8217; task.</li>
<li>Tap server.  In a small-group environment where some people are computer savvy and others aren&#8217;t, it would be really useful to serve up your tasks using a web interface.</li>
<li>More test support.  Tap provides several modules for testing tasks and supporting common types of tasks (ex file transformation tasks).  Currently the modules are a bit incomplete, and they&#8217;re only geared towards Test::Unit.  I&#8217;d like to add support for RSpec in the future.</li>
</ul>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/bahuvrihi.wordpress.com/26/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/bahuvrihi.wordpress.com/26/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/bahuvrihi.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/bahuvrihi.wordpress.com/26/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/bahuvrihi.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/bahuvrihi.wordpress.com/26/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/bahuvrihi.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/bahuvrihi.wordpress.com/26/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/bahuvrihi.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/bahuvrihi.wordpress.com/26/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/bahuvrihi.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/bahuvrihi.wordpress.com/26/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bahuvrihi.wordpress.com&blog=1395556&post=26&subd=bahuvrihi&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://bahuvrihi.wordpress.com/2008/08/08/distributable-tasks-and-workflows/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2e2d8c8ff86e18bf49f777f39028823e?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">bahuvrihi</media:title>
		</media:content>
	</item>
		<item>
		<title>Parsing HTTP requests with Ruby</title>
		<link>http://bahuvrihi.wordpress.com/2008/01/08/parsing-http-requests-with-ruby/</link>
		<comments>http://bahuvrihi.wordpress.com/2008/01/08/parsing-http-requests-with-ruby/#comments</comments>
		<pubDate>Wed, 09 Jan 2008 06:10:20 +0000</pubDate>
		<dc:creator>bahuvrihi</dc:creator>
				<category><![CDATA[Snippits]]></category>
		<category><![CDATA[ruby http code webrick parse]]></category>

		<guid isPermaLink="false">http://bahuvrihi.wordpress.com/2008/01/08/parsing-http-requests-with-ruby/</guid>
		<description><![CDATA[Most of the time a web server parses HTTP requests before you get access to them in your code.  Time to time however, it&#8217;s nice to actually see what the HTTP from a web form looks like, and you may have manipulate the message programatically.
Firefox has a plugin called LiveHTTPHeaders that lets you capture [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bahuvrihi.wordpress.com&blog=1395556&post=18&subd=bahuvrihi&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Most of the time a web server parses HTTP requests before you get access to them in your code.  Time to time however, it&#8217;s nice to actually see what the HTTP from a web form looks like, and you may have manipulate the message programatically.</p>
<p>Firefox has a plugin called <a href="http://livehttpheaders.mozdev.org/">LiveHTTPHeaders</a> that lets you capture and view HTTP requests as they get sent out.  These you can save to files and then load into Ruby using the following code:</p>
<pre style="overflow:auto;color:#321987;font-size:1.2em;">
  require 'webrick'  req = WEBrick::HTTPRequest.new(WEBrick::Config::HTTP)

  File.open("path/to/http.txt', 'rb') do |socket|
    req.parse(socket)
  end</pre>
<p>Now req can be used as any other WEBrick::HTTPRequest.  The input to parse can be any IO (like File or StringIO).  The request will begin parsing an HTTP header from wherever the IO is positioned, and continues parsing until it reaches an empty line.  This method works with multipart/form data as well.  For example:</p>
<pre style="overflow:auto;color:#321987;font-size:1.2em;">
  POST /path HTTP/1.1
  Content-Type: multipart/form-data; boundary=1234567890
  Content-Length: 158

  --1234567890
  Content-Disposition: form-data; name="one"

  value one
  --1234567890
  Content-Disposition: form-data; name="two"

  value two
  --1234567890--</pre>
<p>Used in conjunction with the code above, this message result in the following:</p>
<pre style="overflow:auto;color:#321987;font-size:1.2em;">
  req.header   # =&gt; {"content-type" =&gt; ["multipart/form-data; boundary=1234567890"],
                     "content-length" =&gt; ["158"]}
  req.query     # =&gt; {"one" =&gt; "value one", "two" =&gt; "value two"}</pre>
<p>A couple notes about parsing HTTP using WEBrick in the current (1.8.6) version of Ruby:</p>
<ul>
<li>As mentioned, WEBrick considers an empty line as a break between the headers and body of a message.  The capture for multipart/form requests from LiveHTTPHeaders lacks this breaks, so you&#8217;ll have to add it if you&#8217;re using that tool.  You should be ok if you&#8217;re parsing a non-multipart request.</li>
<li>Header parsing is forgiving with end-line characters (ie &#8220;\r\n&#8221; and &#8220;\n&#8221; are both acceptable) but parsing of multipart/form data IS NOT.  Multipart/form data requires that the end-line characters are &#8220;\r\n&#8221;.  On Windows, therefore, it is absolutely ESSENTIAL to open file data in binary mode (ex &#8216;rb&#8217;, as above) to preserve these characters.</li>
</ul>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/bahuvrihi.wordpress.com/18/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/bahuvrihi.wordpress.com/18/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/bahuvrihi.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/bahuvrihi.wordpress.com/18/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/bahuvrihi.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/bahuvrihi.wordpress.com/18/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/bahuvrihi.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/bahuvrihi.wordpress.com/18/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/bahuvrihi.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/bahuvrihi.wordpress.com/18/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/bahuvrihi.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/bahuvrihi.wordpress.com/18/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bahuvrihi.wordpress.com&blog=1395556&post=18&subd=bahuvrihi&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://bahuvrihi.wordpress.com/2008/01/08/parsing-http-requests-with-ruby/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2e2d8c8ff86e18bf49f777f39028823e?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">bahuvrihi</media:title>
		</media:content>
	</item>
		<item>
		<title>JoinFix &#8211; Inline Fixtures</title>
		<link>http://bahuvrihi.wordpress.com/2007/12/09/joinfix-inline-fixtures/</link>
		<comments>http://bahuvrihi.wordpress.com/2007/12/09/joinfix-inline-fixtures/#comments</comments>
		<pubDate>Sun, 09 Dec 2007 15:45:20 +0000</pubDate>
		<dc:creator>bahuvrihi</dc:creator>
				<category><![CDATA[Gems]]></category>

		<guid isPermaLink="false">http://bahuvrihi.wordpress.com/2007/12/09/joinfix-inline-fixtures/</guid>
		<description><![CDATA[This last summer I finished the joinfix gem providing a solution to the fixture join problem &#8212; mainly that it&#8217;s a pain to create fixtures by specifying entry ids across multiple fixture files.  When Mike Clark and Chad Fowler opened up submissions for Advanced Rails Recipies, I sent JoinFix to them and it was [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bahuvrihi.wordpress.com&blog=1395556&post=17&subd=bahuvrihi&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>This last summer I finished the <a href="http://rubyforge.org/projects/joinfix">joinfix gem</a> providing a solution to the fixture join problem &#8212; mainly that it&#8217;s a pain to create fixtures by specifying entry ids across multiple fixture files.  When Mike Clark and Chad Fowler opened up submissions for <a href="http://pragprog.com/titles/fr_arr">Advanced Rails Recipies</a>, I sent JoinFix to them and it was accepted.</p>
<p>I took a look at the new <a href="http://ryandaigle.com/articles/2007/10/26/what-s-new-in-edge-rails-fixtures-just-got-a-whole-lot-easier">Foxy Fixtures</a> in <a href="http://weblog.rubyonrails.org/2007/12/7/rails-2-0-it-s-done">Rails 2.0</a> and was shocked/pleased to find something similar has gotten incorporated directly into the core.  Goes to show how problematic fixtures really were.  JoinFix still is interesting, however, mainly because JoinFix lets you define entries inline.</p>
<p>Consider the following data model:</p>
<pre style="overflow:auto;color:#321987;">
  class User &lt; ActiveRecord::Base  has_many :user_groups
    has_many :groups, :through =&gt; :user_groups
  end

  class Group &lt; ActiveRecord::Base
    has_many :user_groups
    has_many :users, :through =&gt; :user_groups
  end

  class UserGroup &lt; ActiveRecord::Base
    belongs_to :user
    belongs_to :group
  end
</pre>
<p>You can write your fixtures using the naming scheme you lay out in your models, referencing entries across multiple fixture files (similar to Foxy) or you can define them inline:</p>
<pre style="overflow:auto;color:#321987;">
   [users.yml]
   john_doe:
     full_name: John Doe
     groups: admin_group   # =&gt; reference to the 'admin_group' entry

   jane_doe:
     full_name: Jane Doe
     groups:               # =&gt; you can specify an array of entries if needed
       - admin_group
       - worker_group:     # =&gt; inline definition of the 'worker_group' entry
           name: Workers

   [groups.yml]
   admin_group:            # =&gt; the referenced 'admin_group' entry
     id: 3                 # =&gt; you can (but don't have to) specify ids
     name: Administrators
</pre>
<p>Join entries implied in your definition, as in a has_and_belongs_to_many association, will be created and named by joining together the names of the parent and child, ordered by the ’&lt;’ operator. For example, the users.yml and groups.yml fixtures produce these entries:</p>
<pre style="overflow:auto;color:#321987;">
  [users]
  john_doe:
    id: 1                  # =&gt; primary keys are assigned to all entries
    full_name: John Doe
  jane_doe:
    id: 2
    full_name: Jane Doe

  [groups]
  admin_group:
    id: 3
    name: Administrators
  worker_group:
    id: 1
    name: Workers

  [user_groups]
  admin_group_john_doe
    id: 1
    user_id: 1             # =&gt; references are resolved to their foreign keys
    group_id: 3            # =&gt; explicitly set primary keys are respected
  admin_group_jane_doe
    id: 2
    user_id: 2
    group_id: 3
  jane_doe_worker_group    # =&gt; Notice the '&lt;' operator in action
    id: 3
    user_id: 2
    group_id: 1
</pre>
<p>Nesting is allowed. This will make the same entries as above:</p>
<pre style="overflow:auto;color:#321987;">
  [users.yml]
  john_doe:
    full_name: John Doe
    groups:
      admin_group:
        id: 3
        name: Administrators
        users:
          jane_doe:
            full_name: Jane Doe
            groups:
              worker_group:
                name: Workers
</pre>
<p>In this final form, <a href="http://rubyforge.org/projects/joinfix">JoinFix</a> defines a highly-involved fixture in one chunk, in one file.  This can be a BIG advantage when you try to test some cross-table, complicated lookup.  The full fixture is centralized and easy to manage.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/bahuvrihi.wordpress.com/17/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/bahuvrihi.wordpress.com/17/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/bahuvrihi.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/bahuvrihi.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/bahuvrihi.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/bahuvrihi.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/bahuvrihi.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/bahuvrihi.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/bahuvrihi.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/bahuvrihi.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/bahuvrihi.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/bahuvrihi.wordpress.com/17/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bahuvrihi.wordpress.com&blog=1395556&post=17&subd=bahuvrihi&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://bahuvrihi.wordpress.com/2007/12/09/joinfix-inline-fixtures/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2e2d8c8ff86e18bf49f777f39028823e?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">bahuvrihi</media:title>
		</media:content>
	</item>
		<item>
		<title>Small Pebble</title>
		<link>http://bahuvrihi.wordpress.com/2007/08/08/small-pebble/</link>
		<comments>http://bahuvrihi.wordpress.com/2007/08/08/small-pebble/#comments</comments>
		<pubDate>Thu, 09 Aug 2007 04:09:49 +0000</pubDate>
		<dc:creator>bahuvrihi</dc:creator>
				<category><![CDATA[2000 Words]]></category>

		<guid isPermaLink="false">http://bahuvrihi.wordpress.com/2007/08/08/small-pebble/</guid>
		<description><![CDATA[calculus n. A branch of math dealing with derivatives and integrals, based on the summation of infinitesimal differences.  The beauty is the origin of the word – Latin “small pebble” – as in the stones used on an abacus.  I like the thought of making those summations one calculus at a time.  [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bahuvrihi.wordpress.com&blog=1395556&post=11&subd=bahuvrihi&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><strong>calculus</strong> n. A branch of math dealing with derivatives and integrals, based on the summation of infinitesimal differences.  The beauty is the origin of the word – Latin “small pebble” – as in the stones used on an abacus.  I like the thought of making those summations one calculus at a time.  Also a medical term for kidney/gall stones.</p>
<p><strong>nervure</strong> n. Entomology: each of the hollow veins forming the framework of an insect’s wings.  Botany: the principal vein on a leaf.  (note the small spaces between nervure are <strong>areola</strong>, from Latin “small open space”.  I like this other, less-well-known meaning.  It adds something nice to the commonly known meaning.)</p>
<p style="float:right;margin-left:10px;margin-bottom:10px;">
<p style="float:right;margin-left:10px;margin-bottom:10px;"><a title="photo sharing" href="http://www.flickr.com/photos/bukutgirl/67674426/"><img style="border:2px solid #000000;" src="http://farm1.static.flickr.com/25/67674426_3ce06dedd9_m.jpg" alt="" /></a></p>
<p><strong>soubriquet</strong> n. A person’s nickname.</p>
<p class="goalprogresslink">See more progress on: <a href="http://www.43things.com/people/progress/bahuvrihi?on=7788949">learn 2000 words</a></p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/bahuvrihi.wordpress.com/11/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/bahuvrihi.wordpress.com/11/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/bahuvrihi.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/bahuvrihi.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/bahuvrihi.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/bahuvrihi.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/bahuvrihi.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/bahuvrihi.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/bahuvrihi.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/bahuvrihi.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/bahuvrihi.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/bahuvrihi.wordpress.com/11/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bahuvrihi.wordpress.com&blog=1395556&post=11&subd=bahuvrihi&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://bahuvrihi.wordpress.com/2007/08/08/small-pebble/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2e2d8c8ff86e18bf49f777f39028823e?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">bahuvrihi</media:title>
		</media:content>

		<media:content url="http://farm1.static.flickr.com/25/67674426_3ce06dedd9_m.jpg" medium="image" />
	</item>
		<item>
		<title>A good start</title>
		<link>http://bahuvrihi.wordpress.com/2007/08/08/a-good-start/</link>
		<comments>http://bahuvrihi.wordpress.com/2007/08/08/a-good-start/#comments</comments>
		<pubDate>Thu, 09 Aug 2007 04:08:08 +0000</pubDate>
		<dc:creator>bahuvrihi</dc:creator>
				<category><![CDATA[2000 Words]]></category>

		<guid isPermaLink="false">http://bahuvrihi.wordpress.com/2007/08/08/a-good-start/</guid>
		<description><![CDATA[I have loved words forever.  Years ago I had a large vocabulary – I especially liked rare words because they so often capture life exactly.
I’ve got a book.  It’s called 2000 Most Challenging and Obscure Words.  I’ve had it for ages.  Yes I read the dictionary, and yeah, I dig it.
So, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bahuvrihi.wordpress.com&blog=1395556&post=12&subd=bahuvrihi&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p class="goalentry">I have loved words forever.  Years ago I had a large vocabulary – I especially liked rare words because they so often capture life exactly.</p>
<p>I’ve got a book.  It’s called 2000 Most Challenging and Obscure Words.  I’ve had it for ages.  Yes I read the dictionary, and yeah, I dig it.</p>
<p>So, to start, here are three words with definitions lifted from the 2000 words book:</p>
<p><strong>etymon</strong> (ET uh mon) n.  The original root or true origin of a word.</p>
<p><strong>bahuvrihi</strong> (bah hooh <span class="caps">VREE</span> hee) n. A <em>bahuvrihi</em> is a compound noun or adjective consisting of two parts, an adjective and a noun, the combination describing someone or something characterized by  what is denoted by the noun.  Ex: <em>bluebell</em>, <em>bonehead</em>, <em>hard-hearted</em>, <em>redcoat</em>, <em>redhead</em>, and <em>bahuvrihi</em> itself which is a Sanskrit word meaning “with much rice”, based on <em>bohu-</em> (much) plus <em>vrihi</em> (rice).</p>
<p><strong>fundament</strong> (FUN duh munt) n. We are familiar with the adjective <em>fundamental</em>, a synonym of <em>basic</em>, <em>underlying</em>, which describes anything that goes to the root of the matter and is an essential part of whatever may be involved.  We speak of <em>fundamental</em> rules, <em>fundamental</em> principles, a <em>fundamental</em> change or revision, a <em>fundamental</em> concept or idea.  A far cry from <em>fundament</em> itself, meaning “buttox”, aka. the <em>arse</em>, <em>behind</em>, <em>derriere</em>, and <em>nates</em> with additional meaning, according to some dictionaries of “anus”, aka. the <em>ass-hole</em>, <em>bung-hole</em>, and lots of other disagreeable nicknames.  The <em>fundament</em>, then, refers to the lower part of the torso in general.</p>
<p class="goalprogresslink">See more progress on: <a href="http://www.43things.com/people/progress/bahuvrihi?on=7788949">learn 2000 words</a></p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/bahuvrihi.wordpress.com/12/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/bahuvrihi.wordpress.com/12/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/bahuvrihi.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/bahuvrihi.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/bahuvrihi.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/bahuvrihi.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/bahuvrihi.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/bahuvrihi.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/bahuvrihi.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/bahuvrihi.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/bahuvrihi.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/bahuvrihi.wordpress.com/12/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bahuvrihi.wordpress.com&blog=1395556&post=12&subd=bahuvrihi&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://bahuvrihi.wordpress.com/2007/08/08/a-good-start/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2e2d8c8ff86e18bf49f777f39028823e?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">bahuvrihi</media:title>
		</media:content>
	</item>
	</channel>
</rss>