<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/"><channel><title>A Meetandplay.com Community</title><link>http://blogs.meetandplay.com/MainFeed.aspx</link><description>MNP Blogs</description><generator>Subtext Version 1.9.4.78</generator><item><title>Slow it down with Wacqetball</title><link>http://blogs.meetandplay.com/WTilton/archive/2008/03/27/Slow_it_down_with_Wacqetball.aspx</link><pubDate>Thu, 27 Mar 2008 10:35:26 GMT</pubDate><guid isPermaLink="true">http://blogs.meetandplay.com/WTilton/archive/2008/03/27/Slow_it_down_with_Wacqetball.aspx</guid><wfw:comment>http://blogs.meetandplay.com/WTilton/comments/3280.aspx</wfw:comment><wfw:commentRss>http://blogs.meetandplay.com/WTilton/comments/commentRss/3280.aspx</wfw:commentRss><comments>http://blogs.meetandplay.com/WTilton/archive/2008/03/27/Slow_it_down_with_Wacqetball.aspx#comment</comments><slash:comments>4</slash:comments><trackback:ping>http://blogs.meetandplay.com/WTilton/services/trackbacks/3280.aspx</trackback:ping><source url="http://blogs.meetandplay.com/WTilton/rss.aspx">Slow it down with Wacqetball</source><description>&lt;p&gt;Dan Davis of Colorado has invented Wacquetball, a slower version of racquetball that uses a foam ball instead of the rubber version in racquetball.  It looks like seniors are getting into it, and women as well.  Maybe this is a good way to introduce them to the sport, or could this be a sport on it's own?  Is the game getting too fast?  I wonder what it would look like if some professionals tried it out.&lt;/p&gt; &lt;p&gt;Check out the &lt;a href="http://www.thedenverchannel.com/video/15717174/index.html"&gt;video from 7 News&lt;/a&gt; of Denver.&lt;/p&gt;&lt;img src="http://blogs.meetandplay.com/WTilton/aggbug/3280.aspx" width="1" height="1" /&gt;</description><dc:creator>William C. Tilton</dc:creator></item><item><title>LA Fitness is Canceling Racquetball Leagues</title><link>http://blogs.meetandplay.com/WTilton/archive/2008/02/21/LA_Fitness_is_Canceling_Racquetball_Leagues.aspx</link><pubDate>Fri, 22 Feb 2008 06:34:50 GMT</pubDate><guid isPermaLink="true">http://blogs.meetandplay.com/WTilton/archive/2008/02/21/LA_Fitness_is_Canceling_Racquetball_Leagues.aspx</guid><wfw:comment>http://blogs.meetandplay.com/WTilton/comments/3278.aspx</wfw:comment><wfw:commentRss>http://blogs.meetandplay.com/WTilton/comments/commentRss/3278.aspx</wfw:commentRss><comments>http://blogs.meetandplay.com/WTilton/archive/2008/02/21/LA_Fitness_is_Canceling_Racquetball_Leagues.aspx#comment</comments><slash:comments>13</slash:comments><trackback:ping>http://blogs.meetandplay.com/WTilton/services/trackbacks/3278.aspx</trackback:ping><source url="http://blogs.meetandplay.com/WTilton/rss.aspx">LA Fitness is Canceling Racquetball Leagues</source><description>&lt;blockquote&gt; &lt;p&gt;&lt;strong&gt;Updated Mar 22nd:  &lt;/strong&gt;Looks like the leagues have been reinstated.  The people have spoken!&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Update Feb 25th:&lt;/strong&gt; We have organized a petition that can be signed.  &lt;a href="http://www.ipetitions.com/petition/LAFITNESSRacquetball/"&gt;Please sign it&lt;/a&gt; and get your friends to sign it as well, we'll really only be voicing our concern as a group of members that currently have memberships and I think it will really help if it's done as a group, instead of a few phones calls here and there.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;img height="60" alt="image" src="http://blogs.meetandplay.com/Posted/LAFitnessisCancelingRacquetballLeagues_11384/image.png" width="180" align="left" /&gt; Yes, you read that correctly.  The nasty rumor has been spreading for about a week now and it's getting larger each day.  At first I thought it was just a rumor that someone had jokingly started, as in the past the LA Fitness chain has seemed only to want to support the sport of Racquetball through leagues and high money tournaments, but lately I've seen the trend.&lt;/p&gt; &lt;p&gt;In Portola Springs a brand new &lt;a href="http://maps.google.com/maps?f=q&amp;amp;hl=en&amp;amp;geocode=&amp;amp;q=LA+Fitness&amp;amp;sll=33.677211,-117.747173&amp;amp;sspn=0.102854,0.22934&amp;amp;ie=UTF8&amp;amp;ll=33.712631,-117.751894&amp;amp;spn=0.025703,0.057335&amp;amp;t=p&amp;amp;z=15&amp;amp;iwloc=G"&gt;LA Fitness&lt;/a&gt; emerged without Racquetball courts.  This is extremely puzzling as two other clubs, one in Irvine and the other in Foothill Ranch are constantly booked at all peak hours.  A few more courts would have definitely alleviated the other two clubs and driven membership to it.  As such, without courts, I've never sat foot in the club and probably never will.&lt;/p&gt; &lt;p&gt;The most recent news is an email:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Subject: Complain about it - LA Fitness. &lt;br /&gt;&lt;/p&gt; &lt;p&gt;&lt;img height="216" alt="image" src="http://blogs.meetandplay.com/Posted/LAFitnessisCancelingRacquetballLeagues_11384/image_3.png" width="240" align="right" /&gt; LA Fitness is canceling all future racquetball leagues (they describe it as "taking a break from leagues for now") and will end its Shoot Out calendar events as of June 2008. They are doing the same in Florida, New Jersey, Arizona and Texas. They are in the process of telling most of their club directors that if they will not agree to run Basketball leagues that their services are no longer needed. &lt;br /&gt;&lt;/p&gt; &lt;p&gt;The management indicates that they may (a weak may) return to leagues in the future but won't say when. I spoke to her for about 30 minutes yesterday. She won't say why they are canceling leagues. She indicates we still have the ability to reserve courts, play on our own among our selves, and that LA Fitness is concentrating on Basketball Leagues (yes, which does not compete against RB, but they don't care). Cannot understand why they are abandoning this money maker for LA Fitness. It does not make financial sense, and the bottom line is that they do not care (though they will not concede this point.) &lt;/p&gt; &lt;p&gt;Edited: To complain, sign the petition above.  &lt;/p&gt; &lt;p&gt;Others are drafting a few sample letters to circulate that I will likewise share, that each of you can revise to your own specific complaints. Circulate this to the vocal majority. It would assist if you supply me each with your email addresses/phone numbers and copies of your complaints so that we can track the quantity of complaints. Some are suggesting a joint complaint letter with the members names, email and member number. Working on that but individually we can voice our separate dissatisfaction for now.&lt;/p&gt; &lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;While this letter says to complain, I agree that this is one option.  We're going to contact the management and see once and for all if there is truth to these rumors to put it to rest.  If they are true, we'll most likely &lt;strong&gt;quit our memberships and call for a boycott of LA Fitness from all racquetball players that we know&lt;/strong&gt;.  There is no better way to get an organization to pay attention, than by taking from their bottom line.&lt;/p&gt; &lt;p&gt;In addition to the slap in the face to all loyal paying racquetball members, the above letter says that they will focus on basketball.  What the letter doesn't say, but the rumor does tell is that it's because Basketball is an Olympic sport.  While I see no reason not to support another sport that could bring well being into your life, I see absolutely no reason to get rid of another, Olympic or not.&lt;/p&gt;&lt;img src="http://blogs.meetandplay.com/WTilton/aggbug/3278.aspx" width="1" height="1" /&gt;</description><dc:creator>William C. Tilton</dc:creator></item><item><title>American Gladiator meets Son Nguyen</title><link>http://blogs.meetandplay.com/WTilton/archive/2008/01/28/American_Gladiator_meets_Son_Nguyen.aspx</link><pubDate>Mon, 28 Jan 2008 23:27:45 GMT</pubDate><guid isPermaLink="true">http://blogs.meetandplay.com/WTilton/archive/2008/01/28/American_Gladiator_meets_Son_Nguyen.aspx</guid><wfw:comment>http://blogs.meetandplay.com/WTilton/comments/3277.aspx</wfw:comment><wfw:commentRss>http://blogs.meetandplay.com/WTilton/comments/commentRss/3277.aspx</wfw:commentRss><comments>http://blogs.meetandplay.com/WTilton/archive/2008/01/28/American_Gladiator_meets_Son_Nguyen.aspx#comment</comments><slash:comments>0</slash:comments><trackback:ping>http://blogs.meetandplay.com/WTilton/services/trackbacks/3277.aspx</trackback:ping><source url="http://blogs.meetandplay.com/WTilton/rss.aspx">American Gladiator meets Son Nguyen</source><description>&lt;p&gt;&lt;a href="http://blogs.meetandplay.com/Posted/AmericanGladiatormeetsSonNguyen_AF32/image.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="244" alt="image" src="http://blogs.meetandplay.com/Posted/AmericanGladiatormeetsSonNguyen_AF32/image_thumb.png" width="164" align="left" border="0" /&gt;&lt;/a&gt; I just watched Son take on the Gladiators in the remake of the 80's show American Gladiators.  The show was pretty entertaining for the most part, and seeing someone you know bashing being thrown down a foam mountain is pretty intense.   Son's competitor was in crazy shape though.  He was the fastest person through the Eliminator, with Son not far behind.  This is where I thought the show kinda stunk.  Even if Son beat one of the top 4 times, he still "lost" because the person he went up against beat him.  I just think this could be a point to where the contestants could compete against the top 4 and not each other - might have some surprising things happen if that were the case.&lt;/p&gt; &lt;p&gt;I thought it was a bit unfair because they also never had to directly compete.  It was always the Gladiators against the two contestants and if you look at the competition where you have to run through the Gladiators Son went through the first 2 way faster than his competitor but got stuck on the last two dudes and didn't even make it to the end.  Again on the pyramid, Son had a few shots but got trapped up because of his opponent.  &lt;/p&gt; &lt;p&gt;I'm making a few excuses but we wanted him to win :)&lt;/p&gt; &lt;p&gt;The show was pretty entertaining, but just seemed unfair to the contestants in certain ways.  Almost to a point to where it seemed almost lucky that a person won a competition, not because they had more skill or endurance.  After the show I wondered how some other racquetball players would have done.  Mainly was thinking Dan Obremski and Jack Huczek.  Would be interesting...&lt;/p&gt;&lt;img src="http://blogs.meetandplay.com/WTilton/aggbug/3277.aspx" width="1" height="1" /&gt;</description><dc:creator>William C. Tilton</dc:creator></item><item><title>This Blog Has Moved</title><link>http://blogs.meetandplay.com/WPierce/archive/2008/01/03/This_Blog_Has_Moved.aspx</link><pubDate>Thu, 03 Jan 2008 19:36:44 GMT</pubDate><guid isPermaLink="true">http://blogs.meetandplay.com/WPierce/archive/2008/01/03/This_Blog_Has_Moved.aspx</guid><wfw:comment>http://blogs.meetandplay.com/WPierce/comments/3276.aspx</wfw:comment><wfw:commentRss>http://blogs.meetandplay.com/WPierce/comments/commentRss/3276.aspx</wfw:commentRss><comments>http://blogs.meetandplay.com/WPierce/archive/2008/01/03/This_Blog_Has_Moved.aspx#comment</comments><slash:comments>0</slash:comments><trackback:ping>http://blogs.meetandplay.com/WPierce/services/trackbacks/3276.aspx</trackback:ping><source url="http://blogs.meetandplay.com/WPierce/rss.aspx">This Blog Has Moved</source><description>Weblog:&lt;br /&gt;
&lt;a href="http://blechie.com/wpierce/"&gt;http://blechie.com/wpierce/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Feed:&lt;br /&gt;
http://feeds.feedburner.com/wcpierce/&lt;img src="http://blogs.meetandplay.com/WPierce/aggbug/3276.aspx" width="1" height="1" /&gt;</description><dc:creator>Bill Pierce</dc:creator></item><item><title>Playing Good with the Copper &amp;quot;Club&amp;quot;</title><link>http://blogs.meetandplay.com/WTilton/archive/2007/09/27/Playing_Good_with_the_Copper_quotClubquot.aspx</link><pubDate>Thu, 27 Sep 2007 11:59:33 GMT</pubDate><guid isPermaLink="true">http://blogs.meetandplay.com/WTilton/archive/2007/09/27/Playing_Good_with_the_Copper_quotClubquot.aspx</guid><wfw:comment>http://blogs.meetandplay.com/WTilton/comments/3273.aspx</wfw:comment><wfw:commentRss>http://blogs.meetandplay.com/WTilton/comments/commentRss/3273.aspx</wfw:commentRss><comments>http://blogs.meetandplay.com/WTilton/archive/2007/09/27/Playing_Good_with_the_Copper_quotClubquot.aspx#comment</comments><slash:comments>6</slash:comments><trackback:ping>http://blogs.meetandplay.com/WTilton/services/trackbacks/3273.aspx</trackback:ping><source url="http://blogs.meetandplay.com/WTilton/rss.aspx">Playing Good with the Copper &amp;quot;Club&amp;quot;</source><description>&lt;p&gt;&lt;img height="173" alt="Ektelon O3 Copper Racquetball Racquet" src="http://www.racquetworld.com/merchant2/graphics/product_pictures/racquets/miva5/o3copperfp.jpg" width="150" align="right" /&gt;Felt great last night.  Second time playing with the 03 Copper racquet and I'm getting used to the weight.  It's been a loong time since &lt;strong&gt;Ektelon had the balls to not go lightweight&lt;/strong&gt;.  Everyone seems to like the feather light racquets but overtime I believe they can kill your joints.&lt;/p&gt; &lt;p&gt;With the heavier racquet I don't have to swing so fast.  In Open level play that means even though my racquet is heavier, my racquet is faster because I can swing slower (F=ma).  This may seem like quite the opposite, but think about this, to swing the lighter racquet, I have to swing it faster to equal the same amount of power.  With the heavier one, I don't.  I can take shorter swings, don't have to swing as hard, and I'll have more control.&lt;/p&gt; &lt;p&gt;It takes a few matches to really get control of it though.  As soon as you figure out that you don't have to really smash the ball to get it going, everything start really rolling for me.  &lt;/p&gt; &lt;p&gt;If you have a big frame, are tall, and can lift 250 grams...try it out, just remember to &lt;strong&gt;relax your swing and don't try to swing as fast&lt;/strong&gt; (takes practice).  If you demo it, you're going to be frustrated the first 10 games you play.  Give it a chance though and after game 10...&lt;/p&gt;&lt;img src="http://blogs.meetandplay.com/WTilton/aggbug/3273.aspx" width="1" height="1" /&gt;</description><dc:creator>William C. Tilton</dc:creator></item><item><title>The Outdoor Experiment</title><link>http://blogs.meetandplay.com/WTilton/archive/2007/09/04/The_Outdoor_Experiment.aspx</link><pubDate>Tue, 04 Sep 2007 11:41:51 GMT</pubDate><guid isPermaLink="true">http://blogs.meetandplay.com/WTilton/archive/2007/09/04/The_Outdoor_Experiment.aspx</guid><wfw:comment>http://blogs.meetandplay.com/WTilton/comments/3271.aspx</wfw:comment><wfw:commentRss>http://blogs.meetandplay.com/WTilton/comments/commentRss/3271.aspx</wfw:commentRss><comments>http://blogs.meetandplay.com/WTilton/archive/2007/09/04/The_Outdoor_Experiment.aspx#comment</comments><slash:comments>0</slash:comments><trackback:ping>http://blogs.meetandplay.com/WTilton/services/trackbacks/3271.aspx</trackback:ping><source url="http://blogs.meetandplay.com/WTilton/rss.aspx">The Outdoor Experiment</source><description>&lt;p&gt;Racquetball doesn't have too many large scale events.  I'm really perplexed as to why, but I believe it mainly comes down to money.  The logistics involved with setting up a grand slam event is huge.  With Outdoor racquetball, I would think that it would be easier to squeeze into existing venues.&lt;/p&gt; &lt;p&gt;This past weekend there was a Venice beach event.  Ektelon and WOR put it on and and Shawn Royster at Royster productions videoed everything in High Definition with 10 camera's rolling.  To me this sounded like the first grand slam outdoor exhibition.  It seemed like the matches went well and the crowds were there and there was only one accident with Son Nyugen get a racquet to the face.  Son ended up with a few stiches but no worse for the wear so all in all a successful event...right?&lt;/p&gt; &lt;p&gt;While I'm glad everyone played well and Son's OK, I'm also really interested in the crowd. Whats the court look like? Where was it positioned? Were there bleachers? Where did people watch from? How close were you to the other event? Did they not care that you guys were doing something that potentially stole their viewers, or was it cohesive? Was the ball more visible through the HDTV content, with the built court? While everyone keeps calling it an event, I'd hope that someone else out there was treating it more of an experiment to see if it would be feasible to pull more of these events off in other high traffic locales. &lt;/p&gt; &lt;p&gt;My main points would be:  &lt;/p&gt;&lt;ul&gt; &lt;li&gt;Would having racquetball and another sport together increase both sport's attendance?&lt;/li&gt; &lt;li&gt;Was the high traffic helpful in attracting people, and how long did those people stick around?&lt;/li&gt; &lt;li&gt;Was anyone polled about anything? (Would you pay for a ticket to watch this? How interesting is the game to you? Would you like to learn the rules? Have you ever played?) &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;When Son got hurt 1/3 of the crowd was lost. Nothing against Son's injury, but did they just get bored with nothing going on? How much time elapsed? With 300 people watching, and losing 100 of them...that's huge. These types of things could happen in the future and there needs to be a plan (maybe another match going, or bring another match on, or maybe make the models dance around on trampolines).&lt;/p&gt;&lt;img src="http://blogs.meetandplay.com/WTilton/aggbug/3271.aspx" width="1" height="1" /&gt;</description><dc:creator>William C. Tilton</dc:creator></item><item><title>Are these outdoor courts?</title><link>http://blogs.meetandplay.com/WTilton/archive/2007/08/13/Are_these_outdoor_courts.aspx</link><pubDate>Mon, 13 Aug 2007 15:13:07 GMT</pubDate><guid isPermaLink="true">http://blogs.meetandplay.com/WTilton/archive/2007/08/13/Are_these_outdoor_courts.aspx</guid><wfw:comment>http://blogs.meetandplay.com/WTilton/comments/3270.aspx</wfw:comment><wfw:commentRss>http://blogs.meetandplay.com/WTilton/comments/commentRss/3270.aspx</wfw:commentRss><comments>http://blogs.meetandplay.com/WTilton/archive/2007/08/13/Are_these_outdoor_courts.aspx#comment</comments><slash:comments>2</slash:comments><trackback:ping>http://blogs.meetandplay.com/WTilton/services/trackbacks/3270.aspx</trackback:ping><source url="http://blogs.meetandplay.com/WTilton/rss.aspx">Are these outdoor courts?</source><description>&lt;p&gt;&lt;/p&gt; &lt;p&gt;We went up to Santa Barbara this weekend for a collegiate tournament that Jackie played in.  It was an indoor tournament, and I basically had fun with the kids while she got a few games in.&lt;/p&gt; &lt;p&gt;The facility was pretty sweet, it had two gigantic pools, soccer, football, and even archery.  I was thinking, I bet there are outdoor courts here too.  Being the busy Dad I was, I didn't go searching, but after getting back and looking at some aerial photos, it looks like I was a few yards away from one and didn't know it.&lt;/p&gt; &lt;p&gt;We were playing a the playground about 40 feet away from what I thought was a building, but never went to the other side of it.  It looks like there are court lines, but the other court has none.  It also looks like a window or something on the right court.  Anyone know for sure?&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="84E294D0-71C9-4bd0-A0FE-95764E0368D9:4d0daab5-7cd1-4784-971f-6403991f61c0" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;a href="http://local.live.com/default.aspx?v=2&amp;amp;cp=34.41761~-119.8512&amp;amp;lvl=2&amp;amp;style=o&amp;amp;scene=7994759" id="map-6f98dca4-42ad-4d5a-9443-2c7b8431cef7" alt="Click to view this map on Live.com" title="Click to view this map on Live.com"&gt;&lt;img src="http://blogs.meetandplay.com/Posted/Aretheseoutdoorcourts_C7BF/mapa961722b9ff8.jpg" width="320" height="240" /&gt;&lt;/a&gt;&lt;/div&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;a title="http://local.live.com/default.aspx?v=2&amp;amp;cp=pr2mzc50c4t0&amp;amp;style=o&amp;amp;lvl=2&amp;amp;tilt=-90&amp;amp;dir=0&amp;amp;alt=-1000&amp;amp;scene=7994759&amp;amp;sp=Point.pr2n4h50c52n_Racquetball%20Courts%3F___&amp;amp;encType=1" href="http://local.live.com/default.aspx?v=2&amp;amp;cp=pr2mzc50c4t0&amp;amp;style=o&amp;amp;lvl=2&amp;amp;tilt=-90&amp;amp;dir=0&amp;amp;alt=-1000&amp;amp;scene=7994759&amp;amp;sp=Point.pr2n4h50c52n_Racquetball%20Courts%3F___&amp;amp;encType=1"&gt;http://local.live.com/default.aspx?v=2&amp;amp;cp=pr2mzc50c4t0&amp;amp;style=o&amp;amp;lvl=2&amp;amp;tilt=-90&amp;amp;dir=0&amp;amp;alt=-1000&amp;amp;scene=7994759&amp;amp;sp=Point.pr2n4h50c52n_Racquetball%20Courts%3F___&amp;amp;encType=1&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.meetandplay.com/WTilton/aggbug/3270.aspx" width="1" height="1" /&gt;</description><dc:creator>William C. Tilton</dc:creator></item><item><title>It was a tough Decision, but we're not going to the U.S. Open Racquetball tournament this year</title><link>http://blogs.meetandplay.com/JTilton/archive/2007/08/02/3268.aspx</link><pubDate>Thu, 02 Aug 2007 18:56:01 GMT</pubDate><guid isPermaLink="true">http://blogs.meetandplay.com/JTilton/archive/2007/08/02/3268.aspx</guid><wfw:comment>http://blogs.meetandplay.com/JTilton/comments/3268.aspx</wfw:comment><wfw:commentRss>http://blogs.meetandplay.com/JTilton/comments/commentRss/3268.aspx</wfw:commentRss><comments>http://blogs.meetandplay.com/JTilton/archive/2007/08/02/3268.aspx#comment</comments><slash:comments>0</slash:comments><trackback:ping>http://blogs.meetandplay.com/JTilton/services/trackbacks/3268.aspx</trackback:ping><source url="http://blogs.meetandplay.com/JTilton/rss.aspx">It was a tough Decision, but we're not going to the U.S. Open Racquetball tournament this year</source><description>&lt;p&gt;Ever since Ian was born in 2003 that particular racquetball event has always been on the chopping block. It's for the love of the sport, and the love of the camaraderie that we continued going. This year however, we decided to hand the torch off to someone else.&lt;/p&gt; &lt;p&gt;A few reasons came into play. Ian and Lexi were a huge reason. It's kind of tough to expect them to contain themselves while we are working on things, and I can't expect them to sit quietly in the tower. Willie and I never got paid monetarily (though it was nice to have a room paid for and food paid for), and always used vacation time to go "work" somewhere else. If that makes sense. Now with the kids our desire to go off and do other things with them has increased, and that was also a reason. Plus with the addition of them into our family, a rental car is completely necessary, I'm not going to chance terrible weather walking blocks to the club with the kids in a stroller freezing, so that was an added expense.  &lt;/p&gt;&lt;p&gt;It's going to be tough this year. We've provided coverage for that event for seven years. Willies been at the open since its inaugural year (first as a player than as employee). It's always been something that we look forward too, and it will be greatly missed on our agenda.  &lt;/p&gt;&lt;img src="http://blogs.meetandplay.com/JTilton/aggbug/3268.aspx" width="1" height="1" /&gt;</description><dc:creator>Jackie Tilton</dc:creator></item><item><title>Back on the court</title><link>http://blogs.meetandplay.com/WTilton/archive/2007/07/26/Back_on_the_court.aspx</link><pubDate>Thu, 26 Jul 2007 21:38:30 GMT</pubDate><guid isPermaLink="true">http://blogs.meetandplay.com/WTilton/archive/2007/07/26/Back_on_the_court.aspx</guid><wfw:comment>http://blogs.meetandplay.com/WTilton/comments/3267.aspx</wfw:comment><wfw:commentRss>http://blogs.meetandplay.com/WTilton/comments/commentRss/3267.aspx</wfw:commentRss><comments>http://blogs.meetandplay.com/WTilton/archive/2007/07/26/Back_on_the_court.aspx#comment</comments><slash:comments>0</slash:comments><trackback:ping>http://blogs.meetandplay.com/WTilton/services/trackbacks/3267.aspx</trackback:ping><source url="http://blogs.meetandplay.com/WTilton/rss.aspx">Back on the court</source><description>&lt;p&gt;I haven't played in awhile due to my shoulder killing me and my back hurting.  Not sure why everything is affecting me so, but I think a big portion of it is that I'm working longer hours and more intensely.  The repetitive stress to my ligaments and joints aggrevates any type of exercise after the fact.&lt;/p&gt; &lt;p&gt;Today I got on the court to see what the potential differences were between running on an elliptical and playing on the court.  Imagine my suprise when playing on the court felt better than running on an elliptical.  I thought that the elliptical would be a lower impact exercise and thus hurt less.  Maybe I was wrong?  I do want to try just swimming a few laps on the next workout session and compare that.  I also saw some dudes playing volleyball, so I might give that a whirl.  I think basketball is out, and I don't want bad knees and I really suck :)&lt;/p&gt; &lt;p&gt;Either way, it's looking up for playing racquetball again!&lt;/p&gt;&lt;img src="http://blogs.meetandplay.com/WTilton/aggbug/3267.aspx" width="1" height="1" /&gt;</description><dc:creator>William C. Tilton</dc:creator></item><item><title>My Only Gripe about Outdoor Nationals</title><link>http://blogs.meetandplay.com/JTilton/archive/2007/07/23/3266.aspx</link><pubDate>Mon, 23 Jul 2007 16:53:22 GMT</pubDate><guid isPermaLink="true">http://blogs.meetandplay.com/JTilton/archive/2007/07/23/3266.aspx</guid><wfw:comment>http://blogs.meetandplay.com/JTilton/comments/3266.aspx</wfw:comment><wfw:commentRss>http://blogs.meetandplay.com/JTilton/comments/commentRss/3266.aspx</wfw:commentRss><comments>http://blogs.meetandplay.com/JTilton/archive/2007/07/23/3266.aspx#comment</comments><slash:comments>0</slash:comments><trackback:ping>http://blogs.meetandplay.com/JTilton/services/trackbacks/3266.aspx</trackback:ping><source url="http://blogs.meetandplay.com/JTilton/rss.aspx">My Only Gripe about Outdoor Nationals</source><description>&lt;p&gt;Well, I can totally understand making it to the finals when you didn't expect it, and having to catch a flight, but the way the women were bumped all the way to the end of the day, even after the Mens Doubles really sucked. The Carson Huczek Match took place instead of the womens finals, and then instead of putting the womens finals on, they waited until after the Men's Open Doubles...which means...everyone left. I'm hoping that everyone stayed and supported them. I would have stayed except my situation is a little different with the kids and such, and we were done. &lt;/p&gt;&lt;img src="http://blogs.meetandplay.com/JTilton/aggbug/3266.aspx" width="1" height="1" /&gt;</description><dc:creator>Jackie Tilton</dc:creator></item><item><title>Racquetball to be played in 2011 Pan-Ams in Guadalajara</title><link>http://blogs.meetandplay.com/WTilton/archive/2007/07/17/Racquetball_to_be_played_in_2011_Pan-Ams_in_Guadalajara.aspx</link><pubDate>Tue, 17 Jul 2007 12:57:40 GMT</pubDate><guid isPermaLink="true">http://blogs.meetandplay.com/WTilton/archive/2007/07/17/Racquetball_to_be_played_in_2011_Pan-Ams_in_Guadalajara.aspx</guid><wfw:comment>http://blogs.meetandplay.com/WTilton/comments/3265.aspx</wfw:comment><wfw:commentRss>http://blogs.meetandplay.com/WTilton/comments/commentRss/3265.aspx</wfw:commentRss><comments>http://blogs.meetandplay.com/WTilton/archive/2007/07/17/Racquetball_to_be_played_in_2011_Pan-Ams_in_Guadalajara.aspx#comment</comments><slash:comments>0</slash:comments><trackback:ping>http://blogs.meetandplay.com/WTilton/services/trackbacks/3265.aspx</trackback:ping><source url="http://blogs.meetandplay.com/WTilton/rss.aspx">Racquetball to be played in 2011 Pan-Ams in Guadalajara</source><description>&lt;p&gt;Very cool.  The Pan-Ams used to be the sports largest event.  Not in terms of racquetball people of course, but in terms of those not playing racquetball that attend the event.  To be re-inducted back into the Pan Am is a big step towards getting Racquetball out there.&lt;/p&gt; &lt;p&gt;&lt;a href="http://meetandplay.com/forum/yaf_postst6502_Rugby-racquetball-to-be-played-in-2011-Pan-Ams-in-Guadalajara.aspx"&gt;Meet and play forums&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.meetandplay.com/WTilton/aggbug/3265.aspx" width="1" height="1" /&gt;</description><dc:creator>William C. Tilton</dc:creator></item><item><title>WOR National Championships</title><link>http://blogs.meetandplay.com/WTilton/archive/2007/07/16/WOR_National_Championships.aspx</link><pubDate>Mon, 16 Jul 2007 13:48:23 GMT</pubDate><guid isPermaLink="true">http://blogs.meetandplay.com/WTilton/archive/2007/07/16/WOR_National_Championships.aspx</guid><wfw:comment>http://blogs.meetandplay.com/WTilton/comments/3264.aspx</wfw:comment><wfw:commentRss>http://blogs.meetandplay.com/WTilton/comments/commentRss/3264.aspx</wfw:commentRss><comments>http://blogs.meetandplay.com/WTilton/archive/2007/07/16/WOR_National_Championships.aspx#comment</comments><slash:comments>1</slash:comments><trackback:ping>http://blogs.meetandplay.com/WTilton/services/trackbacks/3264.aspx</trackback:ping><source url="http://blogs.meetandplay.com/WTilton/rss.aspx">WOR National Championships</source><description>&lt;p&gt;Due to some injuries I sat out this year.  Jackie played a few matches, lost every match, but had fun, which is what it's all about.  The Men's pro was again the focus of the tournament, with the #1 indoor player Jack Huczek joining the fray.&lt;/p&gt; &lt;p&gt;The draws were pretty standard with no suprises.  Rocky, like last year, was looking especially sharp.  He is the new Brian Hawkes, and it's a shame that Hawkes won't get in there now to play.  He advanced through the tournament pretty easily to meet Jack in the finals.&lt;/p&gt; &lt;p&gt;The Jack Huczek and Greg Solis match was a little suprising as I thought that Greg would have beaten Jack.  Greg has way more experience outdoors, but he looked really nervous or overconfident or something...  Either way he played pretty badly, all the while Jack just kept the same heading of getting a few more points than the error prone Greg.&lt;/p&gt; &lt;p&gt;We were going to take off after that match, but then Jack and Rocky decided to play early.  Was a nice deal for me as there were no jumpies on Sunday for the kids (one of the jumpies had died, and the kids were trapped or something on Saturday) so it was hard to justify sitting around for 2 more hours watching them.  &lt;/p&gt; &lt;p&gt;Rocky played outstanding against Jack.  I wish he'd show the same amount of confidence and resolution in indoor.  His serves were masked extremely well, appearing just over the short line and within the wide serve line.  These prove especially difficult to retrieve, and Jack was having a really hard time doing that.  Outdoor singles gets very frustrating because if your serves aren't on, you're going to lose.  Jack early on showed some great gets but Rocky's outdoor experience would have Jack scrambling and then Rocky hitting excellent out the door shots.  I actually saw Jack "give up" on 2 shots.  He looked beaten later in the game, and Rocky just kept pounding away.&lt;/p&gt; &lt;p&gt;The crowd was also wanting Rocky to win badly.  I felt like shouting out some helpful hints for Jack but didn't think he'd listen, plus I'd be the only one cheering for Jack (Hey, I gotta live and play with these dudes the rest of the year :)).  The last match point was particularly uneventful as Rock pounded a head high serve, Jack returned and Rocky dinked it to the corner to finish it out.&lt;/p&gt;&lt;img src="http://blogs.meetandplay.com/WTilton/aggbug/3264.aspx" width="1" height="1" /&gt;</description><dc:creator>William C. Tilton</dc:creator></item><item><title>AES Encryption in VBScript</title><link>http://blogs.meetandplay.com/WPierce/archive/2007/06/29/AES_Encryption_in_VBScript.aspx</link><pubDate>Fri, 29 Jun 2007 09:20:12 GMT</pubDate><guid isPermaLink="true">http://blogs.meetandplay.com/WPierce/archive/2007/06/29/AES_Encryption_in_VBScript.aspx</guid><wfw:comment>http://blogs.meetandplay.com/WPierce/comments/3263.aspx</wfw:comment><wfw:commentRss>http://blogs.meetandplay.com/WPierce/comments/commentRss/3263.aspx</wfw:commentRss><comments>http://blogs.meetandplay.com/WPierce/archive/2007/06/29/AES_Encryption_in_VBScript.aspx#comment</comments><slash:comments>278</slash:comments><trackback:ping>http://blogs.meetandplay.com/WPierce/services/trackbacks/3263.aspx</trackback:ping><source url="http://blogs.meetandplay.com/WPierce/rss.aspx">AES Encryption in VBScript</source><description>&lt;p&gt;VB6/VBScript was one of the first languages I learned to use.  Today, VBScript is still my fall back language when I just need to 'Getter Done!'.  Coupled with Windows Script Host and the Scripting runtime I can use it to automate a large number of otherwise manual tasks.  We have some VBScripts laying around that export data from our datastore on scheduled intervals and make it available to our customers to download via FTP-SSL.  We are adding some new information to the export that is of the sensitive nature and so encryption came up.  Figured since 'Standard' is the S in AES, it made a good choice.  The problem was finding some code to do this in VBScript.  Some digging turned up an implementation in VB6/ASP but it was god awfully large and complicated.  Additionally it was difficult to verify that once encrypted on our side, our customer could easily decrypt it using a previously exchanged Key and Initialization Vector (also using a different programming language all together).  Since the .Net Framework makes encryption dirt simple and it was already on the server I whipped up a simple class that is exposed to COM and easily incorporated into our existing VBScript.&lt;/p&gt; &lt;p&gt;Without going too deep, AES requires a Key and an Initialization Vector (IV) to encrypt something.  You need the same Key and IV to decrypt the info at a later time.  Both of these are byte arrays (byte[]).  The resulting encrypted data is also a byte array.  Now sharing/hard coding a byte array in code is not all that easy.  Rather than share the raw byte array you can base64 encode the data and then you have something that is easily inserted into a text file or transferred via email.  The code below is written in a very targeted manner expecting/returning base64 data, hard coding the algorithm used, ascii encoding, etc.  Please feel free to tweak for your needs.  To expose this to COM, just run "regasm.exe My.Product.dll" and you can run the...cough...unit tests...cough at the end of the sample.  Program note: all of the methods here could be marked static, but COM doesn't like static methods.&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; My.Product
{
  &lt;span class="kwrd"&gt;using&lt;/span&gt; System;
  &lt;span class="kwrd"&gt;using&lt;/span&gt; System.IO;
  &lt;span class="kwrd"&gt;using&lt;/span&gt; System.Runtime.InteropServices;
  &lt;span class="kwrd"&gt;using&lt;/span&gt; System.Security.Cryptography;
  &lt;span class="kwrd"&gt;using&lt;/span&gt; System.Text;

  [ProgId(&lt;span class="str"&gt;"My.Product.Crypto"&lt;/span&gt;)]
  &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Crypto
  {
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Encrypt(&lt;span class="kwrd"&gt;string&lt;/span&gt; base64key, &lt;span class="kwrd"&gt;string&lt;/span&gt; base64iv, &lt;span class="kwrd"&gt;string&lt;/span&gt; clearText)
    {
      SymmetricAlgorithm algorithm = GetAlgorithm();
      algorithm.Key = Convert.FromBase64String(base64key);
      algorithm.IV = Convert.FromBase64String(base64iv);

      &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] clearTextBytes = Encoding.ASCII.GetBytes(clearText);

      &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] cipherTextBytes = Transform(algorithm, clearTextBytes, &lt;span class="kwrd"&gt;false&lt;/span&gt;);

      &lt;span class="kwrd"&gt;return&lt;/span&gt; Convert.ToBase64String(cipherTextBytes);
    }

    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Decrypt(&lt;span class="kwrd"&gt;string&lt;/span&gt; base64key, &lt;span class="kwrd"&gt;string&lt;/span&gt; base64iv, &lt;span class="kwrd"&gt;string&lt;/span&gt; base64cipherText)
    {
      SymmetricAlgorithm algorithm = GetAlgorithm();
      algorithm.Key = Convert.FromBase64String(base64key);
      algorithm.IV = Convert.FromBase64String(base64iv);

      &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] cipherTextBytes = Convert.FromBase64String(base64cipherText);

      &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] clearTextBytes = Transform(algorithm, cipherTextBytes, &lt;span class="kwrd"&gt;true&lt;/span&gt;);

      &lt;span class="kwrd"&gt;return&lt;/span&gt; Encoding.ASCII.GetString(clearTextBytes, 0, clearTextBytes.Length);
    }

    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; DefaultKeySize
    {
      get
      {
        SymmetricAlgorithm algorithm = GetAlgorithm();
        &lt;span class="kwrd"&gt;return&lt;/span&gt; algorithm.KeySize;
      }
    }

    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; DefaultBlockSize
    {
      get
      {
        SymmetricAlgorithm algorithm = GetAlgorithm();
        &lt;span class="kwrd"&gt;return&lt;/span&gt; algorithm.BlockSize;
      }
    }

    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; GenerateBase64Key(&lt;span class="kwrd"&gt;int&lt;/span&gt; keySize)
    {
      SymmetricAlgorithm algorithm = GetAlgorithm();
      algorithm.KeySize = keySize;
      &lt;span class="kwrd"&gt;return&lt;/span&gt; Convert.ToBase64String(algorithm.Key);
    }

    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; GenerateBase64IV(&lt;span class="kwrd"&gt;int&lt;/span&gt; blockSize)
    {
      SymmetricAlgorithm algorithm = GetAlgorithm();
      algorithm.BlockSize = blockSize;
      &lt;span class="kwrd"&gt;return&lt;/span&gt; Convert.ToBase64String(algorithm.IV);
    }

    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] Transform(SymmetricAlgorithm algorithm, &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] bytes, &lt;span class="kwrd"&gt;bool&lt;/span&gt; decrypt)
    {
      &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] transformedBytes = &lt;span class="kwrd"&gt;null&lt;/span&gt;;
      &lt;span class="kwrd"&gt;using&lt;/span&gt; (ICryptoTransform transform = GetTransform(algorithm, decrypt))
      {
        &lt;span class="kwrd"&gt;using&lt;/span&gt; (MemoryStream memoryStream = &lt;span class="kwrd"&gt;new&lt;/span&gt; MemoryStream())
        {
          &lt;span class="kwrd"&gt;using&lt;/span&gt; (CryptoStream cryptoStream = &lt;span class="kwrd"&gt;new&lt;/span&gt; CryptoStream(memoryStream, transform, CryptoStreamMode.Write))
          {
            cryptoStream.Write(bytes, 0, bytes.Length);
          }
          transformedBytes = memoryStream.ToArray();
        }
      }
      &lt;span class="kwrd"&gt;return&lt;/span&gt; transformedBytes;
    }

    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; ICryptoTransform GetTransform(SymmetricAlgorithm algorithim, &lt;span class="kwrd"&gt;bool&lt;/span&gt; decrypt)
    {
      &lt;span class="kwrd"&gt;if&lt;/span&gt; (decrypt)
      {
        &lt;span class="kwrd"&gt;return&lt;/span&gt; algorithim.CreateDecryptor();
      }

      &lt;span class="kwrd"&gt;return&lt;/span&gt; algorithim.CreateEncryptor();
    }

    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; SymmetricAlgorithm GetAlgorithm()
    {
      RijndaelManaged algorithm = &lt;span class="kwrd"&gt;new&lt;/span&gt; RijndaelManaged();
      algorithm.KeySize = 256;
      algorithm.BlockSize = 128;

      &lt;span class="kwrd"&gt;return&lt;/span&gt; algorithm;
    }
  }
}&lt;/pre&gt;
&lt;p&gt; And it's usage in VBScript:&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;Option&lt;/span&gt; Explicit

