[TFUI] Re: [XP] What's up with Rails?

"Phlip" <[email protected]> Fri, 1 Dec 2006 11:35:32 -0800
Newsgroups gmane.comp.programming.test-first-user-interfaces,gmane.comp.programming.extreme-programming
Message-ID <046401c7157f$de993180$81a1b04c@Marley>
--0iBPp0zTnWtjA5IZFOdJZdvP4x1dvn8PKPx8QQx
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: 7bit

Shane Mingins wrote:

> That currently would be my sentiment too.  I am hoping to use Rails
> more.

The best accolade for Ruby, so far, comes from the Pragmatic Programmers:

  Ruby stays out of your way

That's a good way to say that Ruby has a user-interface tuned for 
programmer's needs. (It's also an excuse why Ruby puts the needs of the 
programmer above those of the CPU!)

I thought of a similar accolade for Rails:

 Rails shortens the distances between two points

Under classical web programming, you typically must add a variable to both 
the SQL and HTML, then you must spend hours adding plumbing and 
infrastructure to link the two.

Rails flattens that problem. You can often add a variable to the SQL, match 
it in the HTML, and add _nothing_ in between. Rails took care of the 
plumbing for you. And if you need that variable in the controller layer, to 
add business logic, then it's usually ready and waiting for you.

> I have just read Cody Fauser's RJS Template for Rails which had
> a link about TDD RJS.  I have yet to try it out.  It may be of
> interest to you if you have not already seen it.
>
> http://glu.ttono.us/articles/2006/05/29/guide-test-driven-rjs-with-arts

I rebutt that effort (although I am almost about to use it myself). It's a 
good first start, but it's not really TDD as we know it. I will explain why, 
starting with a simpler HTML example.

(RJS is a module that generates JavaScript, so you can minimize swapping 
between languages, not worry about escapes, etc...)

If I wrote HTML, it might look like: <em>yo<strong>dude</em></strong>.

So this is not a good test for that:

 assert_equal '<em>yo<strong>dude</em></strong>', my_html

We wouldn't do that for TDD on the Logic Layer, so we shouldn't accept it 
for the GUI Layer. It only tests that an intermediate artifact trivially 
matches our test reference.

And it didn't catch the bug - the tags are not nested.

assert_rjs is a very pretty, high-level way to do just this. It does not 
test that RJS emitted JavaScript that indeed updates one of our panels, and 
indeed turned another panel blue. Instead, it trivially tests that the 
production code emitted the JavaScript said it would emit.

Here's the RJS to update a panel:

   page.replace_html 'span_id', '<em>yo<strong>dude</strong></em>'

That is light-years more convenient than the equivalent 200 lines of 
portable and browser-neutral JavaScript. But is this a valid test for it?

  assert_rjs :replace_html, 'span_id', '<em>yo<strong>dude</strong></em>'

It's a decorated form of a Log String Test. It treats the RJS page object as 
a mock object that absorbs a string recording all its calls, then it 
trivially matches that the page object contains JavaScript matching all 
those calls.

Bugs could waltz thru that system with impunity. And, that system would 
impede legitimate re-work which did . Those are the two indicators of TFUI 
failure.

Short-term, the only fix is to augment our Ajax with acceptance tests, such 
as Watir. Long term, assert_rjs could upgrade to start interpreting that 
JavaScript instead of just matching it.

Tip: Much JavaScript looks a lot like Ruby. So if we tweaked it and then 
trivially eval()-ed it, we could build a mock browser.

> BTW ... nice job on the amazon site ;-)

Dude, I have finally go to the point where writing about this stuff takes 
longer than actually doing it!!

-- 
  Phlip
  http://www.greencheese.us/ZeekLand <-- NOT a blog!!! 


--0iBPp0zTnWtjA5IZFOdJZdvP4x1dvn8PKPx8QQx
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
</head>

<!-- Network content -->


<body style="background-color: #ffffff;">

<!--~-|**|PrettyHtmlStartT|**|-~-->
<div id="ygrp-mlmsg" style="width:655px; position:relative;">
  <div id="ygrp-msg" style="width: 490px; padding: 0 15px 0 0; float:left;  z-index:1;">
<!--~-|**|PrettyHtmlEndT|**|-~-->

    <div id="ygrp-text">
            <p>Shane Mingins wrote:<br>
