Raymond Law

Badminton on Rails
RSS icon Home icon
  • Verizon FiOS has the absolutely worst customer service

    Posted on December 29th, 2009 Raymond Law 1 comment

    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 a 1-year commitment. Bad start!
    • They lowered their prices for Internet, and I kept paying the higher price until I found out and called to adjust.
    • 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.
    • 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.
    • Of course the $15 offer was not reflected on the bill.
    • So I called them again. They couldn’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.
    • No call for a week. So I called again.
    • This rude lady Badger (who would only give me her last name) redirected me to wireless department who redirected me to Badger. WTF!?
    • 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’s a lie, and they are not honoring their words.
    • Badger asked me for the person who offered me and I told him he gave me an order number but I didn’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’s name is Smith, how would she be able to find him for me? She did not have an answer.
    • Badger became rude and I asked to talk to her manager Dinkins. Being mistreated by Badger’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 – no surprise there.
    • I told Dinkins the same thing over and she still insisted a home phone was required.
    • I asked Dinkins to find the guy who offered me and told her I’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’s the only thing given to customers. She did not have an answer.
    • 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.
    • Second Live Chat attempt. See below.
    • I called FiOS again to try to downgrade my speed back to 15/5 because (1) I don’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.
    • 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.
    • 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’s a complaint, give the least information so you won’t be founded out and get fired. No surprise to my belief here.
    • Now Eric told me I would indeed raise my price if I downgrade because it’s not in a bundle and would cost me $25 more. WoW!!!
    • I then told him about the $15 discount offer I had been promised. He looked and said he founded it!!! FINALLY, after 3 phone calls (talked to 5 persons), 2 live chats.
    • He told me he would be able to apply that manually.
    • GREAT! 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.

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

    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…

    Second Live Chat transcript as follows (not all that interesting, included for documentation purpose):

    Chat Subject: FiOS Billing Question
    Your Question: I was talking to Cathy in my last session and it broke down suddenly. I need to talk to her again please.
    A Verizon eCenter Representative will be with you shortly. Thank you. (14:36:58)
    14:40:52 We apologize for the delay.You are next in the line. A representative will be with you shortly.
    Agent Jana has joined. (14:41:25)
    Jana : Chat ID for this session is xxxxxxxxxxx. (14:41:25)
    Jana(14:41:35): Hello. Thank you for visiting our chat service. I will be happy to help you today.
    Jana(14:42:26): I’m sorry, I cannot transfer this chat to another representive.
    Raymond Law(14:42:36): Hi Jana.
    Jana(14:42:58): Hello.
    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.
    Raymond Law(14:43:41): Account # is xxxxxxxxxxxxxxxxxxxx
    Jana(14:43:57): I will be happy to review your account; one moment.
    Jana(14:44:08): Do you have home phone service?
    Raymond Law(14:45:00): No, when the offer was made to me, he said no home phone is required.
    Raymond Law(14:45:14): only the upgrade to 25/15 was needed for the $15/mo discount
    Jana(14:45:36): Ok, one moment.
    Jana(14:47:59): I see the bundle promotions as: 3 Months Free HBO/Cinemax and 24 Month Price Guarantee. I do not see anything about an extra $15.00 per month discount.
    Jana(14:48:30): Did you just add your Wireless to the bundle too?
    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.
    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.?
    Jana(14:51:34): Let me check that part of the bill; one moment.
    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.
    Raymond Law(14:53:31): Thanks.
    Jana(14:53:57): I do not see it on the Wireless billing either.
    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.

    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.

    Our representatives will be happy to help you.
    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.

    See how customers are helping customers on our Verizon Forums website located at: http://forums.verizon.com
    Raymond Law(14:55:39): Jana
    Jana(14:56:16): Yes.
    Raymond Law(14:56:20): I’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.
    Raymond Law(14:56:37): I don’t want to be harassed yet again with your people on the phone.
    Jana(14:56:48): I’m sorry. I cannot add a discount to your service.
    Raymond Law(14:56:48): I will just take this to BBB instead then.
    Jana(14:57:42): I have noted your account with the information you provided.
    Raymond Law(14:58:15): Here’s something you can help me in the mean time.
    Raymond Law(14:58:41): What is the TV portion and what is the Internet portion of my FiOS bill regularly per month?
    Jana(14:59:32): One moment.
    Jana(15:00:50): Looks like the normal rate for the TV is $57.99 and the Internet is $64.99.
    Raymond Law(15:02:34): The bundle price Cathy told me was $94.99, which was correct.
    Jana(15:02:51): Ok.
    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?
    Jana(15:03:40): That would be the bundled rate.
    Jana(15:04:16): Let me look at your previous bill, one moment.
    Raymond Law(15:06:01): okay thanks
    Jana(15:07:02): It was $84.99 and the TV portion was also different.
    Jana(15:07:32): Shows TV Essentials $47.99 and the Internet at $44.99 with a bundle discount of $7.99.
    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.
    Jana(15:08:40): Ok, one moment.
    Jana(15:11:48): $84.99
    Jana(15:12:29): That is the Double Flex Rate.
    Jana(15:13:04): That, of course, would not include your Wireless.
    Raymond Law(15:13:11): What does that mean?
    Jana(15:13:27): That rate is just for the Internet and TV.
    Raymond Law(15:13:39): Right, of course I will have to pay wireless separately
    Raymond Law(15:13:55): Now if I combine both bills, will I get a discount?
    Jana(15:14:45): I cannot assist you with that. You will have to call in to re-bundle your services.
    Raymond Law(15:15:20): Extreme HD + 25/15 = $94.99
    Extreme HD + 15/5 = $84.99
    Correct?
    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.
    Jana(15:15:52): That is the information I see.
    Raymond Law(15:15:58): See, that is the reason why the $15 off per month was offered!!!
    Jana(15:16:31): What was the reason?
    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.
    Raymond Law(15:17:38): That was why I was offered $15
    Raymond Law(15:17:43): But now you guys are not honoring that
    Jana(15:17:55): No, I was just in an order to change the bundle.. I have never ordered a bundle to include Wireless.
    Jana(15:18:07): I am not in the order center.
    Raymond Law(15:18:43): I am not accusing you, I am just saying that they didn’t honor the offer they promised on my bill. :)
    Jana(15:19:04): Your account show that you have a Triple Flex bundle; triple would be your TV, Internet and Wireless.
    Raymond Law(15:19:30): ok, so what is that bundle price then?
    Jana(15:19:40): I cannot change your bundle or add an additional discount.
    Raymond Law(15:19:44): I am trying to see how much I can save by changing it back to 15/5
    Raymond Law(15:19:49): Can you change my 25/15 plan to 15/5 please?
    Jana(15:20:05): I would say it is going to save you $10.00 per month.
    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.
    Raymond Law(15:21:05): Can I get a transciprt of this chat?
    Jana(15:21:37): You can copy and paste it to a Word document I suppose.
    Jana(15:21:52): I do not have any way to send a transcript to you.

  • Rails Rumble 2009

    Posted on August 25th, 2009 Raymond Law No comments

    I participated in last year’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’t really have any new thoughts than last year. However, Andrew Ng, one of our team members have written up a post about his thoughts.

  • Intridea’s Present.ly has been nominated as a finalist in the WebWare 100 Communication Category

    Posted on March 31st, 2009 Raymond Law No comments

    Present.ly has been nominated as a finalist in the WebWare 100 Communication Category. We’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 100 best web applications of the year are. Past winners included such products as GMail and Amazon MP3, so we’re very excited to be included as a finalist for this year’s selection.

    Voting is open right now, so please vote for us! 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.

  • Easy or Hard?

    Posted on February 25th, 2009 Raymond Law No comments

    I had the following conversation with a colleague about a client project recently.

    easy_or_hard

    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 annoying and boring. And I want the hard ones because they are challenging and interesting.

    I think the following matrix describes it best:

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

    Do you get the point?

    As software engineers or programmers (sometimes interchangeable terms IMO), 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.

    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 drag.

    Now we understand the matrix, but what can we do about the drag?

    This is what I think.

    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.

    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.

    The difference is in the interpretation.

    Interpretation

    Different people interpret the same thing differently based on their own level of interest/time/concern, …/etc. That is a fact, not an argument.

    In software development, instead of the project manager assigning tasks to each engineer, programmer, QA, you name it, based on time, skill levels, familiarities with certain code pieces, scopes, existing client relationships, maybe, just maybe, 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.

    Potential pitfalls

    • What if none of the tasks interest me? Maybe put that person in a different project that has tasks that interest him?
    • 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?
    • If I keep picking tasks that seem easy (on the surface), would it make me look lazy?
    • If I pick several hard tasks, I may make myself too busy.

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

    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 interpretation to it. It certainly is a paradigm shift in project management.

  • Moving from Typo to Wordpress

    Posted on February 23rd, 2009 Raymond Law No comments

    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’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 Stuart Johnston and Max Newell.

    Those are GREAT 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 SQL. 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’t have to worry about Wordpress’s table structures because I already did this for you. If you are using a different version of Typo, feel free to modify this migration script and post feedback.

    Here are the steps that you need to take after grabbing the script:

    > mysqldump typo_db articles_tags tags categorizations categories contents feedback > typo.sql
    > mysql typo_db < typo.sql
    > mysql typo_db < typo_4_1_1_to_wordpress_2_7_1.sql

  • PayPal Recurring Billing with ActiveMerchant in Ruby on Rails

    Posted on February 20th, 2009 Raymond Law 29 comments

    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 a monthly or yearly subscription plan with PayPal. Therefore, I did some googling and found that Jon Baker has already extended ActiveMerchant to add this functionality using PayPal’s Name-Value Pair (NVP) API. However, as Cody Fauser pointed out, the NVP API was taken out from ActiveMerchant, so I had to implement that with PayPal’s SOAP API.

    First, download this file and put it in vendor/plugins/active_merchant/lib/active_merchant/billing/gateways/. Use the GitHub from now because maintaining a separate file download is too troublesome. Alternatively, there’s a fork on GitHub at http://github.com/rayvinly/active_merchant/.

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

      def checkout
        response = gateway.setup_agreement(:description => description, :return_url => return_url, :cancel_return_url => cancel_return_url)
        redirect_to gateway.redirect_url_for(response.token)
      end

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

    If he confirms, here’s the complete action:

      def complete
        token = params[:token]
        response = gateway.create_profile(token, :description => description, :start_date => start_date, :frequency => frequency_in_months, :amount => amount_in_dollars, :auto_bill_outstanding => true)
      end
     
        # Save this profile_id in your transactions table.  This is used to cancel/modify the plan in the future.
        profile_id = response.params["profile_id"]
     
        if response.success?
          flash[:notice] = "Your PayPal account was successfully set up for the <strong>#{description}</strong> payment plan."
          redirect_to login_path
        else
          flash.now[:notice] = "There was a problem setting up your PayPal account for the <strong>#{description}</strong> payment plan"
          render cancel_url
        end
      end

    I default the frequency to be in months and turn on auto_bill_outstanding 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 PDFs:

    If the user wants to cancel the payment plan, a cancel action would look like:

      def cancel
        response = gateway.cancel_profile(paypal_profile_id, :note => 'Payment plan was canceled by user')
        flash[:notice] = 'You have successfully canceled your membership'
      end

    paypal_profile_id is the profile_id you saved in the complete action from above. Keeping this profile_id is very handy.

    That’s it. Enjoy making money!

    UPDATE 2009-02-04

    I updated the extension to include a credit_card hash. You will probably capture the credit card details submitted by the user in a form as in params[:credit_card], 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 credit_card hash as follows:

        credit_card = Hash.new
        credit_card[:type] = 'Visa'
        credit_card[:number] = '1234567812345678'
        credit_card[:exp_month] = '07'
        credit_card[:exp_year] = '2016'
        credit_card[:cvv2] = '123'
        credit_card[:card_owner] = 'John Doe'
        response = gateway.create_profile(nil, :credit_card => credit_card, :description => description, :start_date => start_date, :frequency => frequency, :amount => amount, :auto_bill_outstanding => true)

    However, I got the famous DPRP is disabled for this merchant error message when I tested it. I did a little googling but I haven’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’t have a need for this, I didn’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.

  • Sanitize your output in Ruby on Rails

    Posted on October 30th, 2008 Raymond Law 1 comment

    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’s appropriate during development 100% of the time? Can you swear you’ve never missed one? Moreover, it’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()?

    Here’s the rescue.

    safe_erb + footnotes

    I don’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(), …etc.

  • RailsRumble 2008

    Posted on October 19th, 2008 Raymond Law 9 comments

    We just finished the Lyricist application for RailsRumble 2008 with 3 other Intridea folks. Here are some observations:

    • Keep the idea small and achievable – There are only 48 hours, so you can’t build the next Google. And there’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’t get that implemented.
    • Prior planning is the key – We barely had any because we had decided on the idea the day before the rumble began. When the competition started, people don’t know who’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.
    • Deploy early – I’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.
    • A lot of scaffolding – I took full advantage of Rails scaffolding. There’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’t be stupid.
    • Conflicts – 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’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’s toes. I can guarantee you that.
    • Forget about writing tests – Look, I am in support of agile and test-driven development, with one exception. That is, you are not participating in RailsRumble. There’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’t, I don’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!
    • No ticketing system like Unfuddle and Lighthouse – 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’t work. There’s no time to accept a ticket, create a new ticket, … We pretty much abandoned it soon after we started.
    • Nice to have a designer: – It is very nice if you have a designer on you team because it’s hard to wear two hats in 48 hours. Design work can draw your focus away from development.

    Now that I’ve given you my insights for next year’s RailsRumble. As a token of appreciation, please vote for us!

    UPDATE 2008/10/20

    One more thought on RailsRumble the day after:

    Numerous projects that I worked with before never deploy quickly, let alone in 48 hours. I think it’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’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’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.

  • Google Badminton

    Posted on August 15th, 2008 Raymond Law No comments

  • Capistrano Deployment Recipes

    Posted on August 4th, 2008 Raymond Law 1 comment

    Dealistic was first deployed to Slicehost when we were testing it on staging. However, I only got the 256 slice and low memory is a big problem for Ruby and Mongrel. We’ve moved to Amazon EC2 when we launched. It is running rock solid and we don’t run out of memory again, at least for now :P

    As a result of all these, I wrote two Capistrano recipes for deployment, for both Slicehost and EC2. We also use GitHub for version control. I think these deployment recipes may be helpful to others. So here they are:

    We wrote some custom Capistrano tasks to copy over configuration files, symlink plugins, start/stop BackgrounDRb, and a custom maintenance page. But these things are optional. It should be simple to add/remove things as you see fit.