Monthly Archives: April 2011

T-Mobile Customer Support Is Like Getting Help From A Child

I just spent 30 minutes on the phone with T-Mobile trying to change my plan. 5 useless conversations later with 5 different customer service reps, having repeated my phone number, name and the last 4 digitis of my social security number each time, I gave up and hung up.

UPDATE:

We went into a store and they called T-mobile again for us. It turns out that the magic words are “Close my account”. That gets you to customer loyalty. We are now happy prepaid customers. We did also sign up with a VoIP service and tie that into our Google Voice numbers to get free incoming calls when we’re at home, but that’s food for another post.

 

What I’m trying to do isn’t that complicated. I currently have a family plan with two phone lines on it. The 750 Talk plan for $59.99 per month.

Our current plan
Our current plan

Our contract expired last month, which meant I was in the market for a new plan. After downloading our recent usage into a spreadsheet and checking out all our options, the best place for us to be right now is on separate monthly pre-paid plans, the 1500 Talk & Text with 30 MB data plan, for $30.00 per phone.

Our Desired Plan
Our Desired Plan

Same price for 4 t imes the minutes, not too bad, right? What the family plan has that the prepaid doesn’t is that the family plan includes free nights and weekends, and free T-Mobile to T-Mobile calling. We’re both using about 700-900 total minutes per month with no texting; essentially what this plan would do is give us texting at the same price we’re paying now.

Problem 1: Service Reps Don’t Want to Talk to You If You Have a Plan That’s Not In Their Department

The first issue I had was that each service rep wanted to send me back to the post-paid department since I have a post-paid plan. I literally had to interrupt them and say “Wait!” to not get sent back there again and again.In the end, no one really knew who I was supposed to talk to.

Post Paid
    ||
    \/
Pre Paid
    ||
    \/
Customer Care ? (Gustavo)
    ||
    \/
Customer Care
    ||
    \/
Flex Pay
    ||
    \/
Pre Paid (but I said no, and hung up)

Above is how I was transfered. I was automatically started in post paid, which makes sense since that’s the plan type I have. They sent me to pre-paid (see problem 2 below, for more on this) who said that Customer Care should be able to help me switch plans. Customer care apparently wasn’t really custoemer care because they transfered me to the real Customer Care. The real customer care actually seemed like they understood my problem, but couldn’t change my plans for me, and sent me to Flex Pay. Flex pay got confused and tried sending me back to pre-paid. At this point I figured enough was enough and said goodbye.

Problem 2: Internal Plan Categories Don’t Match T-Mobile’s Website’s Plan Categories

Check out the Family Plan page. Go ahead, open that link and search for the term “post paid” or “postpaid”. The only place it appears is in the light grey fine print at the bottom of the page, and yet customer service kept referring to the post-paid department when they talked about transferring me. The term postpaid was pretty easy to figure out, after all, I am paying for my account at the end of each month.

Where it starts to get fun is if you visit their Prepaid Plans page.  Looks like some nice pre-paid plans, right? You’ve got your pay by the minute section and your prepaid monthly plan. Pretty straightforward right? Except that once you have gotten transfered to the pre-paid department and start talking about the monthly plans, they get confused. The lady I spoke with kept saying “We don’t have any plans with 1500 minutes!”. Finally she figured out which plan I was talking about and said “OH, that’s not prepaid, that’s a flex plan”.  What do you mean it’s not pre-paid? It says on the website “PREPAID PLANS”. Go back to the Prepaid plans page and search for the word “Flex” — it’s nowhere to be found.

Now, I’m not sure if the pre-paid customer service rep was just confused or what, but I don’t even see the word Flex anywhere in the Plans menu list.I have added it for your convenience.

 

Flex is Missing
Flex is Missing

There is in fact a FlexPay Plans webpage, but I suggest you use Google to find it because it’s sure not in the menu or on the Plans Overview webpage. Actually, I suggest not bothering with finding it because the plans aren’t very good.

In any case, it doesn’t look like the T-mobile website likes Flex Pay very much, and it seems like the pre-paid people need some more training on their pre-paid plans. Or the website needs to be more clear on the definition of pre-paid.

Problem 3: Getting Help From T-Mobile is Like Getting Help From a Child

I’ll give T-Mobile this much, I was speaking to a live person in about 3 minutes, and every one of the 5 people I spoke with was friendly.