&lt;span class="kwrd"&gt;Call&lt;/span&gt; Main()

&lt;span class="kwrd"&gt;Sub&lt;/span&gt; Main()
  &lt;span class="kwrd"&gt;Dim&lt;/span&gt; crypto
  &lt;span class="kwrd"&gt;Dim&lt;/span&gt; base64key, base64iv
  &lt;span class="kwrd"&gt;Dim&lt;/span&gt; clearText, cryptText, cryptText2, decryptText

  &lt;span class="kwrd"&gt;Set&lt;/span&gt; crypto = CreateObject(&lt;span class="str"&gt;"My.Product.Crypto"&lt;/span&gt;)
  base64key = crypto.GenerateBase64Key(crypto.DefaultKeySize)
  base64iv = crypto.GenerateBase64IV(crypto.DefaultBlockSize)
  clearText = &lt;span class="str"&gt;"EncryptThis"&lt;/span&gt;

  cryptText = crypto.Encrypt(base64key, base64iv, clearText)
  decryptText = crypto.Decrypt(base64key, base64iv, cryptText)
  &lt;span class="kwrd"&gt;If&lt;/span&gt; clearText &amp;lt;&amp;gt; decryptText &lt;span class="kwrd"&gt;Then&lt;/span&gt;
    MsgBox &lt;span class="str"&gt;"Decrypting did not yield correct value"&lt;/span&gt;
    &lt;span class="kwrd"&gt;Exit&lt;/span&gt; &lt;span class="kwrd"&gt;Sub&lt;/span&gt;
  &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt;

  cryptText = crypto.Encrypt(base64key, base64iv, clearText)
  cryptText2 = crypto.Encrypt(base64key, base64iv, clearText)
  &lt;span class="kwrd"&gt;If&lt;/span&gt; cryptText &amp;lt;&amp;gt; cryptText2 &lt;span class="kwrd"&gt;Then&lt;/span&gt;
    MsgBox &lt;span class="str"&gt;"Encrypting twice produces different results"&lt;/span&gt;
    &lt;span class="kwrd"&gt;Exit&lt;/span&gt; &lt;span class="kwrd"&gt;Sub&lt;/span&gt;
  &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt;

  MsgBox &lt;span class="str"&gt;"All Tests Passed"&lt;/span&gt;    
&lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Sub&lt;/span&gt;&lt;/pre&gt;&lt;img src="http://blogs.meetandplay.com/WPierce/aggbug/3263.aspx" width="1" height="1" /&gt;</description><dc:creator>Bill Pierce</dc:creator></item><item><title>MonoRail - Efficient Tab Indexing</title><link>http://blogs.meetandplay.com/WPierce/archive/2007/06/26/MonoRail_-_Efficient_Tab_Indexing.aspx</link><pubDate>Tue, 26 Jun 2007 17:13:33 GMT</pubDate><guid isPermaLink="true">http://blogs.meetandplay.com/WPierce/archive/2007/06/26/MonoRail_-_Efficient_Tab_Indexing.aspx</guid><wfw:comment>http://blogs.meetandplay.com/WPierce/comments/3262.aspx</wfw:comment><wfw:commentRss>http://blogs.meetandplay.com/WPierce/comments/commentRss/3262.aspx</wfw:commentRss><comments>http://blogs.meetandplay.com/WPierce/archive/2007/06/26/MonoRail_-_Efficient_Tab_Indexing.aspx#comment</comments><slash:comments>2</slash:comments><trackback:ping>http://blogs.meetandplay.com/WPierce/services/trackbacks/3262.aspx</trackback:ping><source url="http://blogs.meetandplay.com/WPierce/rss.aspx">MonoRail - Efficient Tab Indexing</source><description>&lt;p&gt;I'm a big fan of keyboard shortcuts for the &lt;a href="http://support.microsoft.com/kb/126449" target="_blank"&gt;Windows&lt;/a&gt;, &lt;a href="http://www.jetbrains.com/resharper/documentation/20_DefaultKeymap.pdf" target="_blank"&gt;Resharper&lt;/a&gt;, &lt;a href="http://www.mozilla.org/support/firefox/keyboard" target="_blank"&gt;Firefox&lt;/a&gt;, &lt;a href="http://hah.mozdev.org/" target="_blank"&gt;Web Browsing&lt;/a&gt;, &lt;a href="http://mail.google.com/support/bin/answer.py?answer=6594" target="_blank"&gt;GMail&lt;/a&gt;, etc.  The less I touch the mouse the more productive I am.  One thing that can make a great web application suck hard is poor or absent tab indexing on form fields.  It takes a little extra time on the developers part but it makes a world of difference to the end user.  Rather than hard code tabIndexes, I use the following technique using a simple accumulator:&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;?&lt;/span&gt;&lt;span class="html"&gt;brail&lt;/span&gt;
  &lt;span class="attr"&gt;tabIndex&lt;/span&gt; = &lt;span class="attr"&gt;1&lt;/span&gt;