<br>
&gt; That currently would be my sentiment too.  I am hoping to use Rails<br>
&gt; more.<br>
<br>
The best accolade for Ruby, so far, comes from the Pragmatic Programmers:<br>
<br>
Ruby stays out of your way<br>
<br>
That's a good way to say that Ruby has a user-interface tuned for <br>
programmer's needs. (It's also an excuse why Ruby puts the needs of the <br>
programmer above those of the CPU!)<br>
<br>
I thought of a similar accolade for Rails:<br>
<br>
Rails shortens the distances between two points<br>
<br>
Under classical web programming, you typically must add a variable to both <br>
the SQL and HTML, then you must spend hours adding plumbing and <br>
infrastructure to link the two.<br>
<br>
Rails flattens that problem. You can often add a variable to the SQL, match <br>
it in the HTML, and add _nothing_ in between. Rails took care of the <br>
plumbing for you. And if you need that variable in the controller layer, to <br>
add business logic, then it's usually ready and waiting for you.<br>
<br>
&gt; I have just read Cody Fauser's RJS Template for Rails which had<br>
&gt; a link about TDD RJS.  I have yet to try it out.  It may be of<br>
&gt; interest to you if you have not already seen it.<br>
&gt;<br>
&gt; <a href="http://glu.ttono.us/articles/2006/05/29/guide-test-driven-rjs-with-arts">http://glu.ttono.<wbr>us/articles/<wbr>2006/05/29/<wbr>guide-test-<wbr>driven-rjs-<wbr>with-arts</a><br>
<br>
I rebutt that effort (although I am almost about to use it myself). It's a <br>
good first start, but it's not really TDD as we know it. I will explain why, <br>
starting with a simpler HTML example.<br>
<br>
(RJS is a module that generates JavaScript, so you can minimize swapping <br>
between languages, not worry about escapes, etc...)<br>
<br>
If I wrote HTML, it might look like: &lt;em&gt;yo&lt;strong&gt;<wbr>dude&lt;/em&gt;<wbr>&lt;/strong&gt;<wbr>.<br>
<br>
So this is not a good test for that:<br>
<br>
assert_equal '&lt;em&gt;yo&lt;strong&gt;<wbr>dude&lt;/em&gt;<wbr>&lt;/strong&gt;<wbr>', my_html<br>
<br>
We wouldn't do that for TDD on the Logic Layer, so we shouldn't accept it <br>
for the GUI Layer. It only tests that an intermediate artifact trivially <br>
matches our test reference.<br>
<br>
And it didn't catch the bug - the tags are not nested.<br>
<br>
assert_rjs is a very pretty, high-level way to do just this. It does not <br>
test that RJS emitted JavaScript that indeed updates one of our panels, and <br>
indeed turned another panel blue. Instead, it trivially tests that the <br>
production code emitted the JavaScript said it would emit.<br>
<br>
Here's the RJS to update a panel:<br>
<br>
page.replace_<wbr>html 'span_id', '&lt;em&gt;yo&lt;strong&gt;<wbr>dude&lt;/strong&gt;<wbr>&lt;/em&gt;'<br>
<br>
That is light-years more convenient than the equivalent 200 lines of <br>
portable and browser-neutral JavaScript. But is this a valid test for it?<br>
<br>
assert_rjs :replace_html, 'span_id', '&lt;em&gt;yo&lt;strong&gt;<wbr>dude&lt;/strong&gt;<wbr>&lt;/em&gt;'<br>
<br>
It's a decorated form of a Log String Test. It treats the RJS page object as <br>
a mock object that absorbs a string recording all its calls, then it <br>
trivially matches that the page object contains JavaScript matching all <br>
those calls.<br>
<br>
Bugs could waltz thru that system with impunity. And, that system would <br>
impede legitimate re-work which did . Those are the two indicators of TFUI <br>
failure.<br>
<br>
Short-term, the only fix is to augment our Ajax with acceptance tests, such <br>
as Watir. Long term, assert_rjs could upgrade to start interpreting that <br>
JavaScript instead of just matching it.<br>
<br>
Tip: Much JavaScript looks a lot like Ruby. So if we tweaked it and then <br>
trivially eval()-ed it, we could build a mock browser.<br>
<br>
&gt; BTW ... nice job on the amazon site ;-)<br>
<br>
Dude, I have finally go to the point where writing about this stuff takes <br>
longer than actually doing it!!<br>
<br>
-- <br>
  Phlip<br>
  <a href="http://www.greencheese.us/ZeekLand">http://www.greenche<wbr>ese.us/ZeekLand</a> &lt;-- NOT a blog!!! <br>