Working with them was like getting help from a child though. A happy friendly kid who you have to explain things to over and over again. Every time you speak to someone you are required to enter your phone number, say your name and the last 4 of your Social Security number, and then you have to re-explain your whole issue to the new person. Isn’t this the reason that computers were made? To help us with problems like this? Once I have proven who I am, shouldn’t I be able to get transfered through the whole support system without doing so again?

Conclusion

After 30 minutes I’d had enough. I guess I’ll have to go into a physical store. It just seems that a phone company should be able to help a customer change phone plans over the phone. I mean, isn’t that kind of the business they’re in?

Sorry for the rant, I usually try to keep this website more technical and interesting with less whining, but this is what you get tonight.

Sidenote

Runners up in the search for a new plan were

  • H2O Wireless – $40/month for unlimited voice and text — GSM prepaid
  • Boost Mobile – $50/month starting decreasing every 6 months to $35/month after 18 months. iDEN prepaid

The price to match was $60/month for two lines for about 900 minutes per line. Boost would’ve been worth the extra money for unlimited data, but we got my wife a nice GSM phone with built-in GPS (no data plan needed!)and I haven’t seen a smart phone that fits my needs yet, so I’d rather stick with my smallish dump-phone. H2O would’ve been an acceptable option, but since we won’t be maxing out the 1500 minutes on the T-Mobile plan, the price was the only difference and T-Mobile won out. Well…it will if they can get our plans switched over.

Posted in Something Interesting | Tagged | Leave a comment

SVN pre-commit hook which can syntax check all files

If you manage a project which uses Subversion you’re going to eventually want to check the syntax of files before they get committed to the repository. Checking files before they get committed to the repository solves at least two problems for me.

  1. It stops me from checking something in, noticing it doesn’t work and committing a fixed version only moments later.
  2. It prevents other users from accidentally checking in broken code

A quick search online will reveal that it’s easy to check the syntax of your PHP files before they are committed. All you need to use is a pre-commit hook. Unfortunately scripts I found would all stop on the first error which was not the behavior I wanted. I wanted to check all of the files I was committing and get a list of all errors immediately. So, I wrote my own pre-commit hook.

Checking All PHP Files With A pre-commit Hook

The script I came up with is in PHP. Save this in the hooks directory of your Subversion repository. Name it pre-commit and make it executable.

#!/usr/bin/php 
<?php 

// Set these manually since Subversion doesn't set ENV
$PHP = '/usr/bin/php'; 
$SVNLOOK = '/usr/bin/svnlook'; 
$AWK = '/usr/bin/awk'; 
$GREP = '/bin/egrep'; 
$SED = '/bin/sed'; 
 
$REPOS = $argv[1]; 
$TXN = $argv[2]; 
 
// Find the changes...
$CHANGED=`$SVNLOOK changed -t "$TXN" "$REPOS" | $GREP "^[U|A]" | $AWK '{print $2}'`; 
// ...as an array
$CHANGED = split("\n",trim(rtrim($CHANGED))); 
 
$errors = Array();

// Perform specific actions based on the file extension 
foreach($CHANGED as $FILE){ 
 switch(pathinfo($FILE,PATHINFO_EXTENSION)){ 
 case 'php': 
 case 'class': 
    // Get just the error/no error message from php -l
    $cmd="$SVNLOOK cat -t '$TXN' '$REPOS' '$FILE' | $PHP -l | head -2 | tail -1"; 
    $msg=trim(rtrim(`$cmd`)); 
    if(preg_match('/No syntax errors detected/',$msg) != 1){ 
       $msg = preg_replace('/in - /','',$msg); 
       $errors[] = "In $FILE: $msg"; 
    }
   break; 
  case 'js':
    // You could do something else for JavaScript -- like JSLint, if you're brave
    break;
 } 
} 
 
// Print all the errors in a nice list
if(count($errors) > 0){ 
 $warning =" 
************************************************************************* 
* Please correct the following errors before commiting these changes! * 
************************************************************************* 
"; 
 error_log($warning); 
 for($i = 1;$i <= count($errors);$i++){ 
 error_log("$i. " . $errors[($i - 1)]); 
 } 
 
 exit(-1); 
} 
 
exit(0);

This script will check all of the files that changed based on their file extension. You could check .js files one way and .php another way. You can extend this script by simply adding more cases to the switch statement.