?&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;

${Form.FormTag({'action':'login'})}
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;table&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;${Form.LabelFor('username', 'Username')}&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
      ${Form.TextField('username', {'tabIndex':tabIndex++})}
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;${Form.LabelFor('password', 'Password')}&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;${Form.PasswordField('password', {'tabIndex':tabIndex++})}&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;${Form.Submit('Login', {'tabIndex':tabIndex++})}&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;table&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
${Form.EndFormTag()}&lt;/pre&gt;
&lt;p&gt;One problem I struggled with in ASP.Net was allowing tabIndexes to properly flow from a page to a user control then back again.  I'm going to ping &lt;a href="http://www.ayende.com/blog/" target="_blank"&gt;Oren&lt;/a&gt; to see if it is possible to declare tabIndex 'globally' (in a layout maybe?) and allow all views/sub views/view components to use the same value to try and address this in MonoRail.&lt;/p&gt;&lt;img src="http://blogs.meetandplay.com/WPierce/aggbug/3262.aspx" width="1" height="1" /&gt;</description><dc:creator>Bill Pierce</dc:creator></item><item><title>Dexagogo - Alert Validation Advice</title><link>http://blogs.meetandplay.com/WPierce/archive/2007/06/26/Dexagogo_-_Alert_Validation_Advice.aspx</link><pubDate>Tue, 26 Jun 2007 13:18:42 GMT</pubDate><guid isPermaLink="true">http://blogs.meetandplay.com/WPierce/archive/2007/06/26/Dexagogo_-_Alert_Validation_Advice.aspx</guid><wfw:comment>http://blogs.meetandplay.com/WPierce/comments/3261.aspx</wfw:comment><wfw:commentRss>http://blogs.meetandplay.com/WPierce/comments/commentRss/3261.aspx</wfw:commentRss><comments>http://blogs.meetandplay.com/WPierce/archive/2007/06/26/Dexagogo_-_Alert_Validation_Advice.aspx#comment</comments><slash:comments>0</slash:comments><trackback:ping>http://blogs.meetandplay.com/WPierce/services/trackbacks/3261.aspx</trackback:ping><source url="http://blogs.meetandplay.com/WPierce/rss.aspx">Dexagogo - Alert Validation Advice</source><description>&lt;p&gt;I recently blogged about using &lt;a href="http://tetlaw.id.au/view/javascript/really-easy-field-validation" target="_blank"&gt;Dexagago&lt;/a&gt; &lt;a href="http://blogs.meetandplay.com/WPierce/archive/2007/06/23/MonoRail_-_Form_Validation_the_Hard_Way.aspx" target="_blank"&gt;validation API with MonoRail&lt;/a&gt;.  The API allows you to specify your own advice messages in any HTML element.  The framework will take care of showing/hiding the element as needed during validation.  I wanted to be able to display a javascript alert box with validation messages in certain cases.  Here's what I came up with:&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;="text/javascript"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;function&lt;/span&gt; AlertAdvice(isValid, el)
  {
    &lt;span class="kwrd"&gt;if&lt;/span&gt;( !isValid )
    { 
      alert(el.title);
      &lt;span class="kwrd"&gt;if&lt;/span&gt;(el.select) el.select();
    }
  }
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;

${Form.FormTag({'action':'login','immediate':'false','stopOnFirst':'true','onElementValidate':'AlertAdvice'})}
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;table&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;${Form.LabelFor('username', 'Username')}&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
      ${Form.TextField('username', {'class':'required','title':'Please enter a Username'})}
      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt; &lt;span class="attr"&gt;id&lt;/span&gt;&lt;span class="kwrd"&gt;="advice-username"&lt;/span&gt; &lt;span class="attr"&gt;style&lt;/span&gt;&lt;span class="kwrd"&gt;="visibility: hidden;"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;${Form.LabelFor('password', 'Password')}&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;${Form.PasswordField('password', {'class':'required'})}&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;${Form.Submit('Login')}&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;table&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
${Form.EndFormTag()}&lt;/pre&gt;
&lt;p&gt;First we specify a javascript function 'AlertAdvice' that will be called by the validation API for each validator on our form.  If the validator fails (empty required field, alpha in a numeric field, etc) we display the contents of the title attribute, then for good measure we select the contents of the field.  When specifying your form tag you want to make sure to set immediate to false.  I found this out the hard way (took me a few tries :) otherwise you will be locked in a tight loop with a constant alert on invalid fields.  I also set stopOnFirst to true so that the user doesn't get overwhelmed with prompts for a large number of invalid fields.  Finally, we hook up our AlertAdvice function with the onElementValidate property.&lt;/p&gt;
&lt;p&gt;You need to put the message you want displayed in the prompt in the title attribute of your field, ${Form.TextField('username', {'class':'required','title':'Please enter a Username'})} in our example above.  Finally, I wasn't able to find a way to disable the API's automatic display of an advice message.  To work around this, I add a hidden div element with a name of advice-&amp;lt;fieldName&amp;gt;. &lt;/p&gt;
&lt;p&gt;Lightly tested in IE6 and FF2.&lt;/p&gt;&lt;img src="http://blogs.meetandplay.com/WPierce/aggbug/3261.aspx" width="1" height="1" /&gt;</description><dc:creator>Bill Pierce</dc:creator></item><item><title>MonoRail - Initial Focus ViewComponent</title><link>http://blogs.meetandplay.com/WPierce/archive/2007/06/25/MonoRail_-_Initial_Focus_ViewComponent.aspx</link><pubDate>Mon, 25 Jun 2007 11:41:51 GMT</pubDate><guid isPermaLink="true">http://blogs.meetandplay.com/WPierce/archive/2007/06/25/MonoRail_-_Initial_Focus_ViewComponent.aspx</guid><wfw:comment>http://blogs.meetandplay.com/WPierce/comments/3260.aspx</wfw:comment><wfw:commentRss>http://blogs.meetandplay.com/WPierce/comments/commentRss/3260.aspx</wfw:commentRss><comments>http://blogs.meetandplay.com/WPierce/archive/2007/06/25/MonoRail_-_Initial_Focus_ViewComponent.aspx#comment</comments><slash:comments>0</slash:comments><trackback:ping>http://blogs.meetandplay.com/WPierce/services/trackbacks/3260.aspx</trackback:ping><source url="http://blogs.meetandplay.com/WPierce/rss.aspx">MonoRail - Initial Focus ViewComponent</source><description>&lt;p&gt;Need to set initial focus to a field on your form?  This component is adapted from &lt;a href="http://nerd-o-matic.blogspot.com/" target="_blank"&gt;Fábio&lt;/a&gt;'s code on the &lt;a href="http://forum.castleproject.org/viewtopic.php?t=2308&amp;amp;highlight=focus" target="_blank"&gt;MonoRail forums&lt;/a&gt;.&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; My.Product.Mvc
{
  &lt;span class="kwrd"&gt;using&lt;/span&gt; Castle.MonoRail.Framework;

  [ViewComponentDetails(&lt;span class="str"&gt;"InitialFocus"&lt;/span&gt;)]
  &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; InitialFocusComponent : ViewComponent
  {
    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; FOCUS_TEMPLATE =
      &lt;span class="str"&gt;"&amp;lt;script type=\"text/javascript\"&amp;gt;Event.observe(window,'load',function(){{$('{0}').focus();}});&amp;lt;/script&amp;gt;"&lt;/span&gt;;

    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; _id;
    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; _shouldRender;

    [ViewComponentParam(Required=&lt;span class="kwrd"&gt;true&lt;/span&gt;)]
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;virtual&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Id
    {
      get { &lt;span class="kwrd"&gt;return&lt;/span&gt; _id; }
      set { _id = &lt;span class="kwrd"&gt;value&lt;/span&gt;; }
    }

    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Initialize()
    {
      &lt;span class="kwrd"&gt;if&lt;/span&gt;( !Context.ContextVars.Contains(&lt;span class="str"&gt;"__Initial_Focus_Set__"&lt;/span&gt;) )
      {
        Context.ContextVars[&lt;span class="str"&gt;"__Initial_Focus_Set__"&lt;/span&gt;] = Id;
        _shouldRender = &lt;span class="kwrd"&gt;true&lt;/span&gt;;
      }
    }

    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Render()
    {
      &lt;span class="kwrd"&gt;if&lt;/span&gt;( _shouldRender )
      {
        RenderText(&lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(FOCUS_TEMPLATE, Id));
      }
    }
  }
}&lt;/pre&gt;
&lt;p&gt;Use in your view like so:&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="asp"&gt;&amp;lt;%&lt;/span&gt; component InitialFocus, {&lt;span class="str"&gt;'id'&lt;/span&gt;:&lt;span class="str"&gt;'username'&lt;/span&gt;} &lt;span class="asp"&gt;%&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;This component is "first in wins" meaning if you include multiple component references in the same view/subview, the first field specified will get initial focus.  So far this has only been lightly tested on text fields.&lt;/p&gt;&lt;img src="http://blogs.meetandplay.com/WPierce/aggbug/3260.aspx" width="1" height="1" /&gt;</description><dc:creator>Bill Pierce</dc:creator></item><item><title>Ice is my friend</title><link>http://blogs.meetandplay.com/WTilton/archive/2007/06/23/Ice_is_my_friend.aspx</link><pubDate>Sat, 23 Jun 2007 18:59:58 GMT</pubDate><guid isPermaLink="true">http://blogs.meetandplay.com/WTilton/archive/2007/06/23/Ice_is_my_friend.aspx</guid><wfw:comment>http://blogs.meetandplay.com/WTilton/comments/3259.aspx</wfw:comment><wfw:commentRss>http://blogs.meetandplay.com/WTilton/comments/commentRss/3259.aspx</wfw:commentRss><comments>http://blogs.meetandplay.com/WTilton/archive/2007/06/23/Ice_is_my_friend.aspx#comment</comments><slash:comments>0</slash:comments><trackback:ping>http://blogs.meetandplay.com/WTilton/services/trackbacks/3259.aspx</trackback:ping><source url="http://blogs.meetandplay.com/WTilton/rss.aspx">Ice is my friend</source><description>&lt;p&gt;For some reason I've never really gotten all that sore in my life in althetics.  I've played tournaments and had the sore muscles after the fact, but never the cramping, never an injury, never intense pain.&lt;/p&gt; &lt;p&gt;With my back now I was told stuff about using ice and heat, along with some stuff like IB Profen, but never really did it...until now.&lt;/p&gt; &lt;p&gt;I was thinking that my back would take another few weeks to heal up, but I've been icing the crap out of it along with taking medicine to thin the blood.  Sure enough it's helping a lot!  I can ice it for 10 minutes when it really starts hurting and for awhile it'll actually go away entirely.&lt;/p&gt; &lt;p&gt;I love you Ice.&lt;/p&gt;&lt;img src="http://blogs.meetandplay.com/WTilton/aggbug/3259.aspx" width="1" height="1" /&gt;</description><dc:creator>William C. Tilton</dc:creator></item><item><title>MonoRail - Collocate your Strings</title><link>http://blogs.meetandplay.com/WPierce/archive/2007/06/23/MonoRail_-_Collocate_your_Strings.aspx</link><pubDate>Sat, 23 Jun 2007 09:33:26 GMT</pubDate><guid isPermaLink="true">http://blogs.meetandplay.com/WPierce/archive/2007/06/23/MonoRail_-_Collocate_your_Strings.aspx</guid><wfw:comment>http://blogs.meetandplay.com/WPierce/comments/3258.aspx</wfw:comment><wfw:commentRss>http://blogs.meetandplay.com/WPierce/comments/commentRss/3258.aspx</wfw:commentRss><comments>http://blogs.meetandplay.com/WPierce/archive/2007/06/23/MonoRail_-_Collocate_your_Strings.aspx#comment</comments><slash:comments>3</slash:comments><trackback:ping>http://blogs.meetandplay.com/WPierce/services/trackbacks/3258.aspx</trackback:ping><source url="http://blogs.meetandplay.com/WPierce/rss.aspx">MonoRail - Collocate your Strings</source><description>&lt;p&gt;Localization is a pain.  Anybody who says different is a sadist.  It's especially difficult if you are trying to retrofit an app that didn't even try i.e. hard coding all strings in code/views.  Even if I'm not developing an application with localization in mind, I still strive to put all strings in a resx file and never hard code them anywhere.  The recommended method for localizing a standard ASP.Net application was to have a single resx file per page.  Similarly for a WinForms app you would have one resx file per Form.  In a WinForms app this is slightly more understandable since you may need to resize fields to accommodate different languages.  However in web apps the only thing I ever store in a resx file is strings.  &lt;/p&gt; &lt;p&gt;ASP.Net 2.0 introduced the concept of an App_GlobalResource that can be accessed from any page in your site.  This was a step in the right direction because you could easily reuse common strings as needed.  There are cases however when I need to generate a message in my business layer that will ultimately be displayed to the user.  So I end up needing a resx file in my Core assembly, and a resx file in my web app.  Kind of defeats the purpose of a centralized location for strings.  The problem is further compounded by the fact that VS2005 generates a strongly typed wrapper for your resx file that has all strings marked as internal.  So I can't easily put all of my strings in my Core assembly and then reference them in my web app.&lt;/p&gt; &lt;p&gt;I little googling turned up a work around that allows you to &lt;a href="http://blogs.msdn.com/lifenglu/archive/2006/03/16/553348.aspx" target="_blank"&gt;generate a wrapper with public properties&lt;/a&gt;.  This method worked just fine but I get anal about such things and wanted my publicly generated code to match as closely as possible to what VS2005 would have created for me.  Here is my adapted code to generate a file called Strings.Designer.cs that contains a public wrapper class called Strings in namespace My.Product.Core for my Strings.resx resource file:&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Compile&lt;/span&gt; &lt;span class="attr"&gt;Include&lt;/span&gt;&lt;span class="kwrd"&gt;="Strings.Designer.cs"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;AutoGen&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;True&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;AutoGen&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;DesignTime&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;True&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;DesignTime&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;DependentUpon&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Strings.resx&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;DependentUpon&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Compile&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ItemGroup&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;EmbeddedResource&lt;/span&gt; &lt;span class="attr"&gt;Include&lt;/span&gt;&lt;span class="kwrd"&gt;="Strings.resx"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;SubType&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Designer&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;SubType&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;LastGenOutput&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Strings.Designer.cs&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;LastGenOutput&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;EmbeddedResource&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;ItemGroup&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="rem"&gt;&amp;lt;!-- Generate Strings.Designer.cs with Public access --&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Target&lt;/span&gt; &lt;span class="attr"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;="BeforeBuild"&lt;/span&gt; &lt;span class="attr"&gt;DependsOnTargets&lt;/span&gt;&lt;span class="kwrd"&gt;="GenStrongTypeResource"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Target&lt;/span&gt; &lt;span class="attr"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;="GenStrongTypeResource"&lt;/span&gt; &lt;span class="attr"&gt;Inputs&lt;/span&gt;&lt;span class="kwrd"&gt;="Strings.resx"&lt;/span&gt; &lt;span class="attr"&gt;Outputs&lt;/span&gt;&lt;span class="kwrd"&gt;="Strings.Designer.cs"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;GetFrameworkSdkPath&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Output&lt;/span&gt; &lt;span class="attr"&gt;TaskParameter&lt;/span&gt;&lt;span class="kwrd"&gt;="Path"&lt;/span&gt; &lt;span class="attr"&gt;PropertyName&lt;/span&gt;&lt;span class="kwrd"&gt;="SdkPath"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;GetFrameworkSdkPath&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Exec&lt;/span&gt; &lt;span class="attr"&gt;Command&lt;/span&gt;&lt;span class="kwrd"&gt;="&amp;amp;quot;$(SdkPath)\bin\resGen.exe&amp;amp;quot; /str:c#,My.Product.Core,Strings,Strings.Designer.cs /publicClass Strings.resx"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Target&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;The first part of the post is pretty generic, lets see how we can now use our strongly typed Strings class in our MonoRail views.&lt;/p&gt;
&lt;p&gt;MonoRail supports &lt;a href="http://www.castleproject.org/monorail/documentation/trunk/usersguide/res_localization.html" target="_blank"&gt;Localization&lt;/a&gt; in a similar manner to ASP.Net.  You specify which resource file you want to read from and then assign it a friendly name you can use in your view.  Using my technique described above, you essentially bypass all of that.  My &lt;a href="http://www.castleproject.org/monorail/documentation/trunk/viewengines/comparisson.html" target="_blank"&gt;view engine&lt;/a&gt; of choice is &lt;a href="http://www.castleproject.org/monorail/documentation/trunk/viewengines/brail/index.html" target="_blank"&gt;Brail&lt;/a&gt;.  To be frank, I'm not sure if you will be able to use this method with NVelocity or any of the other engines.&lt;/p&gt;
&lt;p&gt;First off, we need to &lt;a href="http://www.castleproject.org/monorail/documentation/trunk/viewengines/brail/configuring.html" target="_blank"&gt;configure Brail&lt;/a&gt; with our Core assembly.  You do so in your web.config file:&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;brail &lt;/span&gt;&lt;span class="attr"&gt;debug&lt;/span&gt;&lt;span class="kwrd"&gt;="true" &lt;/span&gt;&lt;span class="attr"&gt;saveToDisk&lt;/span&gt;&lt;span class="kwrd"&gt;="false" &lt;/span&gt;&lt;span class="attr"&gt;saveDirectory&lt;/span&gt;&lt;span class="kwrd"&gt;="BrailGen" &lt;/span&gt;&lt;span class="attr"&gt;batch&lt;/span&gt;&lt;span class="kwrd"&gt;="false" &lt;/span&gt;&lt;span class="attr"&gt;commonScriptsDirectory&lt;/span&gt;&lt;span class="kwrd"&gt;="CommonScripts"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;reference&lt;/span&gt; &lt;span class="attr"&gt;assembly&lt;/span&gt;&lt;span class="kwrd"&gt;="My.Product.Core"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;brail&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;Next, you add an import statement to your view and then you can use the generated Strings class just like you would in your C# code.  Here is the localized version of the login view I used as an example in my &lt;a href="http://blogs.meetandplay.com/WPierce/archive/2007/06/23/MonoRail_-_Form_Validation_the_Hard_Way.aspx" target="_blank"&gt;last post&lt;/a&gt;:&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="asp"&gt;&amp;lt;%&lt;/span&gt;
  import My.Product.Core