<br>
</p>
    </div>  

    <!--~-|**|PrettyHtmlStart|**|-~-->
    <span width="1" style="color: white;">__._,_.___</span>
    <!-- Start the section with Message In topic -->
    <div id="ygrp-actbar">
              <span class="left">
          <a href="http://groups.yahoo.com/group/TestFirstUserInterfaces/message/973;_ylc=X3oDMTMydGJ0cmRyBF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BG1zZ0lkAzk3MwRzZWMDZnRyBHNsawN2dHBjBHN0aW1lAzExNjUwMDE4NTgEdHBjSWQDOTcz">
            Messages in this topic          </a> (<span class="bld">1</span>)
        </span>
        <a href="http://groups.yahoo.com/group/TestFirstUserInterfaces/post;_ylc=X3oDMTJvZXB1dnRwBF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BG1zZ0lkAzk3MwRzZWMDZnRyBHNsawNycGx5BHN0aW1lAzExNjUwMDE4NTg-?act=reply&messageNum=973">
          <span class="bld">
            Reply          </span> (via web post)
        </a>  | 
        <a href="http://groups.yahoo.com/group/TestFirstUserInterfaces/post;_ylc=X3oDMTJlZmp2azA2BF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwNmdHIEc2xrA250cGMEc3RpbWUDMTE2NTAwMTg1OA--" class="bld">
          Start a new topic        </a>
          </div> 
    <!-------     Start Nav Bar  ------>
    <!-- |**|begin egp html banner|**| -->
    <div id="ygrp-vitnav">
                <a href="http://groups.yahoo.com/group/TestFirstUserInterfaces/messages;_ylc=X3oDMTJlNXQ2bHJ1BF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwNmdHIEc2xrA21zZ3MEc3RpbWUDMTE2NTAwMTg1OA--">Messages</a>  
            |    <a href="http://groups.yahoo.com/group/TestFirstUserInterfaces/files;_ylc=X3oDMTJmOTdobDg5BF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwNmdHIEc2xrA2ZpbGVzBHN0aW1lAzExNjUwMDE4NTg-">Files</a>  
            |    <a href="http://groups.yahoo.com/group/TestFirstUserInterfaces/photos;_ylc=X3oDMTJlMjd0NHVrBF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwNmdHIEc2xrA3Bob3QEc3RpbWUDMTE2NTAwMTg1OA--">Photos</a>  
            |    <a href="http://groups.yahoo.com/group/TestFirstUserInterfaces/links;_ylc=X3oDMTJmaDZvajgxBF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwNmdHIEc2xrA2xpbmtzBHN0aW1lAzExNjUwMDE4NTg-">Links</a>  
            |    <a href="http://groups.yahoo.com/group/TestFirstUserInterfaces/database;_ylc=X3oDMTJjNGEwamc1BF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwNmdHIEc2xrA2RiBHN0aW1lAzExNjUwMDE4NTg-">Database</a>  
            |    <a href="http://groups.yahoo.com/group/TestFirstUserInterfaces/polls;_ylc=X3oDMTJmZGtwM2p2BF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwNmdHIEc2xrA3BvbGxzBHN0aW1lAzExNjUwMDE4NTg-">Polls</a>  
            |    <a href="http://groups.yahoo.com/group/TestFirstUserInterfaces/members;_ylc=X3oDMTJlcWljdW5sBF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwNmdHIEc2xrA21icnMEc3RpbWUDMTE2NTAwMTg1OA--">Members</a>  
            |    <a href="http://groups.yahoo.com/group/TestFirstUserInterfaces/calendar;_ylc=X3oDMTJka2wya2E3BF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwNmdHIEc2xrA2NhbARzdGltZQMxMTY1MDAxODU4">Calendar</a>  
    </div>  
    <!-- |**|end egp html banner|**| -->

    <!-- Do not have place to put it yet -->
    <div id="ygrp-grft">
              

          </div>

    <!-- yahoo logo -->
    <!-- |**|begin egp html banner|**| -->
    <div id="ygrp-ft">
      <a href="http://groups.yahoo.com/;_ylc=X3oDMTJkNTQ3ZHM0BF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwNmdHIEc2xrA2dmcARzdGltZQMxMTY1MDAxODU4">
      <img src="http://us.i1.yimg.com/us.yimg.com/i/yg/img/logo/ma_grp_160.gif" height="15" width="106" border="0" alt="Yahoo! Groups"></a> <br>
      <a href="http://groups.yahoo.com/group/TestFirstUserInterfaces/join;_ylc=X3oDMTJmcDdpbGozBF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwNmdHIEc2xrA3N0bmdzBHN0aW1lAzExNjUwMDE4NTg-">Change settings via the Web</a> (Yahoo! ID required) <br>
      Change settings via email: <a href="mailto:TestFirstUserInterfaces-digest-hHKSG33TihhbjbujkaE4pw@public.gmane.org?subject=Email Delivery: Digest">Switch delivery to Daily Digest</a> | <a href = "mailto:TestFirstUserInterfaces-traditional-hHKSG33TihhbjbujkaE4pw@public.gmane.org?subject=Change Delivery Format: Traditional">Switch format to Traditional</a> <br>

      <a href="http://groups.yahoo.com/group/TestFirstUserInterfaces;_ylc=X3oDMTJkcGFmMzZ0BF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwNmdHIEc2xrA2hwZgRzdGltZQMxMTY1MDAxODU4">
        Visit Your Group 
      </a> |
      <a href="http://docs.yahoo.com/info/terms/">
        Yahoo! Groups Terms of Use      </a> |
      <a href="mailto:TestFirstUserInterfaces-unsubscribe-hHKSG33TihhbjbujkaE4pw@public.gmane.org?subject=">
        Unsubscribe      </a> 
    </div>     <!-- |**|end egp html banner|**| -->
  </div> <!-- ygrp-msg -->

  
  <!-- Sponsor -->
  <!-- |**|begin egp html banner|**| -->
  <div id="ygrp-sponsor" style="width:140px;float: left; clear: none; margin-left: 5px; background:white; margin-bottom:25px ;position:absolute; top:0; right: 0;">
    <!-- Network content -->
    
    <!-- Start vitality -->
    <div id="ygrp-vital">
            <a href="http://groups.yahoo.com/group/TestFirstUserInterfaces;_ylc=X3oDMTJla2ptazVsBF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwN2dGwEc2xrA3ZnaHAEc3RpbWUDMTE2NTAwMTg1OA--">
        Visit Your Group      </a>
    </div> 
                <div id="hd">SPONSORED LINKS</div>
      <div id="ov">
        <ul>
                    <li><a href="http://groups.yahoo.com/gads;_ylc=X3oDMTJjbjk5OTNmBF9TAzk3MzU5NzE0BF9wAzEEZ3JwSWQDODc0NDcwNARncnBzcElkAzE3MDUwMDcyMDcEc2VjA3NsbW9kBHN0aW1lAzExNjUwMDE4NTk-?t=ms&k=Software+development+tool&w1=Software+development+tool&w2=Application+development+software&w3=Development+software&w4=Development+outsourcing+software&w5=Embedded+software+development&c=5&s=168&g=2&.sig=dMdO9VHGmvW_YJCzvobcVA">Software development tool</a></li>
                    <li><a href="http://groups.yahoo.com/gads;_ylc=X3oDMTJjdWtzY3FlBF9TAzk3MzU5NzE0BF9wAzIEZ3JwSWQDODc0NDcwNARncnBzcElkAzE3MDUwMDcyMDcEc2VjA3NsbW9kBHN0aW1lAzExNjUwMDE4NTk-?t=ms&k=Application+development+software&w1=Software+development+tool&w2=Application+development+software&w3=Development+software&w4=Development+outsourcing+software&w5=Embedded+software+development&c=5&s=168&g=2&.sig=L7Zs-h76VVahdNyx1QnUHg">Application development software</a></li>
                    <li><a href="http://groups.yahoo.com/gads;_ylc=X3oDMTJjNXBsZ2d0BF9TAzk3MzU5NzE0BF9wAzMEZ3JwSWQDODc0NDcwNARncnBzcElkAzE3MDUwMDcyMDcEc2VjA3NsbW9kBHN0aW1lAzExNjUwMDE4NTk-?t=ms&k=Development+software&w1=Software+development+tool&w2=Application+development+software&w3=Development+software&w4=Development+outsourcing+software&w5=Embedded+software+development&c=5&s=168&g=2&.sig=mgzP-_wxW4LP9qRGd-WceA">Development software</a></li>
                    <li><a href="http://groups.yahoo.com/gads;_ylc=X3oDMTJjMWJnajg2BF9TAzk3MzU5NzE0BF9wAzQEZ3JwSWQDODc0NDcwNARncnBzcElkAzE3MDUwMDcyMDcEc2VjA3NsbW9kBHN0aW1lAzExNjUwMDE4NTk-?t=ms&k=Development+outsourcing+software&w1=Software+development+tool&w2=Application+development+software&w3=Development+software&w4=Development+outsourcing+software&w5=Embedded+software+development&c=5&s=168&g=2&.sig=To5fERSOzD6F-d_wLzNE1w">Development outsourcing software</a></li>
                    <li><a href="http://groups.yahoo.com/gads;_ylc=X3oDMTJjNWFpMXZiBF9TAzk3MzU5NzE0BF9wAzUEZ3JwSWQDODc0NDcwNARncnBzcElkAzE3MDUwMDcyMDcEc2VjA3NsbW9kBHN0aW1lAzExNjUwMDE4NTk-?t=ms&k=Embedded+software+development&w1=Software+development+tool&w2=Application+development+software&w3=Development+software&w4=Development+outsourcing+software&w5=Embedded+software+development&c=5&s=168&g=2&.sig=uSsL2YUoig8RH1hp4MMhQg">Embedded software development</a></li>
                  </ul>
      </div>
    
    <!-- Network content -->
                <div id="nc">
              <div class="ad">
                      <div id="hd1">New business?</div> 