The script collects all errors and then prints a nice list when it’s done. The output looks like this:

svn commit -m "pre-commit hook test"
Sending        test_scripts/info.php
Sending        test_scripts/user_read.php
Transmitting file data ..svn: Commit failed (details follow):
svn: Commit blocked by pre-commit hook (exit code 255) with output:

*************************************************************************
*  Please correct the following errors before commiting these changes!  *
*************************************************************************

1. In /test_scripts/info.php: Parse error: syntax error, unexpected $end on line 4
2. In /test_scripts/user_read.php: Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING on line 8

I’m not going to say that it’s the most elegant output in the world but it does the job and I haven’t checked in a bad PHP file since.

Posted in Programming, Something Interesting | Tagged , , , , , , , , | 1 Comment

Moving a single WordPress Category to a New Site

I recently moved the Fridley Farmer content from this site over to http://fridleyfarmer.com, and wanted to move all of my content over there too. There are plenty of instructions on moving wordpress sites available online, I did a full database dump, copied all the files, then deleted the non Fridley Farmer content from the new site. You can also use the Import/Export functionality to export just a single category, but I didn’t know if that would include my pictures and comments as well, so I just copied everything.

What wasn’t obvious however, was how to redirect users to my new content! I didn’t want real users visiting stuporglue.org for the Fridley Farmer content anymore, but I didn’t want to send EVERYONE (like you!) over to the new site. I also didn’t want Google thinking that my new site just had duplicate content.

I ended up making three changes to my wordpress install in order to make the transition as seamless as possible.

 

Header Redirects on Single Posts and The Cateogry

In theme’s header.php I added a short bit of PHP that would detect users trying to visit the Fridley Farmer category archive, or any post in the Fridley Farmer category. It performs a 301 Moved Permanently HTTP header redirect. Easy peasy.

<?php
if( is_single() && in_category('Fridley Farmer') ){
 header ('HTTP/1.1 301 Moved Permanently');
 $newsite = "http://fridleyfarmer.com" . $_SERVER['REQUEST_URI'];
 header ('Location: '. $newsite);
}else if( is_category('Fridley Farmer') ) {
 header ('HTTP/1.1 301 Moved Permanently');
 $newsite = "http://fridleyfarmer.com" . $_SERVER['REQUEST_URI'];
 header ('Location: '. $newsite);
}
?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html ...

Replace Category Content With a “We’ve Moved” Message

I edited the code in wp-includes/post-template.php to modify the post’s content as it’s returned.

I changed:

function the_content($more_link_text = null, $stripteaser = 0) {
   $content = get_the_content($more_link_text, $stripteaser);
   $content = apply_filters('the_content', $content);
   $content = str_replace(']]>', ']]&gt;', $content);
   echo $content;
}

Into:

function the_content($more_link_text = null, $stripteaser = 0) {
 if(in_category("Fridley Farmer")){
   $content = "<p>The Fridley Farmer has moved its wagon down the road to
   <a href='http://fridleyfarmer.com'>http://fridleyfarmer.com</a>. All of our
   belongings, posts and content have arrived safely, and we're just waiting for
   you!.</p>
   <p>Stuporglue.org will remain as a place for all my programming and other
   non-gardening related ramblings.</p>
   <p>So, update your links, tell all your friends and come check out the new site!</p>";
  } else {
   $content = get_the_content($more_link_text, $stripteaser);
   $content = apply_filters('the_content', $content);
   $content = str_replace(']]>', ']]&gt;', $content);
  }
  echo $content;
}

Replace Post Title Links With Link to New Site

In wp-includes/link-template.php I edited the very end of the function get_permalink. I made it so that links to Fridley Farmer content go to the new site.

return apply_filters('post_link', $permalink, $post, $leavename);
}

Into:

$finalurl = apply_filters('post_link', $permalink, $post, $leavename);

  require_once('category-template.php');
  if(in_category('Fridley Farmer',get_the_ID())){
    $finalurl = str_replace(home_url(),'http://fridleyfarmer.com',$finalurl);
  }

return $finalurl;
}

I hope that helps someone out. It wasn’t difficult, but I couldn’t find how to do something like this documented anywhere.

It will probably get overwritten the next time I upgrade WordPress, but hopefully by then everyone who needs to know to go to the new site will already have done so.

Posted in Something Interesting | Tagged , , | Leave a comment