&lt;span class="asp"&gt;%&amp;gt;&lt;/span&gt;

${Form.FormTag({'action':'login'})}
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;table&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;${Form.LabelFor('username', Strings.Username)}&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;${Form.TextField('username', {'class':'required'})}&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt; &lt;span class="attr"&gt;id&lt;/span&gt;&lt;span class="kwrd"&gt;="advice-username"&lt;/span&gt; &lt;span class="attr"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;="advice"&lt;/span&gt; &lt;span class="attr"&gt;style&lt;/span&gt;&lt;span class="kwrd"&gt;="display: none;"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;${Strings.UsernameRequired}&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;${Form.LabelFor('password', Strings.Password)}&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;${Form.PasswordField('password', {'class':'required'})}&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td /&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;${Form.Submit(Strings.Login)}&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;table&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
${Form.EndFormTag()}&lt;/pre&gt;
&lt;p&gt;Nice and easy. Now all of the strings used in your application are centralized in a single file. This makes translation more straight forward and helps prevent duplication of strings in multiple resx files. You could easily extend this and have a Strings assembly that only contains a resx file that could be reused in multiple applications.&lt;/p&gt;&lt;img src="http://blogs.meetandplay.com/WPierce/aggbug/3258.aspx" width="1" height="1" /&gt;</description><dc:creator>Bill Pierce</dc:creator></item><item><title>MonoRail - Form Validation the Hard Way</title><link>http://blogs.meetandplay.com/WPierce/archive/2007/06/23/MonoRail_-_Form_Validation_the_Hard_Way.aspx</link><pubDate>Sat, 23 Jun 2007 08:47:03 GMT</pubDate><guid isPermaLink="true">http://blogs.meetandplay.com/WPierce/archive/2007/06/23/MonoRail_-_Form_Validation_the_Hard_Way.aspx</guid><wfw:comment>http://blogs.meetandplay.com/WPierce/comments/3257.aspx</wfw:comment><wfw:commentRss>http://blogs.meetandplay.com/WPierce/comments/commentRss/3257.aspx</wfw:commentRss><comments>http://blogs.meetandplay.com/WPierce/archive/2007/06/23/MonoRail_-_Form_Validation_the_Hard_Way.aspx#comment</comments><slash:comments>3</slash:comments><trackback:ping>http://blogs.meetandplay.com/WPierce/services/trackbacks/3257.aspx</trackback:ping><source url="http://blogs.meetandplay.com/WPierce/rss.aspx">MonoRail - Form Validation the Hard Way</source><description>&lt;p&gt;Why would you want to do something the hard way?  Well of course you do something the hard way when you can't do something the easy way (unless you are &lt;a href="http://www.ayende.com/blog/" target="_blank"&gt;Oren&lt;/a&gt; in which case you do everything your way :).  &lt;a href="http://hammett.castleproject.org/" target="_blank"&gt;Hammett&lt;/a&gt; has several excellent posts on how to do form validation the easy way using the &lt;a href="http://hammett.castleproject.org/?p=114" target="_blank"&gt;Castle Validator&lt;/a&gt; component (&lt;a href="http://hammett.castleproject.org/?p=106" target="_blank"&gt;screencast&lt;/a&gt; and &lt;a href="http://hammett.castleproject.org/?p=140" target="_blank"&gt;additional thoughts&lt;/a&gt;).  The component makes validation dirt simple especially if you are using &lt;a href="http://www.castleproject.org/activerecord/index.html" target="_blank"&gt;ActiveRecord&lt;/a&gt;.  However the default implementation ties validators to attributes on the model which works 80% of the time.  &lt;/p&gt; &lt;p&gt;For the 20% of the time when you want to get validators from somewhere else one would need to implement a custom &lt;a href="http://svn.castleproject.org:8080/svn/castle/trunk/Components/General/Validator/Castle.Components.Validator/IValidatorRegistry.cs" target="_blank"&gt;IValidatorRegistry&lt;/a&gt;.  IValidatorRegistry is responsible for providing all validators for given type and/or property back to the validation framework.  Are you feeling the love?  All you need to do is customize where the validators come from, and you still benefit from the runtime and client side validation generation. w00t!  So, in theory your DatabaseValidatorRegistry could query a...database...to retrieve all validators for a given type and property.  Allowing you to craft an interface where by the end user could modify validation rules at will.  I'm getting a little dizzy just thinking about the possibilities.  I haven't gone there yet but when I do you will be the first to know.&lt;/p&gt; &lt;p&gt;That last paragraph literally popped into my head as I was starting this post.  I actually was going in a different direction for this particular discussion but I just had to put it down on paper.  What I really want to talk about is doing simple client side validation using the client side Validator scripts.  I have a simple login prompt with username and password.  I want to do client side validation to ensure they enter a username and password before submitting the form.  What do you do?  Go.&lt;/p&gt; &lt;p&gt;First things first, you need to install the client side scripts.  It is recommended to do this in your &lt;a href="http://www.castleproject.org/monorail/documentation/trunk/usersguide/layouts.html" target="_blank"&gt;layout&lt;/a&gt; so that the scripts are included on all of your pages:&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;head&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;title&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;MonoRail Validation&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;title&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    ${Ajax.InstallScripts()}
    ${Form.InstallScripts()}
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;head&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;What exactly does this do?  Among other things it emits script tags for the &lt;a href="http://www.prototypejs.org/" target="_blank"&gt;Prototype&lt;/a&gt; libraries and the &lt;a href="http://tetlaw.id.au/view/javascript/really-easy-field-validation" target="_blank"&gt;Dexagogo&lt;/a&gt; 'really easy field validation' libraries.  The next step is to create a form in your view with the necessary fields:&lt;/p&gt;&lt;pre class="csharpcode"&gt;${Form.FormTag({'action':'login'})}
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;table&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;${Form.LabelFor('username', 'Username')}&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;${Form.TextField('username', {'class':'required'})}&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt; &lt;span class="attr"&gt;id&lt;/span&gt;&lt;span class="kwrd"&gt;="advice-username"&lt;/span&gt; &lt;span class="attr"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;="advice"&lt;/span&gt; &lt;span class="attr"&gt;style&lt;/span&gt;&lt;span class="kwrd"&gt;="display: none;"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Please enter a Username&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;${Form.LabelFor('password', 'Password')}&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;${Form.PasswordField('password', {'class':'required'})}&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt; /&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;${Form.Submit('Login')}&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;table&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
${Form.EndFormTag()}&lt;/pre&gt;
&lt;p&gt;How hard is it to make a field required?  Excruciating!  First the Form.FormTag automatically hooks up the required logic to the validation libraries.  See the 'class':'required' in the TextField and PasswordField elements?  The Dexagogo code uses CSS selectors (similar to &lt;a href="http://www.bennolan.com/behaviour/" target="_blank"&gt;Behaviour&lt;/a&gt;) to execute validation when the user clicks the Login button.  THAT'S IT!  Now, when you click Login without entering a username, the form will not be submitted and you will be presented with a lovely error message.  The Dexagogo site documents the twelve built in validations you can perform (dates, numbers, email, etc).  If you need more you can specify your own validation callback that will get executed when the form is submitted.  Dexagogo has a number of standard validation messages, but you can easily substitute your own by adding an element to your page with an id of "advice-&amp;lt;fieldName&amp;gt;".  If validation fails, this element will be shown to the user.  I applied a class of "advice" to my element so I could easily style error messages.  One oddity was that I had to inline specify the display: none.  Putting this in my external stylesheet caused the error message to not be shown properly.  The use of CSS selectors also makes it very easy for you to style your required fields (with a yellow background maybe?)  and style your numeric only fields and provide a standard legend to your users.&lt;/p&gt;
&lt;p&gt;You can also specify some additional options in the FormTag (Hammett touched on these briefly in his screen cast).  If you want "advice" shown to the user immediately when the leave a field and you want to turn off the default of focusing on invalid fields, you would specify your FormTag like so.&lt;/p&gt;&lt;pre class="csharpcode"&gt;${Form.FormTag({'action':'login','immediate':'true','focusOnError':'false'})}&lt;/pre&gt;
&lt;p&gt;Finally I'll reiterate the best practice you've heard before, always validate your data server side in addition to any client side validation you may perform.  For your reference here is the fully generated code for the view above:&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;!&lt;/span&gt;&lt;span class="html"&gt;DOCTYPE&lt;/span&gt; &lt;span class="attr"&gt;html&lt;/span&gt; &lt;span class="attr"&gt;PUBLIC&lt;/span&gt; &lt;span class="kwrd"&gt;"-//W3C//DTD XHTML 1.0 Transitional//EN"&lt;/span&gt; &lt;span class="kwrd"&gt;"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;html&lt;/span&gt; &lt;span class="attr"&gt;xmlns&lt;/span&gt;&lt;span class="kwrd"&gt;="http://www.w3.org/1999/xhtml"&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;head&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;title&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;MonoRail Validation&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;title&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;="text/javascript"&lt;/span&gt; &lt;span class="attr"&gt;src&lt;/span&gt;&lt;span class="kwrd"&gt;="/MonoRail/Files/AjaxScripts.rails?RC3_0006"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &amp;lt;script type=&lt;span class="str"&gt;"text/javascript"&lt;/span&gt; src=&lt;span class="str"&gt;"/MonoRail/Files/FormHelperScript.rails?RC3_0006"&lt;/span&gt;&amp;gt;&amp;lt;/script&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;form action=&lt;span class="str"&gt;'/login/login.rails'&lt;/span&gt; method=&lt;span class="str"&gt;'post'&lt;/span&gt; id=&lt;span class="str"&gt;'form1'&lt;/span&gt; &amp;gt;
      &amp;lt;table&amp;gt;
        &amp;lt;tr&amp;gt;
          &amp;lt;td&amp;gt;&amp;lt;label &lt;span class="kwrd"&gt;for&lt;/span&gt;=&lt;span class="str"&gt;"username"&lt;/span&gt;&amp;gt;Username&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;
          &amp;lt;td&amp;gt;&amp;lt;input type=&lt;span class="str"&gt;"text"&lt;/span&gt; id=&lt;span class="str"&gt;"username"&lt;/span&gt; name=&lt;span class="str"&gt;"username"&lt;/span&gt; value=&lt;span class="str"&gt;""&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt;=&lt;span class="str"&gt;"required"&lt;/span&gt; /&amp;gt;&amp;lt;/td&amp;gt;
          &amp;lt;td&amp;gt;&amp;lt;div id=&lt;span class="str"&gt;"advice-username"&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt;=&lt;span class="str"&gt;"advice"&lt;/span&gt; style=&lt;span class="str"&gt;"display: none;"&lt;/span&gt;&amp;gt;Please enter a Username&amp;lt;/div&amp;gt;&amp;lt;/td&amp;gt;
        &amp;lt;/tr&amp;gt;
        &amp;lt;tr&amp;gt;
          &amp;lt;td&amp;gt;&amp;lt;label &lt;span class="kwrd"&gt;for&lt;/span&gt;=&lt;span class="str"&gt;"password"&lt;/span&gt;&amp;gt;Password&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;
          &amp;lt;td&amp;gt;&amp;lt;input type=&lt;span class="str"&gt;"password"&lt;/span&gt; id=&lt;span class="str"&gt;"password"&lt;/span&gt; name=&lt;span class="str"&gt;"password"&lt;/span&gt; value=&lt;span class="str"&gt;""&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt;=&lt;span class="str"&gt;"required"&lt;/span&gt; /&amp;gt;&amp;lt;/td&amp;gt;
          &amp;lt;td /&amp;gt;
        &amp;lt;/tr&amp;gt;
        &amp;lt;tr&amp;gt;
          &amp;lt;td /&amp;gt;
          &amp;lt;td&amp;gt;&amp;lt;input type=&lt;span class="str"&gt;"submit"&lt;/span&gt; value=&lt;span class="str"&gt;"Login"&lt;/span&gt; /&amp;gt;&amp;lt;/td&amp;gt;
          &amp;lt;td /&amp;gt;
        &amp;lt;/tr&amp;gt;
      &amp;lt;/table&amp;gt;
      &amp;lt;script type=&lt;span class="str"&gt;"text/javascript"&lt;/span&gt;&amp;gt;
        &lt;span class="kwrd"&gt;if&lt;/span&gt; (!window.prototypeValidators) prototypeValidators = $A([]);
        &lt;span class="kwrd"&gt;var&lt;/span&gt; validator = &lt;span class="kwrd"&gt;new&lt;/span&gt; Validation(&lt;span class="str"&gt;'form1'&lt;/span&gt;, {onSubmit:&lt;span class="kwrd"&gt;true&lt;/span&gt;, focusOnError:&lt;span class="kwrd"&gt;true&lt;/span&gt;, stopOnFirst:&lt;span class="kwrd"&gt;false&lt;/span&gt;, immediate:&lt;span class="kwrd"&gt;true&lt;/span&gt;, useTitles:&lt;span class="kwrd"&gt;true&lt;/span&gt;});
        prototypeValidators[&lt;span class="str"&gt;'form1'&lt;/span&gt;] = validator;
      &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;form&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;body&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;html&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;img src="http://blogs.meetandplay.com/WPierce/aggbug/3257.aspx" width="1" height="1" /&gt;</description><dc:creator>Bill Pierce</dc:creator></item><item><title>MonoRail - URL Rewriting and Persisting QueryString Parameters</title><link>http://blogs.meetandplay.com/WPierce/archive/2007/06/21/MonoRail_-_URL_Rewriting_and_Persisting_QueryString_Parameters.aspx</link><pubDate>Thu, 21 Jun 2007 11:29:04 GMT</pubDate><guid isPermaLink="true">http://blogs.meetandplay.com/WPierce/archive/2007/06/21/MonoRail_-_URL_Rewriting_and_Persisting_QueryString_Parameters.aspx</guid><wfw:comment>http://blogs.meetandplay.com/WPierce/comments/3256.aspx</wfw:comment><wfw:commentRss>http://blogs.meetandplay.com/WPierce/comments/commentRss/3256.aspx</wfw:commentRss><comments>http://blogs.meetandplay.com/WPierce/archive/2007/06/21/MonoRail_-_URL_Rewriting_and_Persisting_QueryString_Parameters.aspx#comment</comments><slash:comments>2</slash:comments><trackback:ping>http://blogs.meetandplay.com/WPierce/services/trackbacks/3256.aspx</trackback:ping><source url="http://blogs.meetandplay.com/WPierce/rss.aspx">MonoRail - URL Rewriting and Persisting QueryString Parameters</source><description>&lt;p&gt;In my &lt;a href="http://blogs.meetandplay.com/WPierce/archive/2007/06/21/MonoRail_-_Runtime_Views_and_Layouts_with_Filters.aspx" target="_blank"&gt;last post&lt;/a&gt; I talked about how each of our customers identify themselves to our app via a CustomerId query string parameter.  Rather than give links to our customers with ?CustomerId=12345 sprinkled about, I thought it would be nice to take advantage of the built in URL rewriting capabilities of MonoRail.  My target URLs have the following form, &lt;a href="https://my.product.com/customerId/controller/action.rails"&gt;https://my.product.com/customerId/controller/action.rails&lt;/a&gt; and this will get rewritten to &lt;a href="https://my.product.com/controller/action.rails?CustomerId=customerId"&gt;https://my.product.com/controller/action.rails?CustomerId=customerId&lt;/a&gt;.  Turns out this is a very simple configuration change.  URL rewriting is handled by the &lt;a href="http://www.castleproject.org/monorail/documentation/trunk/advanced/routing.html" target="_blank"&gt;routing service&lt;/a&gt; in MonoRail.  You can configure custom 'routes' by adding a subsection to the monorail config section in your web.config file.  You also need to add the routing HTTP module to your list of loaded modules.  Here is what I added to get my desired result (adapted from the Exesto &lt;a href="https://svn.sourceforge.net/svnroot/rhino-tools/trunk/SampleApplications/Exesto/Exesto.Web/Web.config" target="_blank"&gt;routing configuration&lt;/a&gt;):&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;routing&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;rule&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;pattern&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;/(?'customerId'\d+)/(?'controller'\w+)/(?'action'\w+)\.rails(\?(?'queryString'.*))?&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;pattern&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;replace&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;!&lt;/span&gt;[CDATA[ /${controller}/${action}.rails?CustomerId=${customerId}&amp;amp;${queryString} ]]&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;replace&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;rule&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;routing&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;httpModules&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="rem"&gt;&amp;lt;!-- The order these are listed is important --&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;add&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="routing"&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;="Castle.MonoRail.Framework.RoutingModule, Castle.MonoRail.Framework"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;add&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="monorail"&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;="Castle.MonoRail.Framework.EngineContextModule, Castle.MonoRail.Framework"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;httpModules&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;A few things to note.  We aren't currently using Areas and this routing rule would conflict with the default routing.  Make sure you load the routing module before the monorail module or your custom routes may not work.  Happy day!  We get prettier URLs and we still uniquely identify each customer's site which means they see their custom UI and execute their custom business logic.  There is one small issue though.  Whenever we LinkTo, Redirect, or BeginFormTag, we will need to take the CustomerId and make sure it is injected in the right place in our URLs.  Ugh!  big pain, no thank you.  MonoRail to the rescue!  &lt;/p&gt;