<p><a href="http://us.ard.yahoo.com/SIG=12hk0kqd5/M=493064.8985663.9760769.8674578/D=groups/S=1705007207:NC/Y=YAHOO/EXP=1165009059/A=3848640/R=0/SIG=131an6mds/*http://searchmarketing.yahoo.com/arp/srchv2.php?o=US2002&cmp=Yahoo&ctv=Groups1&s=Y&s2=&s3=&b=50">Get new customers.</a></p> 
<p>List your web site</p> 
<p>in Yahoo! Search.</p>                  </div>
                    <div class="ad">
                        <div id="hd1">Y! Toolbar</div>
  <p><a href="http://us.lrd.yahoo.com/_ylc=X3oDMTJvbGZkcjlmBF9TAzk3MzU5NzE0BF9wAzIEZ3JwSWQDODc0NDcwNARncnBzcElkAzE3MDUwMDcyMDcEc2VjA25jbW9kBHNsawN0b29sYmFyBHN0aW1lAzExNjUwMDE4NTg-;_ylg=1/SIG=11c6dvmk9/**http%3a//toolbar.yahoo.com/%3f.cpdl=ygrps">Get it Free!</a></p>
  <p>easy 1-click access</p>
  <p>to your groups.</p>
                  </div>
                    <div class="ad">
                        <div id="hd1">Yahoo! Groups</div>
  <p><a href="http://groups.yahoo.com/start;_ylc=X3oDMTJvbmNvcGJxBF9TAzk3MzU5NzE0BF9wAzMEZ3JwSWQDODc0NDcwNARncnBzcElkAzE3MDUwMDcyMDcEc2VjA25jbW9kBHNsawNncm91cHMyBHN0aW1lAzExNjUwMDE4NTg-">Start a group</a></p>
  <p>in 3 easy steps.</p>
  <p>Connect with others.</p>
                  </div>
          </div>
      
  </div>   <!-- |**|end egp html banner|**| -->
  <div style="clear:both; color: #FFF; font-size:1px;">.</div>
