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

<channel>
	<title>Raymond Law</title>
	<atom:link href="http://rayvinly.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://rayvinly.com</link>
	<description>Badminton on Rails</description>
	<lastBuildDate>Sun, 04 Apr 2010 05:18:46 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Using Paperclip with Passenger</title>
		<link>http://rayvinly.com/articles/2010/03/04/using-paperclip-with-passenger/</link>
		<comments>http://rayvinly.com/articles/2010/03/04/using-paperclip-with-passenger/#comments</comments>
		<pubDate>Thu, 04 Mar 2010 00:50:21 +0000</pubDate>
		<dc:creator>Raymond Law</dc:creator>
				<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Web 2.0]]></category>
		<category><![CDATA[paperclip]]></category>
		<category><![CDATA[passenger]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://rayvinly.com/?p=204</guid>
		<description><![CDATA[This is mainly a note to myself.  File upload with Paperclip works with script/server but not when running Passenger.  I have been lazy in finding a solution, so I just switch between script/server and Passenger, but I finally can&#8217;t stand it.

It happens because /opt/local/bin/identify is not in the path for the www user [...]]]></description>
			<content:encoded><![CDATA[<p>This is mainly a note to myself.  File upload with Paperclip works with script/server but not when running Passenger.  I have been lazy in finding a solution, so I just switch between script/server and Passenger, but I finally can&#8217;t stand it.</p>

<p>It happens because /opt/local/bin/identify is not in the path for the www user which is used to run Apache on Leopard. The solution is just to make it so in environment.rb (Make sure the path is correct for both the local dev and live prod hosts):</p>


<div class="wp_syntax"><div class="code"><pre class="rails" style="font-family:monospace;">Paperclip.<span style="color:#9900CC;">options</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:command_path</span><span style="color:#006600; font-weight:bold;">&#93;</span> = <span style="color:#996600;">&quot;/opt/local/bin&quot;</span></pre></div></div>
<script src="http://feeds.feedburner.com/~s/rayvinly?i=http://rayvinly.com/articles/2010/03/04/using-paperclip-with-passenger/" type="text/javascript" charset="utf-8"></script>]]></content:encoded>
			<wfw:commentRss>http://rayvinly.com/articles/2010/03/04/using-paperclip-with-passenger/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Verizon FiOS has the absolutely worst customer service</title>
		<link>http://rayvinly.com/articles/2009/12/29/verizon-fios-has-the-absolutely-worst-customer-service/</link>
		<comments>http://rayvinly.com/articles/2009/12/29/verizon-fios-has-the-absolutely-worst-customer-service/#comments</comments>
		<pubDate>Tue, 29 Dec 2009 21:25:05 +0000</pubDate>
		<dc:creator>Raymond Law</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[fios]]></category>
		<category><![CDATA[verizon]]></category>

		<guid isPermaLink="false">http://rayvinly.com/?p=197</guid>
		<description><![CDATA[I am able to say that because of numerous personal experiences. After reading my story, you would be wise to stay away.


  When I signed up, I was not even sent a bill, neither paper nor electronically, but I was charged on my credit card for whatever they want to charge.  It requires [...]]]></description>
			<content:encoded><![CDATA[<p>I am able to say that because of numerous personal experiences. After reading my story, you would be wise to stay away.</p>

<ul>
  <li>When I signed up, I was not even sent a bill, neither paper nor electronically, but I was charged on my credit card for whatever they want to charge.  It requires a 1-year commitment.  Bad start!</li>
  <li>They lowered their prices for Internet, and I kept paying the higher price until I found out and called to adjust.</li>
  <li>I called to upgrade my TV plan to Extreme HD and I was offered $15 per month if I also upgrade my Internet speed from 15/5 to 25/15 and combine my FiOS and wireless bill. He asked me if I wanted to get a home phone and I refused, but he still gave me the $15 offer.</li>
  <li>When the bill came, no human being on earth would be able to understand the breakdown. This is done to confuse you, but it seems to be standard practice for every consumer entertainment provider nowadays.</li>
  <li>Of course the $15 offer was not reflected on the bill.</li>
  <li>So I called them again. They couldn&#8217;t find my account after I gave them my phone number, account number, name, address.  I was told that their system is down and would call me back when they would finally be able to pull up my account.</li>
  <li>No call for a week. So I called again.</li>
  <li>This rude lady Badger (who would only give me her last name) redirected me to wireless department who redirected me to Badger. <span class="caps">WTF</span>!?</li>
  <li>I told Badger about my promised offer but now she claimed I also needed to have home phone to qualify for $15 off. Now that&#8217;s a lie, and they are not honoring their words.</li>
  <li>Badger asked me for the person who offered me and I told him he gave me an order number but I didn&#8217;t ask for name.  She said she would not be able to find it then. But I told her if last name is only given and if the guy&#8217;s name is Smith, how would she be able to find him for me? She did not have an answer.</li>
  <li>Badger became rude and I asked to talk to her manager Dinkins. Being mistreated by Badger&#8217;s rude attitude, I started off telling Dinkins that I was not trying to start arguments but simply trying to get things straight.  But she turned out to be another rude lady in the billing department.  Rude behavior fosters rude behaviors &#8211; no surprise there.</li>
  <li>I told Dinkins the same thing over and she still insisted a home phone was required.</li>
  <li>I asked Dinkins to find the guy who offered me and told her I&#8217;ve got an order number, but Badger asked me for the name.  I again questioned how she would find him if the last name is Smith and that&#8217;s the only thing given to customers. She did not have an answer.</li>
  <li>I then tried Live Chat.  First chat attempt got cut off and I lost the transcript right when my story finally sounded too convincing for them to deny.</li>
  <li>Second Live Chat attempt. See below.</li>
  <li>I called FiOS again to try to downgrade my speed back to 15/5 because (1) I don&#8217;t really need it, (2) I upgraded because I was told that was need to get $15 off to cancel out the cost, (3) I upgraded based on a lie.</li>
  <li>This time I chose to go to the order department. My belief is that the order department is always nice because they need you to place an order, whereas the billing department is always a pussy because they want you to fuck off and pay whatever they desire to charge you.</li>
  <li>This gentleman was able to give me his full name Eric Frisby. So the policy of giving out names must depend on either or both: (1) billing department can only give out last name whereas order department can give out full name, and/or (2) if it&#8217;s a complaint, give the least information so you won&#8217;t be founded out and get fired. No surprise to my belief here.</li>
  <li>Now Eric told me I would indeed raise my price if I downgrade because it&#8217;s not in a bundle and would cost me $25 more. WoW!!!</li>
  <li>I then told him about the $15 discount offer I had been promised. He looked and said he founded it!!!  <span class="caps">FINALLY, </span>after 3 phone calls (talked to 5 persons), 2 live chats.</li>
  <li>He told me he would be able to apply that manually.</li>
  <li><span class="caps">GREAT</span>! But wait, I need to see that in my bill to believe it.  But that goes through the billing department, so I have no idea if I will see that or not.</li>
</ul>

<p>Do I need to mention the Verizon website is one of the most feature-rich website I have seen for all my online accounts.  <span class="caps">BUT, </span>it never worked for the things I wanted to do, it shows errors on numerous occasions, is extremely slow and times out.  <span class="caps">YES,</span> I am using their website on its very own FiOS network. <span class="caps">LOL</span></p>

<p>I do have to mention, contrary to FiOS, Verizon wireless customer service has been great and polite.  They seem to come from two separate companies&#8230;</p>

<p><em>Second Live Chat transcript as follows (not all that interesting, included for documentation purpose):</em></p>

<blockquote>
Chat Subject: FiOS Billing Question<br />
Your Question: I was talking to Cathy in my last session and it broke down suddenly. I need to talk to her again please.<br />
A Verizon eCenter Representative will be with you shortly. Thank you. (14:36:58)<br />
14:40:52 We apologize for the delay.You are next in the line. A representative will be with you shortly.<br />
Agent Jana has joined. (14:41:25)<br />
Jana : Chat ID for this session is xxxxxxxxxxx. (14:41:25)<br />
Jana(14:41:35): Hello. Thank you for visiting our chat service. I will be happy to help you today.<br />
Jana(14:42:26): I&#8217;m sorry, I cannot transfer this chat to another representive.<br />
Raymond Law(14:42:36): Hi Jana.<br />
Jana(14:42:58): Hello.<br />
Raymond Law(14:43:23): I was promised a discount of $15 per month when I upgraded the the Extreme HD plan and my Internet speed to 25/15, but I am not seeing the discount on my bill.<br />
Raymond Law(14:43:41): Account # is xxxxxxxxxxxxxxxxxxxx<br />
Jana(14:43:57): I will be happy to review your account; one moment.<br />
Jana(14:44:08): Do you have home phone service?<br />
Raymond Law(14:45:00): No, when the offer was made to me, he said no home phone is required.<br />
Raymond Law(14:45:14): only the upgrade to 25/15 was needed for the $15/mo discount<br />
Jana(14:45:36): Ok, one moment.<br />
Jana(14:47:59): I see the bundle promotions as: 3 Months Free <span class="caps">HBO</span>/Cinemax and 24 Month Price Guarantee. I do not see anything about an extra $15.00 per month discount.<br />
Jana(14:48:30): Did you just add your Wireless to the bundle too?<br />
Raymond Law(14:49:51): Yeah, he told me I would get $15/mo off if I upgraded to 25/15 and combine my FiOS and wireless bills.<br />
Jana(14:50:48): I cannot add a $15.00 per month credit to your account. Maybe he was referring to the extra discount that you are supposed to get for adding your Wireless billing.?<br />
Jana(14:51:34): Let me check that part of the bill; one moment.<br />
Raymond Law(14:53:03): I remember clearly that he said only the 25/15 upgrade and bill combining are required to get $15 off.<br />
Raymond Law(14:53:31): Thanks.<br />
Jana(14:53:57): I do not see it on the Wireless billing either.<br />
Jana(14:54:17): I apologize, but I am unable to assist you with this issue through chat. Please contact our Consumer Sales and Solutions Center directly at: (800) 837-4966_Monday through Friday, between 8:00 AM and 6:00 PM Eastern Time.

<p>You will be prompted for your telephone number by our Voice Response Unit. To ensure protection of your personal account information and expedite the handling of your request, please have your Verizon account number or bill available.</p>

<p>Our representatives will be happy to help you.<br />
Jana(14:55:28): Thank you for chatting with us. The department to which we have referred you will be able to assist you. If you have any additional questions that we can assist you with, please do not hesitate to contact us again.</p>

See how customers are helping customers on our Verizon Forums website located at: http://forums.verizon.com<br />
Raymond Law(14:55:39): Jana<br />
Jana(14:56:16): Yes.<br />
Raymond Law(14:56:20): I&#8217;ve tried the phone support but they were being very rude and insisted a home phone is required, which is not true with my offer.<br />
Raymond Law(14:56:37): I don&#8217;t want to be harassed yet again with your people on the phone.<br />
Jana(14:56:48): I&#8217;m sorry. I cannot add a discount to your service.<br />
Raymond Law(14:56:48): I will just take this to <span class="caps">BBB </span>instead then.<br />
Jana(14:57:42): I have noted your account with the information you provided.<br />
Raymond Law(14:58:15): Here&#8217;s something you can help me in the mean time.<br />
Raymond Law(14:58:41): What is the TV portion and what is the Internet portion of my FiOS bill regularly per month?<br />
Jana(14:59:32): One moment.<br />
Jana(15:00:50): Looks like the normal rate for the TV is $57.99 and the Internet is $64.99.<br />
Raymond Law(15:02:34): The bundle price Cathy told me was $94.99, which was correct.<br />
Jana(15:02:51): Ok.<br />
Raymond Law(15:03:34): If I am not getting $15 discount as promised, I will downgrade my speed back to 15/5 which was what I have before the upgrade. How much would my bundle price be if I do that?<br />
Jana(15:03:40): That would be the bundled rate.<br />
Jana(15:04:16): Let me look at your previous bill, one moment.<br />
Raymond Law(15:06:01): okay thanks<br />
Jana(15:07:02): It was $84.99 and the TV portion was also different.<br />
Jana(15:07:32): Shows TV Essentials $47.99 and the Internet at $44.99 with a bundle discount of $7.99.<br />
Raymond Law(15:08:20): I want to know how much would it cost me if I keep my Extreme HD TV plan and use the 15/5 Internet plan.<br />
Jana(15:08:40): Ok, one moment.<br />
Jana(15:11:48): $84.99<br />
Jana(15:12:29): That is the Double Flex Rate.<br />
Jana(15:13:04): That, of course, would not include your Wireless.<br />
Raymond Law(15:13:11): What does that mean?<br />
Jana(15:13:27): That rate is just for the Internet and <span class="caps">TV.</span><br />
Raymond Law(15:13:39): Right, of course I will have to pay wireless separately<br />
Raymond Law(15:13:55): Now if I combine both bills, will I get a discount?<br />
Jana(15:14:45): I cannot assist you with that. You will have to call in to re-bundle your services.<br />
Raymond Law(15:15:20): Extreme HD + 25/15 = $94.99<br />
Extreme HD + 15/5 = $84.99<br />
Correct?<br />
Jana(15:15:32): When I was looking up the rate for the lower Internet, I did not see an option to include the Wireless.<br />
Jana(15:15:52): That is the information I see.<br />
Raymond Law(15:15:58): See, that is the reason why the $15 off per month was offered!!!<br />
Jana(15:16:31): What was the reason?<br />
Raymond Law(15:17:10): Combining the wireless bill to get $15 off and to do that I had to ugprade to 25/15 so you see the option to combine the bills.<br />
Raymond Law(15:17:38): That was why I was offered $15<br />
Raymond Law(15:17:43): But now you guys are not honoring that<br />
Jana(15:17:55): No, I was just in an order to change the bundle.. I have never ordered a bundle to include Wireless.<br />
Jana(15:18:07): I am not in the order center.<br />
Raymond Law(15:18:43): I am not accusing you, I am just saying that they didn&#8217;t honor the offer they promised on my bill. <img src='http://rayvinly.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> <br />
Jana(15:19:04): Your account show that you have a Triple Flex bundle; triple would be your <span class="caps">TV,</span> Internet and Wireless.<br />
Raymond Law(15:19:30): ok, so what is that bundle price then?<br />
Jana(15:19:40): I cannot change your bundle or add an additional discount.<br />
Raymond Law(15:19:44): I am trying to see how much I can save by changing it back to 15/5<br />
Raymond Law(15:19:49): Can you change my 25/15 plan to 15/5 please?<br />
Jana(15:20:05): I would say it is going to save you $10.00 per month.<br />
Jana(15:20:41): No. You have to re-bundle with a new comittment and I cannot do that here. You will have to contact the Consumer Sales and Solutions Center.<br />
Raymond Law(15:21:05): Can I get a transciprt of this chat?<br />
Jana(15:21:37): You can copy and paste it to a Word document I suppose.<br />
Jana(15:21:52): I do not have any way to send a transcript to you.<br />
</blockquote><script src="http://feeds.feedburner.com/~s/rayvinly?i=http://rayvinly.com/articles/2009/12/29/verizon-fios-has-the-absolutely-worst-customer-service/" type="text/javascript" charset="utf-8"></script>]]></content:encoded>
			<wfw:commentRss>http://rayvinly.com/articles/2009/12/29/verizon-fios-has-the-absolutely-worst-customer-service/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Rails Rumble 2009</title>
		<link>http://rayvinly.com/articles/2009/08/25/rails-rumble-2009/</link>
		<comments>http://rayvinly.com/articles/2009/08/25/rails-rumble-2009/#comments</comments>
		<pubDate>Tue, 25 Aug 2009 03:54:39 +0000</pubDate>
		<dc:creator>Raymond Law</dc:creator>
				<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[Web 2.0]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[railsrumble]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://rayvinly.com/?p=195</guid>
		<description><![CDATA[I participated in last year&#8217;s Rails Rumble and decided to do it again this year.  Our app this year is MovieTwitvia, a fun twitter movie trivia app.  I don&#8217;t really have any new thoughts than last year.  However, Andrew Ng, one of our team members have written up a post about his [...]]]></description>
			<content:encoded><![CDATA[<p>I participated in last year&#8217;s Rails Rumble and decided to do it again this year.  Our app this year is <a href="http://movietwitvia.com/">MovieTwitvia</a>, a fun twitter movie trivia app.  I don&#8217;t really have any new thoughts than <a href="http://rayvinly.com/articles/2008/10/19/railsrumble-2008/">last year</a>.  However, <a href="http://blog.andrewng.com/2009/08/24/railsrumble-09/">Andrew Ng</a>, one of our team members have written up a post about his thoughts.</p><script src="http://feeds.feedburner.com/~s/rayvinly?i=http://rayvinly.com/articles/2009/08/25/rails-rumble-2009/" type="text/javascript" charset="utf-8"></script>]]></content:encoded>
			<wfw:commentRss>http://rayvinly.com/articles/2009/08/25/rails-rumble-2009/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Intridea’s Present.ly has been nominated as a finalist in the WebWare 100 Communication Category</title>
		<link>http://rayvinly.com/articles/2009/03/31/intridea%e2%80%99s-presently-has-been-nominated-as-a-finalist-in-the-webware-100-communication-category/</link>
		<comments>http://rayvinly.com/articles/2009/03/31/intridea%e2%80%99s-presently-has-been-nominated-as-a-finalist-in-the-webware-100-communication-category/#comments</comments>
		<pubDate>Tue, 31 Mar 2009 16:00:48 +0000</pubDate>
		<dc:creator>Raymond Law</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[intridea]]></category>
		<category><![CDATA[presently]]></category>

		<guid isPermaLink="false">http://rayvinly.com/?p=186</guid>
		<description><![CDATA[

Present.ly has been nominated as a finalist in the WebWare 100 Communication Category. We&#8217;re honored to be chosen from a pool of more than 5,000 applicants to be one of the 300 finalists to compete for the title.

The WebWare 100 is a yearly contest held by CNET that allows the public to pick what the [...]]]></description>
			<content:encoded><![CDATA[<div style="float: right;"><a href="http://www.cnet.com/html/ww/100/2009/poll/communication.html"><img alt="" src="http://www.cnet.com/html/ww/100/2009/images/voteforus/webware100-09_vote_l.jpg"/></a></div>

<p>Present.ly has been nominated as a finalist in the <a href="http://www.cnet.com/html/ww/100/2009/poll/communication.html">WebWare 100 Communication Category</a>. We&#8217;re honored to be chosen from a pool of more than 5,000 applicants to be one of the 300 finalists to compete for the title.</p>

<p>The WebWare 100 is a yearly contest held by <span class="caps"><span class="caps">CNET</span></span> that allows the public to pick what the 100 best web applications of the year are. Past winners included such products as GMail and Amazon <span class="caps">MP3, </span>so we&#8217;re very excited to be included as a finalist for this year&#8217;s selection.</p>

<p>Voting is open right now, so please <a href="http://www.cnet.com/html/ww/100/2009/poll/communication.html">vote for us</a>! We think that business micro-communication is an important next step in the future of communication, and your votes will help validate that and move it even further into the mainstream. Thanks for your support.</p><script src="http://feeds.feedburner.com/~s/rayvinly?i=http://rayvinly.com/articles/2009/03/31/intridea%e2%80%99s-presently-has-been-nominated-as-a-finalist-in-the-webware-100-communication-category/" type="text/javascript" charset="utf-8"></script>]]></content:encoded>
			<wfw:commentRss>http://rayvinly.com/articles/2009/03/31/intridea%e2%80%99s-presently-has-been-nominated-as-a-finalist-in-the-webware-100-communication-category/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Easy or Hard?</title>
		<link>http://rayvinly.com/articles/2009/02/25/easy-or-hard/</link>
		<comments>http://rayvinly.com/articles/2009/02/25/easy-or-hard/#comments</comments>
		<pubDate>Wed, 25 Feb 2009 08:00:09 +0000</pubDate>
		<dc:creator>Raymond Law</dc:creator>
				<category><![CDATA[Random]]></category>

		<guid isPermaLink="false">http://rayvinly.com/?p=146</guid>
		<description><![CDATA[I had the following conversation with a colleague about a client project recently.



At that moment, it strikes me that sometimes I want the easy ones but at other times I want the hard ones.  But why?  After some thoughts, I concluded with:

I want the easy ones because they are easy and quick, but [...]]]></description>
			<content:encoded><![CDATA[<p>I had the following conversation with a colleague about a client project recently.</p>

<p><a href="http://rayvinly.com/wp-content/uploads/2009/02/easy_or_hard.png"><img src="http://rayvinly.com/wp-content/uploads/2009/02/easy_or_hard.png" alt="easy_or_hard" title="easy_or_hard" width="616" height="356" class="aligncenter size-full wp-image-166" /></a></p>

<p>At that moment, it strikes me that sometimes I want the easy ones but at other times I want the hard ones.  But why?  After some thoughts, I concluded with:</p>

<blockquote>I want the easy ones because they are easy and quick, but annoying and boring.  And I want the hard ones because they are challenging and interesting.</blockquote>

<p>I think the following matrix describes it best:</p>

<table border="1">
  <tr>
    <td></td>
    <td>Easy</td>
    <td>Hard</td>
  </tr>
  <tr>
    <td>Annoying</td>
    <td>
      <ul>
        <li>Change copy from List Users to Search Users</li>
        <li>Rename the column from fee to amount</li>
      </ul>
    </td>
    <td>
      <ul>
        <li>Change all occurrences of <em>this</em> to <em>that</em> while <em>Replace All</em> would be too dangerous</li>
        <li>Modify all images to be half the size and with a different image format/extension</li>
      </ul>
    </td>
  </tr>
  <tr>
    <td>Interesting</td>
    <td>
    <ul>
      <li>Make sure we can seamless deploy to staging and production with ease using Capistrano</li>
      <li>Make changing the type field also changes the available choices for the month field in the form with javascript</li>
    </ul>
    </td>
    <td>
      <ul>
        <li>Charge a recurring fee with PayPal and ActiveMerchant when it is not inherently built in, and with lots of PayPal docs to read</li>
        <li>Style the site with <span class="caps">HTML, CSS, SASS </span>according to this professionally designed <span class="caps">PSD </span>with a lot of croppings</li>
      </ul>
    </td>
  </tr>
</table>
<br/>

<h3>Do you get the point?</h3>

<p>As software engineers or programmers (sometimes interchangeable terms <span class="caps">IMO</span>), we like to solve challenging and interesting problems, regardless of difficulties.  Ideally, we like everything to be in the easy and interesting quadrant, but we certainly like (sometimes prefer because it is also challenging) things in the hard and interesting quadrant as well.  We would accomplish things in these two quadrants with our fullest attention and best effort.</p>

<p>Stuff that belong to the easy and annoying, and hard and annoying quadrants bore us.  We naturally pay less attention and try to do them with spare time.  However, they still need to be done.  They become a <strong>drag</strong>.</p>

<h3>Now we understand the matrix, but what can we do about the <strong>drag</strong>?</h3>

<p>This is what I think.</p>

<p>I may feel ActiveMerchant is a joy and interesting to work with, but someone else may think it is a distraction to the project and just want to settle with using Authorize.net when it is already supported by ActiveMerchant to do recurring payment.</p>

<p>I may feel having to crop all images again and save them in a different format is a waste of my development time, but a photographer may actually enjoy such work and may even add a drop shadow to make the images look better.</p>

<p>The difference is in the <strong>interpretation</strong>.</p>

<h3>Interpretation</h3>

<p>Different people interpret the same thing differently based on their own level of interest/time/concern, &#8230;/etc.  That is a fact, not an argument.</p>

<p>In software development, instead of the project manager assigning tasks to each engineer, programmer, <span class="caps">QA, </span>you name it, based on time, skill levels, familiarities with certain code pieces, scopes, existing client relationships, <em>maybe, just maybe</em>, it is better to ask each person which of the tasks they have the most interest in and then assign tasks based on level of interest.  That way, each person on the team will put forth his/her best attention/effort to accomplish them.</p>

<h3>Potential pitfalls</h3>

<ul>
	<li> What if none of the tasks interest me?  Maybe put that person in a different project that has tasks that interest him?</li>
	<li> What if many people are interested in the same task?  Who gets to work on it?  Maybe pair programming in which several people can participate and can have inputs?</li>
	<li> If I keep picking tasks that seem easy (on the surface), would it make me look lazy?</li>
	<li> If I pick several hard tasks, I may make myself too busy.</li>
</ul>

<p>Again, we should not be blind folded by <strong>interpretaion</strong>.  I may think it is easy but someone else may think it is interesting and solve the task <em>better</em>.  I may think it is hard but since I am so interested, I may solve it with higher efficiency, hence less time.</p>

<p>The above is just a thought.  I have not actually tried it to see how well the process works.  However, since project management is so boring and annoying to so many people.  We may as well put a different <strong>interpretation</strong> to it.  It certainly is a paradigm shift in project management.</p><script src="http://feeds.feedburner.com/~s/rayvinly?i=http://rayvinly.com/articles/2009/02/25/easy-or-hard/" type="text/javascript" charset="utf-8"></script>]]></content:encoded>
			<wfw:commentRss>http://rayvinly.com/articles/2009/02/25/easy-or-hard/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Moving from Typo to Wordpress</title>
		<link>http://rayvinly.com/articles/2009/02/23/moving-from-typo-to-wordpress/</link>
		<comments>http://rayvinly.com/articles/2009/02/23/moving-from-typo-to-wordpress/#comments</comments>
		<pubDate>Mon, 23 Feb 2009 12:00:47 +0000</pubDate>
		<dc:creator>Raymond Law</dc:creator>
				<category><![CDATA[Random]]></category>
		<category><![CDATA[Web 2.0]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[sql]]></category>
		<category><![CDATA[typo]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://rayvinly.com/?p=106</guid>
		<description><![CDATA[I recently moved my blog from Typo to Wordpress.  Typo served well and it was written in Rails.  However, it was more difficult to upgrade and I just don&#8217;t have enough time to maintain it and keep it up to date.  So it has been running at version 4.1.1 which requires Rails [...]]]></description>
			<content:encoded><![CDATA[<p>I recently moved my blog from <a href="http://blog.typosphere.org/">Typo</a> to <a href="http://wordpress.org/">Wordpress</a>.  Typo served well and it was written in Rails.  However, it was more difficult to upgrade and I just don&#8217;t have enough time to maintain it and keep it up to date.  So it has been running at version 4.1.1 which requires Rails 1.2.6.  So a change is imminent and I found a couple resources by <a href="http://blog.ifbydesign.com/2006/06/26/automatic-migration-from-typo-to-wordpress/">Stuart Johnston</a> and <a href="http://www.thirdbit.net/articles/2007/06/25/typo-to-wordpress-migration/">Max Newell</a>.</p>

<p>Those are <strong><span class="caps">GREAT</span></strong> starts!.  However, I had to modify the migration script for my Typo version (4.1.1) and the latest Wordpress version (2.7.1 at the time of this writing).  Fortunately, the script is just pure <span class="caps">SQL. </span> That means I had to inspect the Typo and Wordpress database structures to correctly map the tables and columns between the two databases.  It is not the funnest thing in the world though, but this has to be done.  If you have other versions of Wordpress, I recommend you upgrade to the latest version first.  That way, you don&#8217;t have to worry about Wordpress&#8217;s table structures because I already did this for you.  If you are using a different version of Typo, feel free to modify <a href="http://rayvinly.com/wp-content/uploads/2009/02/typo_4_1_1_to_wordpress_2_7_1.sql">this migration script</a> and post feedback.</p>

<p>Here are the steps that you need to take after grabbing the script:</p>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&gt;</span> mysqldump typo_db articles_tags tags categorizations categories contents feedback <span style="color: #000000; font-weight: bold;">&gt;</span> typo.sql
<span style="color: #000000; font-weight: bold;">&gt;</span> mysql typo_db <span style="color: #000000; font-weight: bold;">&lt;</span> typo.sql
<span style="color: #000000; font-weight: bold;">&gt;</span> mysql typo_db <span style="color: #000000; font-weight: bold;">&lt;</span> typo_4_1_1_to_wordpress_2_7_1.sql</pre></div></div>
<script src="http://feeds.feedburner.com/~s/rayvinly?i=http://rayvinly.com/articles/2009/02/23/moving-from-typo-to-wordpress/" type="text/javascript" charset="utf-8"></script>]]></content:encoded>
			<wfw:commentRss>http://rayvinly.com/articles/2009/02/23/moving-from-typo-to-wordpress/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PayPal Recurring Billing with ActiveMerchant in Ruby on Rails</title>
		<link>http://rayvinly.com/articles/2009/02/20/paypal-recurring-billing-with-activemerchant-in-ruby-on-rails/</link>
		<comments>http://rayvinly.com/articles/2009/02/20/paypal-recurring-billing-with-activemerchant-in-ruby-on-rails/#comments</comments>
		<pubDate>Fri, 20 Feb 2009 19:19:40 +0000</pubDate>
		<dc:creator>Raymond Law</dc:creator>
				<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[Web 2.0]]></category>
		<category><![CDATA[activemerchant]]></category>
		<category><![CDATA[billing]]></category>
		<category><![CDATA[paypal]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[recurring]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://rayvinly.com/?p=87</guid>
		<description><![CDATA[ActiveMerchant is great and PayPal is easy to use.  A lot of us already have a PayPal account for EBay.  It works great in auctions where you pay once.  However, ActiveMerchant currently does not support PayPal recurring billing.  One requirement of a recent project is to be able to charge for [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.activemerchant.org/">ActiveMerchant</a> is great and <a href="https://developer.paypal.com/">PayPal</a> is easy to use.  A lot of us already have a PayPal account for EBay.  It works great in auctions where you pay once.  However, ActiveMerchant currently does not support PayPal recurring billing.  One requirement of a recent project is to be able to charge for a monthly or yearly subscription plan with PayPal.  Therefore, I did some googling and found that <a href="http://clockobj.co.uk/2008/09/08/ruby-on-rails-paypal-express-recurring-payments-using-active-merchant/">Jon Baker</a> has already extended ActiveMerchant to add this functionality using PayPal&#8217;s Name-Value Pair (NVP) <span class="caps">API.</span> However, as <a href="http://jadedpixel.lighthouseapp.com/projects/11599-active-merchant/tickets/17-patch-creating-paypal-recurring-payments-profile-with-activemerchant">Cody Fauser</a> pointed out, the <span class="caps">NVP API </span>was taken out from ActiveMerchant, so I had to implement that with PayPal&#8217;s <span class="caps">SOAP API.</span></p>

<p><del datetime="2009-03-31T14:53:20+00:00">First, download this <a href="http://rayvinly.com/wp-content/uploads/2009/03/paypal_express_recurring.rb">file</a> and put it in <em>vendor/plugins/active_merchant/lib/active_merchant/billing/gateways/</em>.</del>  Use the GitHub from now because maintaining a separate file download is too troublesome.  Alternatively, there&#8217;s a fork on GitHub at <a href="http://github.com/rayvinly/active_merchant/" target="_blank">http://github.com/rayvinly/active_merchant/</a>.</p>

<p>In your controller, after a user selects one of your subscription plan, the form goes to the checkout action:</p>


<div class="wp_syntax"><div class="code"><pre class="rails" style="font-family:monospace;">  <span style="color:#9966CC; font-weight:bold;">def</span> checkout
    response = gateway.<span style="color:#9900CC;">setup_agreement</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:description</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> description, <span style="color:#ff3333; font-weight:bold;">:return_url</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> return_url, <span style="color:#ff3333; font-weight:bold;">:cancel_return_url</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> cancel_return_url<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#5A0A0A; font-weight:bold;">redirect_to</span> gateway.<span style="color:#9900CC;">redirect_url_for</span><span style="color:#006600; font-weight:bold;">&#40;</span>response.<span style="color:#9900CC;">token</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>




<p>This redirects the user to PayPal so he can login and read the <em>description</em> you provided.  After he confirms, he is redirected back to your application&#8217;s <em>return_url</em>, which I set it to be the complete action below.  If he cancels, he is redirected back to the <em>cancel_return_url</em>.  You can set <em>cancel_return_url</em> to be the plan selection page where he can choose a different plan.</p>

<p>If he confirms, here&#8217;s the complete action:</p>


<div class="wp_syntax"><div class="code"><pre class="rails" style="font-family:monospace;">  <span style="color:#9966CC; font-weight:bold;">def</span> complete
    token = params<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:token</span><span style="color:#006600; font-weight:bold;">&#93;</span>
    response = gateway.<span style="color:#9900CC;">create_profile</span><span style="color:#006600; font-weight:bold;">&#40;</span>token, <span style="color:#ff3333; font-weight:bold;">:description</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> description, <span style="color:#ff3333; font-weight:bold;">:start_date</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> start_date, <span style="color:#ff3333; font-weight:bold;">:frequency</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> frequency_in_months, <span style="color:#ff3333; font-weight:bold;">:amount</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> amount_in_dollars, <span style="color:#ff3333; font-weight:bold;">:auto_bill_outstanding</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">true</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
    <span style="color:#008000; font-style:italic;"># Save this profile_id in your transactions table.  This is used to cancel/modify the plan in the future.</span>
    profile_id = response.<span style="color:#9900CC;">params</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;profile_id&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
&nbsp;
    <span style="color:#9966CC; font-weight:bold;">if</span> response.<span style="color:#9900CC;">success</span>?
      <span style="color:#5A0A0A; font-weight:bold;">flash</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:notice</span><span style="color:#006600; font-weight:bold;">&#93;</span> = <span style="color:#996600;">&quot;Your PayPal account was successfully set up for the &lt;strong&gt;#{description}&lt;/strong&gt; payment plan.&quot;</span>
      <span style="color:#5A0A0A; font-weight:bold;">redirect_to</span> login_path
    <span style="color:#9966CC; font-weight:bold;">else</span>
      <span style="color:#5A0A0A; font-weight:bold;">flash</span>.<span style="color:#9900CC;">now</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:notice</span><span style="color:#006600; font-weight:bold;">&#93;</span> = <span style="color:#996600;">&quot;There was a problem setting up your PayPal account for the &lt;strong&gt;#{description}&lt;/strong&gt; payment plan&quot;</span>
      <span style="color:#5A0A0A; font-weight:bold;">render</span> cancel_url
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>




<p>I default the <em>frequency</em> to be in months and turn on <em>auto_bill_outstanding</em> because that is what I need, but you can look at the file you downloaded and the PayPal documentation to see what other options are available.  In particular, read these two <span class="caps">PDF</span>s:</p>

<ul>
	<li><a href="https://cms.paypal.com/cms_content/US/en_US/files/developer/PP_ExpressCheckout_IntegrationGuide.pdf">Express Checkout Integration Guide</a>
</li>
	<li><a href="https://cms.paypal.com/cms_content/US/en_US/files/developer/PP_API_Reference.pdf"><span class="caps">SOAP API</span> Developer Reference</a>
</li>
</ul>

<p>If the user wants to cancel the payment plan, a cancel action would look like:</p>


<div class="wp_syntax"><div class="code"><pre class="rails" style="font-family:monospace;">  <span style="color:#9966CC; font-weight:bold;">def</span> cancel
    response = gateway.<span style="color:#9900CC;">cancel_profile</span><span style="color:#006600; font-weight:bold;">&#40;</span>paypal_profile_id, <span style="color:#ff3333; font-weight:bold;">:note</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'Payment plan was canceled by user'</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#5A0A0A; font-weight:bold;">flash</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:notice</span><span style="color:#006600; font-weight:bold;">&#93;</span> = <span style="color:#996600;">'You have successfully canceled your membership'</span>
  <span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>




<p><em>paypal_profile_id</em> is the profile_id you saved in the complete action from above.  Keeping this profile_id is very handy.</p>

<p>That&#8217;s it.  Enjoy making money!</p>

<p><strong><em><span class="caps">UPDATE</span> 2009-02-04</em></strong></p>

<p>I updated the extension to include a <em>credit_card</em> hash.  You will probably capture the credit card details submitted by the user in a form as in <em>params[:credit_card]</em>, but I will just create a hash to show as an example.  To make recurring payment with a credit card, just pass nil for the token (this is required, because PayPal would use the token in preference to the credit card).  Pass the <em>credit_card</em> hash as follows:</p>


<div class="wp_syntax"><div class="code"><pre class="rails" style="font-family:monospace;">    credit_card = <span style="color:#CC00FF; font-weight:bold;">Hash</span>.<span style="color:#5A0A0A; font-weight:bold;">new</span>
    credit_card<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:type</span><span style="color:#006600; font-weight:bold;">&#93;</span> = <span style="color:#996600;">'Visa'</span>
    credit_card<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:number</span><span style="color:#006600; font-weight:bold;">&#93;</span> = <span style="color:#996600;">'1234567812345678'</span>
    credit_card<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:exp_month</span><span style="color:#006600; font-weight:bold;">&#93;</span> = <span style="color:#996600;">'07'</span>
    credit_card<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:exp_year</span><span style="color:#006600; font-weight:bold;">&#93;</span> = <span style="color:#996600;">'2016'</span>
    credit_card<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:cvv2</span><span style="color:#006600; font-weight:bold;">&#93;</span> = <span style="color:#996600;">'123'</span>
    credit_card<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:card_owner</span><span style="color:#006600; font-weight:bold;">&#93;</span> = <span style="color:#996600;">'John Doe'</span>
    response = gateway.<span style="color:#9900CC;">create_profile</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF; font-weight:bold;">nil</span>, <span style="color:#ff3333; font-weight:bold;">:credit_card</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> credit_card, <span style="color:#ff3333; font-weight:bold;">:description</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> description, <span style="color:#ff3333; font-weight:bold;">:start_date</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> start_date, <span style="color:#ff3333; font-weight:bold;">:frequency</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> frequency, <span style="color:#ff3333; font-weight:bold;">:amount</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> amount, <span style="color:#ff3333; font-weight:bold;">:auto_bill_outstanding</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">true</span><span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>




<p>However, I got the famous <strong><span class="caps">DPRP </span>is disabled for this merchant</strong> error message when I tested it.  I did a little googling but I haven&#8217;t found the cause.  There may just be something that you have to turn on in your PayPal developer account.  I also read that it works for newer accounts only.  But since I don&#8217;t have a need for this, I didn&#8217;t look further.  If you guys know, please let me know.  I will try to update the extension as soon as possible to make it work with a credit card.</p><script src="http://feeds.feedburner.com/~s/rayvinly?i=http://rayvinly.com/articles/2009/02/20/paypal-recurring-billing-with-activemerchant-in-ruby-on-rails/" type="text/javascript" charset="utf-8"></script>]]></content:encoded>
			<wfw:commentRss>http://rayvinly.com/articles/2009/02/20/paypal-recurring-billing-with-activemerchant-in-ruby-on-rails/feed/</wfw:commentRss>
		<slash:comments>42</slash:comments>
		</item>
		<item>
		<title>Sanitize your output in Ruby on Rails</title>
		<link>http://rayvinly.com/articles/2008/10/30/sanitize-your-output-in-ruby-on-rails/</link>
		<comments>http://rayvinly.com/articles/2008/10/30/sanitize-your-output-in-ruby-on-rails/#comments</comments>
		<pubDate>Thu, 30 Oct 2008 14:43:02 +0000</pubDate>
		<dc:creator>Raymond Law</dc:creator>
				<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[Web 2.0]]></category>
		<category><![CDATA[footnotes]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[safe_erb]]></category>
		<category><![CDATA[sanitize]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[We all know about the holy h() method that escapes your output when you do .  But how many of us can claim we remember to use it where it&#8217;s appropriate during development 100% of the time?  Can you swear you&#8217;ve never missed one?  Moreover, it&#8217;s such a mental distraction to think [...]]]></description>
			<content:encoded><![CDATA[<p>We all know about the holy h() method that escapes your output when you do <%=h blah %>.  But how many of us can claim we remember to use it where it&#8217;s appropriate during development 100% of the time?  Can you swear you&#8217;ve never missed one?  Moreover, it&#8217;s such a mental distraction to think logic and h() at the same time.  And when you take over a Rails project in the middle, how can you ensure the previous developers use h()?</p>

<p>Here&#8217;s the rescue.</p>

<p><a href="http://github.com/pelargir/safe_erb">safe_erb</a> + <a href="http://github.com/drnic/rails-footnotes">footnotes</a></p>

<p>I don&#8217;t think I need to explain more.  Just use it and you will find all those places where you should sanitize your output with h(), sanitize(), and untaint(), &#8230;etc.</p><script src="http://feeds.feedburner.com/~s/rayvinly?i=http://rayvinly.com/articles/2008/10/30/sanitize-your-output-in-ruby-on-rails/" type="text/javascript" charset="utf-8"></script>]]></content:encoded>
			<wfw:commentRss>http://rayvinly.com/articles/2008/10/30/sanitize-your-output-in-ruby-on-rails/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>RailsRumble 2008</title>
		<link>http://rayvinly.com/articles/2008/10/19/railsrumble-2008/</link>
		<comments>http://rayvinly.com/articles/2008/10/19/railsrumble-2008/#comments</comments>
		<pubDate>Sun, 19 Oct 2008 20:05:40 +0000</pubDate>
		<dc:creator>Raymond Law</dc:creator>
				<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[Web 2.0]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[railsrumble]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[We just finished the Lyricist application for RailsRumble 2008 with 3 other Intridea folks.  Here are some observations:



Keep the idea small and achievable &#8211; There are only 48 hours, so you can&#8217;t build the next Google.  And there&#8217;s pressure.  Try to keep your idea small and make sure you can accomplish it. [...]]]></description>
			<content:encoded><![CDATA[<p>We just finished the <a href="http://lyricistapp.com">Lyricist</a> application for <a href="http://railsrumble.com">RailsRumble 2008</a> with 3 other <a href="http://intridea.com">Intridea</a> folks.  Here are some observations:</p>


<ul>
<li><strong>Keep the idea small and achievable</strong> &#8211; There are only 48 hours, so you can&#8217;t build the next Google.  And there&#8217;s pressure.  Try to keep your idea small and make sure you can accomplish it.  You have to deploy a finished product in order to have any chance of winning.  So stop day dreaming about cool extra features because you won&#8217;t get that implemented.</li>
</ul>




<ul>
<li><strong>Prior planning is the key</strong> &#8211; We barely had any because we had decided on the idea the day before the rumble began.  When the competition started, people don&#8217;t know who&#8217;s doing what and it was kinda a mess.  Fortunately we had a campfire room where all conversation happen, so we can kind of iron out the issues.  However, better preparation and team cohesiveness would have helped a great deal in communication.</li>
</ul>




<ul>
<li><strong>Deploy early</strong> &#8211; I&#8217;ve seen too many deployment problems came up before, so I took the initiative to make sure we could deploy as soon as the competition began.  It helped tremendously because we never had to worry about if we could deploy before time expired.  While you are fixing last minute bugs and the pressure, it would have been tough to set up a server and deploy flawlessly.</li>
</ul>




<ul>
<li><strong>A lot of scaffolding</strong> &#8211; I took full advantage of Rails scaffolding.  There&#8217;s just no time to reinvent the wheels when all the restful model and controller methods are already available with just one command.  You use plugins and gems for the same reason, right?  So, don&#8217;t be stupid.</li>
</ul>




<ul>
<li><strong>Conflicts</strong> &#8211; The bigger your team, the more conflicts there would be when people check in and out.  We were writing a new application, so people were editing the same files.  Now, if you organize and assign work to people as in a regular project, conflicts don&#8217;t usually happen and even if they do occur, it is trivial to resolve.  However, when you are rumbling, you will step on one another&#8217;s toes.  I can guarantee you that.</li>
</ul>




<ul>
<li><strong>Forget about writing tests</strong> &#8211; Look, I am in support of agile and test-driven development, with one exception.  That is, you are not participating in RailsRumble.  There&#8217;s just no time for it.  If you are a good enough programmer, you can build a small application with no tests.  If you can&#8217;t, I don&#8217;t want to work with you.  Writing tests for a new application starting from scratch in just 48 hours is simple not feasible.  No bargain!</li>
</ul>




<ul>
<li><strong>No ticketing system like Unfuddle and Lighthouse</strong> &#8211; One team member had tried to use Unfuddle to create tickets to get ourselves more organized.  While it was a sincere attempt, it simply didn&#8217;t work.  There&#8217;s no time to accept a ticket, create a new ticket, &#8230;  We pretty much abandoned it soon after we started.</li>
</ul>




<ul>
<li><strong>Nice to have a designer</strong>: &#8211; It is very nice if you have a designer on you team because it&#8217;s hard to wear two hats in 48 hours.  Design work can draw your focus away from development.</li>
</ul>



<p>Now that I&#8217;ve given you my insights for next year&#8217;s RailsRumble.  As a token of appreciation, please <a href="http://railsrumble.com/teams/the-unstable-isotopes">vote for us</a>!</p>

<p><strong><span class="caps">UPDATE</span> 2008/10/20</strong></p>

<p><em>One more thought on RailsRumble the day after:</em></p>

<p>Numerous projects that I worked with before never deploy quickly, let alone in 48 hours.  I think it&#8217;s refreshing and rewarding to have something built and deployed so quickly.  It is true that we have to cut many features in order to deploy a first version, but lesser is better than never.  I think many other projects can try to deploy early and often and just go through more iterations and get feedbacks from users and customers.  The whole application doesn&#8217;t need to be finished.  Even if you only have login and logout, you can still deploy.  Add the next feature, deploy again.  That way, you aren&#8217;t keeping the features to yourself.  You can get feedback from users to see what improvements they are looking for and may even lead you to implement the real features that they truly want.</p><script src="http://feeds.feedburner.com/~s/rayvinly?i=http://rayvinly.com/articles/2008/10/19/railsrumble-2008/" type="text/javascript" charset="utf-8"></script>]]></content:encoded>
			<wfw:commentRss>http://rayvinly.com/articles/2008/10/19/railsrumble-2008/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Google Badminton</title>
		<link>http://rayvinly.com/articles/2008/08/15/google-badminton/</link>
		<comments>http://rayvinly.com/articles/2008/08/15/google-badminton/#comments</comments>
		<pubDate>Fri, 15 Aug 2008 23:10:58 +0000</pubDate>
		<dc:creator>Raymond Law</dc:creator>
				<category><![CDATA[Badminton]]></category>
		<category><![CDATA[google]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<p><img src="http://img.skitch.com/20080816-ebf28tbb45xfdbdgedhsigu7t.png" alt="" height="359" width="499" /></p><script src="http://feeds.feedburner.com/~s/rayvinly?i=http://rayvinly.com/articles/2008/08/15/google-badminton/" type="text/javascript" charset="utf-8"></script>]]></content:encoded>
			<wfw:commentRss>http://rayvinly.com/articles/2008/08/15/google-badminton/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