&lt;p&gt;The beauty of MonoRail is that it is composed of a number of independent services that can be replaced at will with custom implementations.  The difficult task is determining where is the best place to inject the custom functionality you desire.  In my previous post we implemented runtime views and layouts using a Filter.  Is this the only way we could have achieved it?  No, but it was probably the most logical and the way MonoRail was intended to be extended.  There are a number of ways I can extend MonoRail to ensure that the CustomerId querystring parameter is persisted from request to request.  I chose to make my extension to MonoRail's &lt;a href="http://hammett.castleproject.org/?p=102" target="_blank"&gt;UrlBuilder&lt;/a&gt;.  The UrlBuilder is in charge of...building URLs :)  It allows you to pass in an area, controller, and action, and it will return a well formed URL to said resource.  This seemed like the most logical place to add something to a URL.  I derive from DefaultUrlBuilder and override InternalBuildUrl which is the method used to generate final URLs (I've submitted a patch to make this method virtual, should be in the trunk in the next few days).  I simply check to see if CustomerId is already on the QueryString.  If so, it is inserted into the proper place to generate a URL that will be recognized by the routing rule we implemented above.&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; My.Product.Mvc
{
  &lt;span class="kwrd"&gt;using&lt;/span&gt; Castle.MonoRail.Framework;
  &lt;span class="kwrd"&gt;using&lt;/span&gt; Castle.MonoRail.Framework.Services;

  &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; AppendCustomerIdUrlBuilder : DefaultUrlBuilder
  {
    &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; InternalBuildUrl(&lt;span class="kwrd"&gt;string&lt;/span&gt; area, &lt;span class="kwrd"&gt;string&lt;/span&gt; controller, &lt;span class="kwrd"&gt;string&lt;/span&gt; action, &lt;span class="kwrd"&gt;string&lt;/span&gt; protocol, &lt;span class="kwrd"&gt;string&lt;/span&gt; port,
                                               &lt;span class="kwrd"&gt;string&lt;/span&gt; domain, &lt;span class="kwrd"&gt;string&lt;/span&gt; subdomain, &lt;span class="kwrd"&gt;string&lt;/span&gt; appVirtualDir, &lt;span class="kwrd"&gt;string&lt;/span&gt; extension,
                                               &lt;span class="kwrd"&gt;bool&lt;/span&gt; absolutePath, &lt;span class="kwrd"&gt;bool&lt;/span&gt; applySubdomain, &lt;span class="kwrd"&gt;string&lt;/span&gt; suffix)
    {
      &lt;span class="kwrd"&gt;if&lt;/span&gt;( !absolutePath )
      {
        &lt;span class="kwrd"&gt;string&lt;/span&gt; customerId = MonoRailHttpHandler.CurrentContext.Request.Params[&lt;span class="str"&gt;"CustomerId"&lt;/span&gt;];

        &lt;span class="kwrd"&gt;if&lt;/span&gt;( !&lt;span class="kwrd"&gt;string&lt;/span&gt;.IsNullOrEmpty(customerId) )
        {
          appVirtualDir = &lt;span class="kwrd"&gt;string&lt;/span&gt;.Concat(appVirtualDir, &lt;span class="str"&gt;'/'&lt;/span&gt;, customerId);
        }
      }

      &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;base&lt;/span&gt;.InternalBuildUrl(area, controller, action, protocol, port, domain, subdomain, appVirtualDir, 
        extension, absolutePath, applySubdomain, suffix);
    }
  }
}&lt;/pre&gt;
&lt;p&gt;Now, how do I instruct MonoRail to use my UrlBuilder instead of the DefaultUrlBuilder?  Once again, it is a simple configuration change.  Based on information from the &lt;a href="http://www.castleproject.org/monorail/documentation/trunk/manual/configurationref.html" target="_blank"&gt;MonoRail Configuration&lt;/a&gt; reference, its a piece of cake to slip in a custom service.  The configuration below goes in the MonoRail section of your web.config.  Using the well known id 'UrlBuilder' and the full type of my class, we are rocking and rolling.&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;services&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;service&lt;/span&gt; &lt;span class="attr"&gt;id&lt;/span&gt;&lt;span class="kwrd"&gt;="UrlBuilder"&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;="My.Product.Mvc.AppendCustomerIdUrlBuilder, My.Product.Core"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;services&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;img src="http://blogs.meetandplay.com/WPierce/aggbug/3256.aspx" width="1" height="1" /&gt;</description><dc:creator>Bill Pierce</dc:creator></item><item><title>MonoRail - Runtime Views and Layouts with Filters</title><link>http://blogs.meetandplay.com/WPierce/archive/2007/06/21/MonoRail_-_Runtime_Views_and_Layouts_with_Filters.aspx</link><pubDate>Thu, 21 Jun 2007 10:33:12 GMT</pubDate><guid isPermaLink="true">http://blogs.meetandplay.com/WPierce/archive/2007/06/21/MonoRail_-_Runtime_Views_and_Layouts_with_Filters.aspx</guid><wfw:comment>http://blogs.meetandplay.com/WPierce/comments/3255.aspx</wfw:comment><wfw:commentRss>http://blogs.meetandplay.com/WPierce/comments/commentRss/3255.aspx</wfw:commentRss><comments>http://blogs.meetandplay.com/WPierce/archive/2007/06/21/MonoRail_-_Runtime_Views_and_Layouts_with_Filters.aspx#comment</comments><slash:comments>1</slash:comments><trackback:ping>http://blogs.meetandplay.com/WPierce/services/trackbacks/3255.aspx</trackback:ping><source url="http://blogs.meetandplay.com/WPierce/rss.aspx">MonoRail - Runtime Views and Layouts with Filters</source><description>&lt;p&gt;I've been on a bit of a &lt;a href="http://www.castleproject.org/monorail/index.html" target="_blank"&gt;MonoRail&lt;/a&gt; kick lately and thought I might share some gems.  In his recent post &lt;a href="http://hammett.castleproject.org/" target="_blank"&gt;Hammett&lt;/a&gt; talks about, among other things, &lt;a href="http://hammett.castleproject.org/?p=159" target="_blank"&gt;using a filter to change layouts at runtime&lt;/a&gt;.  He didn't elaborate so I thought I would share the way I've implemented his idea.  In our hosted environment we generally prefer each customer to have a separate host header.  For various reasons this isn't possible for some customers.  Instead, we identify them based on an internal id.  We key everything about the application off of this id.  We use this id to display a customized user interface and run custom logic on a per customer basis.  The way I am currently implementing the customized user interface is, as Hammett stated, with Filter.  &lt;/p&gt; &lt;p&gt;We grab the CustomerId from the query string and use that to determine if that particular customer has a custom view using a simple folder structure: Views -&amp;gt; CustomerId -&amp;gt; Controller -&amp;gt; View.brail.  If no custom view is found, we instead use a 'base' view that is stored in an identical structure Views -&amp;gt; Base -&amp;gt; Controller -&amp;gt; View.brail.  Pretty straight forward.  We do the same thing for layouts.  Decorate your base controller with an AfterAction attribute and you are all set.&lt;/p&gt;&lt;font face="Courier New"&gt;&lt;/font&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; My.Product.Mvc
{
  &lt;span class="kwrd"&gt;using&lt;/span&gt; System.IO;
  &lt;span class="kwrd"&gt;using&lt;/span&gt; Castle.MonoRail.Framework;

  &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; CustomViewFilter : IFilter
  {
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; BASE = &lt;span class="str"&gt;"Base"&lt;/span&gt;;
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; LAYOUTS = &lt;span class="str"&gt;"Layouts"&lt;/span&gt;;

    &lt;span class="preproc"&gt;#region&lt;/span&gt; IFilter Members

    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; Perform(ExecuteEnum exec, IRailsEngineContext context, Controller controller)
    {
      &lt;span class="kwrd"&gt;string&lt;/span&gt; customerId = context.Params[&lt;span class="str"&gt;"CustomerId"&lt;/span&gt;];
      &lt;span class="kwrd"&gt;return&lt;/span&gt; Perform(exec, context, controller, customerId);
    }

    &lt;span class="preproc"&gt;#endregion&lt;/span&gt;

    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; Perform(ExecuteEnum exec, IRailsEngineContext context, Controller controller, &lt;span class="kwrd"&gt;string&lt;/span&gt; customerId)
    {
      &lt;span class="rem"&gt;// Use the Base or Customer specific view&lt;/span&gt;
      &lt;span class="kwrd"&gt;string&lt;/span&gt; viewName = &lt;span class="kwrd"&gt;null&lt;/span&gt;;
      &lt;span class="kwrd"&gt;if&lt;/span&gt;( &lt;span class="kwrd"&gt;null&lt;/span&gt; != controller.SelectedViewName )
      {
        viewName = Path.Combine(BASE, controller.SelectedViewName);
        &lt;span class="kwrd"&gt;if&lt;/span&gt;( &lt;span class="kwrd"&gt;null&lt;/span&gt; != customerId )
        {
          &lt;span class="kwrd"&gt;string&lt;/span&gt; customerViewName = Path.Combine(customerId, controller.SelectedViewName);
          &lt;span class="kwrd"&gt;if&lt;/span&gt;( controller.HasTemplate(customerViewName) )
          {
            viewName = customerViewName;
          }
        }
      }
      controller.SelectedViewName = viewName;

      &lt;span class="rem"&gt;// Use the Base or Customer specific layout&lt;/span&gt;
      &lt;span class="kwrd"&gt;string&lt;/span&gt; layoutName = &lt;span class="kwrd"&gt;null&lt;/span&gt;;
      &lt;span class="kwrd"&gt;if&lt;/span&gt;( &lt;span class="kwrd"&gt;null&lt;/span&gt; != controller.LayoutName )
      {
        layoutName = Path.Combine(BASE, controller.LayoutName);
        &lt;span class="kwrd"&gt;if&lt;/span&gt;( &lt;span class="kwrd"&gt;null&lt;/span&gt; != customerId )
        {
          &lt;span class="kwrd"&gt;string&lt;/span&gt; customerLayoutName = Path.Combine(customerId, controller.LayoutName);
          &lt;span class="kwrd"&gt;string&lt;/span&gt; customerLayoutPath = Path.Combine(LAYOUTS, customerLayoutName);
          &lt;span class="kwrd"&gt;if&lt;/span&gt; (controller.HasTemplate(customerLayoutPath))
          {
            layoutName = customerLayoutName;
          }
        }
      }
      controller.LayoutName = layoutName;

      &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;true&lt;/span&gt;;
    }
  }
}&lt;/pre&gt;&lt;img src="http://blogs.meetandplay.com/WPierce/aggbug/3255.aspx" width="1" height="1" /&gt;</description><dc:creator>Bill Pierce</dc:creator></item><item><title>My future in Racquetball</title><link>http://blogs.meetandplay.com/WTilton/archive/2007/06/19/My_future_in_Racquetball.aspx</link><pubDate>Tue, 19 Jun 2007 21:23:27 GMT</pubDate><guid isPermaLink="true">http://blogs.meetandplay.com/WTilton/archive/2007/06/19/My_future_in_Racquetball.aspx</guid><wfw:comment>http://blogs.meetandplay.com/WTilton/comments/3254.aspx</wfw:comment><wfw:commentRss>http://blogs.meetandplay.com/WTilton/comments/commentRss/3254.aspx</wfw:commentRss><comments>http://blogs.meetandplay.com/WTilton/archive/2007/06/19/My_future_in_Racquetball.aspx#comment</comments><slash:comments>0</slash:comments><trackback:ping>http://blogs.meetandplay.com/WTilton/services/trackbacks/3254.aspx</trackback:ping><source url="http://blogs.meetandplay.com/WTilton/rss.aspx">My future in Racquetball</source><description>&lt;p&gt;My back has been really killing me for the past few weeks.  I have a pinched nerve that I injured a few years ago. I was playing 4 times a week strenuously, while not being in the best of shape. A day came when I could barely stand up.  I went and had an MRI and multiple doctors told me that I shouldn't play the game anymore.&lt;/p&gt; &lt;p&gt;I slowly nursed myself back to playing shape and had some of the best games of my life, and was pretty pain free until again this year.  This time though I can walk fine, but anything other than lying down hurts.  It's not the doubled over in pain type of hurt, just the constant "pinch" all the way down my leg, into my back, down my arms, and in my neck.  My right leg gets most of the shooting pain. &lt;/p&gt; &lt;p&gt;It's really annoying and sometimes I cramp up just walking about.  Walking has also started to really aggrevate it, so trips to Disneyland are starting to get harder.  I don't have to take breaks because I'm tired, but because I have to strech.&lt;/p&gt; &lt;p&gt;It makes me feel like a weakling and it freaking sucks.  I hate laying about dormant, so I've taken up some less strenuous exercise like elliptical machines and swimming (although I am just starting to do those).  I also think I need to buckle down and get a physical therapist.&lt;/p&gt; &lt;p&gt;I think back to my roomate in college, Chris Odegard, and how he had crippling back and leg injuries that made it painful to walk (one time he couldn't even get on the lift at Vail - $80 go bye bye!).  He said that he worked with a physical therapist and now he's pretty pain free.  He's even playing some great racquetball, which gives me some hope.&lt;/p&gt; &lt;p&gt;I was talking the other day and I do think I'm done in outdoor racquetball.  I just think it's too hard on my body.  It's a great game, but I'm still hurting really bad from practicing 3 weeks ago.  I made it to the semi's at Nationals after playing for 2 years, so that's good enough :)  I think I might try doubles as the movement isn't as bad, but I've got to get my back healed to a point to where that can happen.  Not very happy about it.&lt;/p&gt;&lt;img src="http://blogs.meetandplay.com/WTilton/aggbug/3254.aspx" width="1" height="1" /&gt;</description><dc:creator>William C. Tilton</dc:creator></item><item><title>Getting in better shape</title><link>http://blogs.meetandplay.com/WTilton/archive/2007/06/19/Getting_in_better_shape.aspx</link><pubDate>Tue, 19 Jun 2007 21:11:11 GMT</pubDate><guid isPermaLink="true">http://blogs.meetandplay.com/WTilton/archive/2007/06/19/Getting_in_better_shape.aspx</guid><wfw:comment>http://blogs.meetandplay.com/WTilton/comments/3253.aspx</wfw:comment><wfw:commentRss>http://blogs.meetandplay.com/WTilton/comments/commentRss/3253.aspx</wfw:commentRss><comments>http://blogs.meetandplay.com/WTilton/archive/2007/06/19/Getting_in_better_shape.aspx#comment</comments><slash:comments>0</slash:comments><trackback:ping>http://blogs.meetandplay.com/WTilton/services/trackbacks/3253.aspx</trackback:ping><source url="http://blogs.meetandplay.com/WTilton/rss.aspx">Getting in better shape</source><description>&lt;p&gt;Over the past few days I've been working out on things other than racquetball, trying to keep my heart rate up around at least 140 (about 72% &lt;a href="http://www.stevenscreek.com/goodies/hr.shtml"&gt;according to this&lt;/a&gt;).  During the day I can peak around 146, but I feel pretty tired (over a continuous 20-30 minute workout).  Tonight I was able to sustain 150 (78%) fairly easily for 30 minutes working up a good sweat on an elliptical.  Jackie pointed out that I was on a different machine, but I'm going more towards keep my heart rate up and going than what particular aerobic exercise I'm doing.&lt;/p&gt;&lt;img src="http://blogs.meetandplay.com/WTilton/aggbug/3253.aspx" width="1" height="1" /&gt;</description><dc:creator>William C. Tilton</dc:creator></item><item><title>Binsor the Friendly DSL</title><link>http://blogs.meetandplay.com/WPierce/archive/2007/06/19/Binsor_the_Friendly_DSL.aspx</link><pubDate>Tue, 19 Jun 2007 08:28:07 GMT</pubDate><guid isPermaLink="true">http://blogs.meetandplay.com/WPierce/archive/2007/06/19/Binsor_the_Friendly_DSL.aspx</guid><wfw:comment>http://blogs.meetandplay.com/WPierce/comments/3252.aspx</wfw:comment><wfw:commentRss>http://blogs.meetandplay.com/WPierce/comments/commentRss/3252.aspx</wfw:commentRss><comments>http://blogs.meetandplay.com/WPierce/archive/2007/06/19/Binsor_the_Friendly_DSL.aspx#comment</comments><slash:comments>0</slash:comments><trackback:ping>http://blogs.meetandplay.com/WPierce/services/trackbacks/3252.aspx</trackback:ping><source url="http://blogs.meetandplay.com/WPierce/rss.aspx">Binsor the Friendly DSL</source><description>&lt;p&gt;&lt;a href="http://www.ayende.com/Blog/" target="_blank"&gt;Oren&lt;/a&gt; posted quite a while ago on a little &lt;a href="http://www.martinfowler.com/bliki/DomainSpecificLanguage.html" target="_blank"&gt;DSL&lt;/a&gt; for configuring &lt;a href="http://www.castleproject.org/container/index.html" target="_blank"&gt;Castle Windsor&lt;/a&gt; using &lt;a href="http://boo.codehaus.org/" target="_blank"&gt;Boo&lt;/a&gt;. He has creatively titled this DSL &lt;a href="http://www.ayende.com/Blog/archive/2006/09/16/7268.aspx" target="_blank"&gt;Binsor&lt;/a&gt;. I had previously used the &lt;a href="http://wiki.castleproject.org/index.php/Facility:Batch_Registration" target="_blank"&gt;Batch Registration&lt;/a&gt; facility because I did not want to maintain XML configuration for 75+ components.  Since I am revisiting the project now and updating to the trunk &lt;a href="http://sourceforge.net/projects/rhino-tools/" target="_blank"&gt;Rhino Tools&lt;/a&gt; I thought I would try out Binsor.  Below is the complete script I use to configure MonoRail with Windsor, configure logging, wire up the NHibernate Repository, load all of my MonoRail Controllers/ViewComponents, and all supporting components.  This script is derived from the Hibernating Forums &lt;a href="https://svn.sourceforge.net/svnroot/rhino-tools/trunk/SampleApplications/Hibernating.Forums/HibernatingForums.Web/Windsor.boo" target="_blank"&gt;binsor script&lt;/a&gt; and the &lt;a href="https://svn.castleproject.org/svn/castle/trunk/Facilities/BatchRegistration/Castle.Facilities.BatchRegistration/ComponentScanner.cs" target="_blank"&gt;source&lt;/a&gt; for the Batch Registration facility.&lt;/p&gt;&lt;pre class="csharpcode"&gt;import System
import System.Reflection
import Castle.Facilities.Logging
import Castle.MonoRail.Framework
import Castle.MonoRail.WindsorExtension