</div> <img src="http://geo.yahoo.com/serv?s=97359714/grpId=8744704/grpspId=1705007207/msgId=973/stime=1165001858/nc1=3848640/nc2=2/nc3=3" width="1" height="1"> <br>
<span  style="color: white;">__,_._,___</span>
<!--~-|**|PrettyHtmlEnd|**|-~-->
</body>
<!--~-|**|PrettyHtmlStart|**|-~-->
<head>
<style type="text/css">
<!--
#ygrp-mlmsg {font-size:13px; font-family: arial,helvetica,clean,sans-serif;*font-size:small;*font:x-small;}
#ygrp-mlmsg table {font-size:inherit;font:100%;}
#ygrp-mlmsg select, input, textarea {font:99% arial,helvetica,clean,sans-serif;}
#ygrp-mlmsg pre, code {font:115% monospace;*font-size:100%;}
#ygrp-mlmsg * {line-height:1.22em;}
#ygrp-text{
    font-family: Georgia;	
}
#ygrp-text p{
    margin: 0 0 1em 0;
}
#ygrp-tpmsgs{
    font-family: Arial;	
    clear: both;
}
#ygrp-vitnav{
	padding-top: 10px;
	font-family: Verdana;
	font-size: 77%;
	margin: 0;
}
#ygrp-vitnav a{
	padding: 0 1px;
}
#ygrp-actbar{
	clear: both;
	margin: 25px 0;
	white-space:nowrap;
	color: #666;
	text-align: right;
}
#ygrp-actbar .left{
	float: left;
	white-space:nowrap;
}
.bld{font-weight:bold;}
#ygrp-grft{
	font-family: Verdana;
	font-size: 77%;
	padding: 15px 0;
}
#ygrp-ft{
  font-family: verdana;
  font-size: 77%;
  border-top: 1px solid #666; 
  padding: 5px 0; 
}
#ygrp-mlmsg #logo{
  padding-bottom: 10px;
}