Facility( &lt;span class="str"&gt;"rails"&lt;/span&gt;, RailsFacility)
Facility( &lt;span class="str"&gt;"logging"&lt;/span&gt;, LoggingFacility, loggingApi: &lt;span class="str"&gt;"log4net"&lt;/span&gt;, configFile: &lt;span class="str"&gt;"My.Product.log4net"&lt;/span&gt;)
Component(&lt;span class="str"&gt;"repository"&lt;/span&gt;, IRepository, NHRepository)
Component(&lt;span class="str"&gt;"unitOfWorkFactory"&lt;/span&gt;, IUnitOfWorkFactory, NHibernateUnitOfWorkFactory)

coreAsm = Assembly.Load(&lt;span class="str"&gt;"My.Product.Core"&lt;/span&gt;)

&lt;span class="kwrd"&gt;for&lt;/span&gt; type &lt;span class="kwrd"&gt;in&lt;/span&gt; coreAsm.GetTypes():
  &lt;span class="kwrd"&gt;if&lt;/span&gt; &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(Controller).IsAssignableFrom(type):
    Component(type.Name, type)
  elif &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(ViewComponent).IsAssignableFrom(type):
    Component(type.Name, type)
  elif type.IsDefined(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(CastleComponentAttribute), &lt;span class="kwrd"&gt;false&lt;/span&gt;):
    compAttr = type.GetCustomAttributes(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(CastleComponentAttribute), &lt;span class="kwrd"&gt;false&lt;/span&gt;)[0] &lt;span class="kwrd"&gt;as&lt;/span&gt; CastleComponentAttribute
    Component(compAttr.Key, compAttr.Service, type, compAttr.Lifestyle)&lt;/pre&gt;&lt;img src="http://blogs.meetandplay.com/WPierce/aggbug/3252.aspx" width="1" height="1" /&gt;</description><dc:creator>Bill Pierce</dc:creator></item><item><title>Nationals</title><link>http://blogs.meetandplay.com/KFerina/archive/2007/05/29/3251.aspx</link><pubDate>Tue, 29 May 2007 08:00:48 GMT</pubDate><guid isPermaLink="true">http://blogs.meetandplay.com/KFerina/archive/2007/05/29/3251.aspx</guid><wfw:comment>http://blogs.meetandplay.com/KFerina/comments/3251.aspx</wfw:comment><wfw:commentRss>http://blogs.meetandplay.com/KFerina/comments/commentRss/3251.aspx</wfw:commentRss><comments>http://blogs.meetandplay.com/KFerina/archive/2007/05/29/3251.aspx#comment</comments><slash:comments>0</slash:comments><trackback:ping>http://blogs.meetandplay.com/KFerina/services/trackbacks/3251.aspx</trackback:ping><source url="http://blogs.meetandplay.com/KFerina/rss.aspx">Nationals</source><description>&lt;p&gt;I would be the Women's Open Champion if I didn't have to leave on Saturday and come home to work on Sunday. I am playing the best I have played all year and after beating Adrienne and Vivian, there was no one in the way from claiming the title.&lt;/p&gt;