#ygrp-vital{
	background-color: #e0ecee;
	margin-bottom: 20px;
	padding: 2px 0 8px 8px;
}
#ygrp-vital #vithd{
	font-size: 77%;
	font-family: Verdana;
	font-weight: bold;
	color: #333;
	text-transform: uppercase;
}
#ygrp-vital ul{
	padding: 0;
	margin: 2px 0;
}
#ygrp-vital ul li{
  list-style-type: none;
  clear: both;
  border: 1px solid #e0ecee;  
}
#ygrp-vital ul li .ct{
  font-weight: bold;
  color: #ff7900;
  float: right;
  width: 2em;
  text-align:right;
  padding-right: .5em;
}
#ygrp-vital ul li .cat{
  font-weight: bold;
}
#ygrp-vital a {
	text-decoration: none;
}

#ygrp-vital a:hover{
  text-decoration: underline;
}

#ygrp-sponsor #hd{
	color: #999;
	font-size: 77%;
}
#ygrp-sponsor #ov{
	padding: 6px 13px;
	background-color: #e0ecee;
	margin-bottom: 20px;
}
#ygrp-sponsor #ov ul{
	padding: 0 0 0 8px;
	margin: 0;
}
#ygrp-sponsor #ov li{
	list-style-type: square;
	padding: 6px 0;
	font-size: 77%;
}
#ygrp-sponsor #ov li a{
	text-decoration: none;
	font-size: 130%;
}
#ygrp-sponsor #nc {
  background-color: #eee;
  margin-bottom: 20px;
  padding: 0 8px;
}
#ygrp-sponsor .ad{
	padding: 8px 0;
}
#ygrp-sponsor .ad #hd1{
	font-family: Arial;
	font-weight: bold;
	color: #628c2a;
	font-size: 100%;
	line-height: 122%;
}
#ygrp-sponsor .ad a{
	text-decoration: none;
}
#ygrp-sponsor .ad a:hover{
	text-decoration: underline;
}
#ygrp-sponsor .ad p{
	margin: 0;
}
o {font-size: 0; }
.MsoNormal {
   margin: 0 0 0 0;
}
#ygrp-text tt{
  font-size: 120%;
}
blockquote{margin: 0 0 0 4px;}
.replbq {margin:4}
-->
</style>
</head>
<!--~-|**|PrettyHtmlEnd|**|-~-->
</html><!--End group email -->


--0iBPp0zTnWtjA5IZFOdJZdvP4x1dvn8PKPx8QQx--