&lt;p&gt;I didn't play well against Brenda in the Qualifier, for that I was disappointed, I just didn't handle her serve well. There were some nerves but not too many.  I had a great time in Houston and I had friends that won their divisions, so I am happy for them.&lt;/p&gt;
&lt;p&gt; I want to take this opportunity to thank Randi for the continous support and love to get through the season. to my coach lorraine who took a gold and a silver. Congrats and thanks, to my fans, thanks for everything, I will be playing all the WPRO stops next year and national doubles and singles. I am dissapointed with Houston, but with the wins over viv and adrienne I know I am ready to move up and to keep improving my game. &lt;/p&gt;
&lt;p&gt;I am going to work hard over the summer and play alot of outdoor. And do you want to know a secret??? come back on July 1st to find out!!!&lt;/p&gt;&lt;img src="http://blogs.meetandplay.com/KFerina/aggbug/3251.aspx" width="1" height="1" /&gt;</description><dc:creator>Kimi F.</dc:creator></item><item><title>Referrer Authentication with One Time Pads</title><link>http://blogs.meetandplay.com/WPierce/archive/2007/05/25/Referrer_Authentication_with_One_Time_Pads.aspx</link><pubDate>Fri, 25 May 2007 12:25:58 GMT</pubDate><guid isPermaLink="true">http://blogs.meetandplay.com/WPierce/archive/2007/05/25/Referrer_Authentication_with_One_Time_Pads.aspx</guid><wfw:comment>http://blogs.meetandplay.com/WPierce/comments/3249.aspx</wfw:comment><wfw:commentRss>http://blogs.meetandplay.com/WPierce/comments/commentRss/3249.aspx</wfw:commentRss><comments>http://blogs.meetandplay.com/WPierce/archive/2007/05/25/Referrer_Authentication_with_One_Time_Pads.aspx#comment</comments><slash:comments>1</slash:comments><trackback:ping>http://blogs.meetandplay.com/WPierce/services/trackbacks/3249.aspx</trackback:ping><source url="http://blogs.meetandplay.com/WPierce/rss.aspx">Referrer Authentication with One Time Pads</source><description>&lt;p&gt;&lt;font size="1"&gt;*Disclaimer:  I am going to describe a symptom of a problem and provide a simple solution to address the symptom, not the problem :)&lt;/font&gt;&lt;/p&gt; &lt;p&gt;One of our products is a web based catalog engine that we host for our customers.  We provide our customers with an administration tool they can use to setup end-user accounts (username/password) so they control who can view their catalogs.  We also have a number of customers that integrate our catalog application into a broader offering of their own.  Our customers want to take care of the user management through their own systems and simply redirect end-users from their site to our hosted catalog engine.  The issue that arises in this case is when the our customer disables an end user account they want to prevent the end user from accessing our catalog application.  If the end user has bookmarked our catalog engine, they can bypass the customers site and continue using our catalog engine.&lt;/p&gt; &lt;p&gt;One solution that may have popped into your head was to check the HTTP_REFERRER property on the request and match it against a known list of valid referrers.  The problem with this approach is that HTTP_REFERRER can be very easily spoofed.  There are a number of ways to address this issue but we needed something that was simple, repeatable, and required as little technical knowledge on the customer end as possible.&lt;/p&gt; &lt;p&gt;My quick solution was to implement &lt;a href="http://en.wikipedia.org/wiki/One_time_pad" target="_blank"&gt;one time pad&lt;/a&gt; (we aren't encrypting anything but I think the concept is still applicable) authentication to validate that the user was coming to our catalog engine from a trusted source.  I'll show how to implement this solution using SQL Server but it can work with any relational database (you could even do it using a plain text file).&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Create a table to hold your pads.&lt;br /&gt;CREATE TABLE OneTimePad&lt;br /&gt;(&lt;br /&gt;  Pad UNIQUEIDENTIFIER&lt;br /&gt;)&lt;br /&gt; &lt;/li&gt;&lt;li&gt;Populate your table with pads.&lt;br /&gt;SET NOCOUNT ON &lt;/li&gt; &lt;p&gt;DECLARE @i BIGINT&lt;br /&gt;SET @i=0  &lt;/p&gt;&lt;p&gt;TRUNCATE TABLE OneTimePad  &lt;/p&gt;&lt;p&gt;WHILE @i &amp;lt; 100000 BEGIN&lt;br /&gt;  INSERT INTO OneTimePad VALUES(NEWID())&lt;br /&gt;  SET @i = @i + 1&lt;br /&gt;END &lt;/p&gt;&lt;li&gt;Send a copy of the pad table to the customer.&lt;br /&gt; &lt;/li&gt;&lt;li&gt;The customer will then append a pad to the url we give them to invoke our catalog engine.  Here is a sample sproc to get the next pad:&lt;br /&gt;CREATE PROC GetNextPad&lt;br /&gt;AS&lt;br /&gt;  SET NOCOUNT ON&lt;br /&gt;  DECLARE @pad UNIQUEIDENTIFIER&lt;br /&gt;  BEGIN TRAN&lt;br /&gt;    SELECT TOP 1 @pad=Pad FROM OneTimePad;&lt;br /&gt;    DELETE FROM OneTimePad WHERE Pad=@pad;&lt;br /&gt;  COMMIT&lt;br /&gt;  SELECT @pad;&lt;br /&gt;GO&lt;br /&gt; &lt;/li&gt;&lt;li&gt;On our landing page, we check for the presence of the pad parameter.  If it's not present, we send them back to the customer site.  If the pad is invalid, we tell them to take a hike.  Here's the pseudo code:&lt;br /&gt;pad = Request.QueryString["pad"]&lt;br /&gt;if( null == pad ) redirect back to customer site&lt;br /&gt;recordsAffected = exec("DELETE FROM OneTimePad WHERE Pad=?", pad)&lt;br /&gt;if( 0 == recordsAffected ) die "We're unhackable biatch!"&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Our site forces end-users to access us through our landing page.  We only have to validate them when they get redirected from a customer.  Once those steps are in place we have a poor mans referrer authentication that is fairly solid and easily repeatable for other customers/hosted products.  We have the option to generate a gajillion keys or setup an FTP based key exchange.  The only way to compromise the system is to brute force it (good luck with that) or to compromise the pad database.  If the latter occurs, simply regenerate and exchange new pads.&lt;/p&gt; &lt;p&gt;I'm counting on you the reader to poke holes in this proof of concept :)&lt;/p&gt;&lt;img src="http://blogs.meetandplay.com/WPierce/aggbug/3249.aspx" width="1" height="1" /&gt;</description><dc:creator>Bill Pierce</dc:creator></item><item><title>USAR Racquetball National Singles Event</title><link>http://blogs.meetandplay.com/WTilton/archive/2007/05/24/USAR_Racquetball_National_Singles_Event.aspx</link><pubDate>Thu, 24 May 2007 20:13:53 GMT</pubDate><guid isPermaLink="true">http://blogs.meetandplay.com/WTilton/archive/2007/05/24/USAR_Racquetball_National_Singles_Event.aspx</guid><wfw:comment>http://blogs.meetandplay.com/WTilton/comments/3248.aspx</wfw:comment><wfw:commentRss>http://blogs.meetandplay.com/WTilton/comments/commentRss/3248.aspx</wfw:commentRss><comments>http://blogs.meetandplay.com/WTilton/archive/2007/05/24/USAR_Racquetball_National_Singles_Event.aspx#comment</comments><slash:comments>0</slash:comments><trackback:ping>http://blogs.meetandplay.com/WTilton/services/trackbacks/3248.aspx</trackback:ping><source url="http://blogs.meetandplay.com/WTilton/rss.aspx">USAR Racquetball National Singles Event</source><description>&lt;p&gt;This year looks to be a fun &lt;a href="http://usra.org/Tournaments/2007USARNationalSingles/tabid/3204/Default.aspx"&gt;event&lt;/a&gt;.  This is the second year in a row that I haven't gone, after going for 3 years in a row.  My Mom and Dad were suprised that I wasn't down in Houston for the event, but such is life.  No enough money, too much of a pain with the kids, and my back has been killing me so I haven't practiced or even played in the last few weeks.&lt;/p&gt; &lt;p&gt;The event does now allow the pro's to play in their own "Team Qualifier" event.  Being a proponent of this, as it clarifies their involvment, I think it is should go pretty well.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.racquetballonline.tv/"&gt;RacquetballOnline.tv&lt;/a&gt; is also at the event this year.  We can all hope that their country funding makes it possible to get some real funding to finance the site and it's webivised events.  &lt;/p&gt; &lt;p&gt;&lt;a href="http://www.carrabbas.com/"&gt;Carrabba's&lt;/a&gt; also makes an appearance as a sponsor.  I freaking love Carrabba's so just thinking about how good the food is going to be at the tournament makes me want to be there.  I'm really interested to see how having them at the event helps with the hospitality.&lt;/p&gt; &lt;p&gt;The &lt;a href="http://www.hyatt.com/"&gt;Hyatt&lt;/a&gt; also steps up as a sponsor this year.  I think they've sponsored the event since the beginning of the thing, and while I could be wrong, they're akin to the Promus' and current Choice Hotels' in this respect.&lt;/p&gt; &lt;p&gt;I wish all the participants luck and hope they have a great week.  If you're reading this, let me know how you did.&lt;/p&gt;&lt;img src="http://blogs.meetandplay.com/WTilton/aggbug/3248.aspx" width="1" height="1" /&gt;</description><dc:creator>William C. Tilton</dc:creator></item><item><title>Seperation of blogs</title><link>http://blogs.meetandplay.com/WTilton/archive/2007/05/15/Seperation_of_blogs.aspx</link><pubDate>Tue, 15 May 2007 23:24:39 GMT</pubDate><guid isPermaLink="true">http://blogs.meetandplay.com/WTilton/archive/2007/05/15/Seperation_of_blogs.aspx</guid><wfw:comment>http://blogs.meetandplay.com/WTilton/comments/3244.aspx</wfw:comment><wfw:commentRss>http://blogs.meetandplay.com/WTilton/comments/commentRss/3244.aspx</wfw:commentRss><comments>http://blogs.meetandplay.com/WTilton/archive/2007/05/15/Seperation_of_blogs.aspx#comment</comments><slash:comments>0</slash:comments><trackback:ping>http://blogs.meetandplay.com/WTilton/services/trackbacks/3244.aspx</trackback:ping><source url="http://blogs.meetandplay.com/WTilton/rss.aspx">Seperation of blogs</source><description>&lt;p&gt;I'm starting to seperate each of my blogs into seperate sites.  &lt;a title="Meet and play website." href="http://www.meetandplay.com/" target="_blank"&gt;MNP&lt;/a&gt; is mainly a sports related site, and as such the technical posts that I have been plopping up here just didn't fit, so I created a seperate &lt;a href="http://www.blechie.com/"&gt;blogging site for those&lt;/a&gt;.  I've also been wanting to bitch about current politics so I created a &lt;a href="http://blundit.com/"&gt;blog for that&lt;/a&gt;.  I also created a &lt;a href="http://tiltonsplace.com/"&gt;family blog site&lt;/a&gt; for more personal matters.&lt;/p&gt; &lt;p&gt;Having said that, only racquetball or sports related posts will appear here in the future.  Hee haw.  That is all...&lt;/p&gt;&lt;img src="http://blogs.meetandplay.com/WTilton/aggbug/3244.aspx" width="1" height="1" /&gt;</description><dc:creator>William C. Tilto