May 20, 2011

Twilio Syntax Auto-Complete Mode for Coda

I love Twilio‘s markup language, TwiML. It’s intuitive and easy to understand. Still, whenever I’m developing I have to keep the Twilio documentation page open to know all the verbs and attributes of the language. To save time, I created my very own mode plugin for Coda so that as I’m typing, it automatically completes the Twilio commands and shows me all the available attributes. So, without further adue, download Twilio.mode and install it in Coda.

Install instructions:

  1. Download Twilio.mode.zip
  2. Unzip it
  3. Copy the new Twilio.mode folder to: ~/Library/Application Support/Coda/Modes
  4. Reboot Coda, and under Text > Syntax Mode you’ll see Twilio

If you liked this plugin, you should probably follow me on Twitter. I’m always giving away little scripts like this. Note: It’s also available on github.

April 21, 2011

Think Like MacGyver

When I was flying to Detroit from the Dominican Republic I did what I normally do. Open up my laptop, plug in my headphones, and zone off into some Louis C.K. or Jim Gaffigan standup.

Then I got a tap on my shoulder – my brother wanted to listen. I only had one audio output, so it looked like we had to go one earbud each. But wait, my MacGyver kicked in. Here’s what I had:

What would you do? Tell him he could listen to the soundtrack from The Incredibles while I laugh myself to tears? Give him an earbud and subject both of us to a terrible audio experience? Nah, we used what we had and made it work.

Here’s what I did:

  1. Made a Wi-Fi hotspot
  2. Converted the video into a .mp4 with VLC
  3. Loaded up MAMP
  4. Dumped the video into the the MAMP folder
  5. Connected the iPhone to my MacBook’s Wi-Fi
  6. Streamed on the iPhone
  7. Both lol’d at 30,000 ft

Turns out I didn’t even need the rubber band or paper clips!

Startups need to think this way. Take what you’ve got, and multipurpose it. Sure, having an audio splitter would have done the trick, just like having an extra iMac for the conference room would make meetings easier. But instead, buy a nice 27” monitor and adaptor so you can just plug your existing assets into it. Think carefully about spending expensive investor money when you don’t have to.

April 17, 2011

Ineffective Slogans

“We Work Hard So You Don’t Have To”

I’m sure you’ve heard this one. But do you actually know what company says it? Likely not, since it’s such a generic line. It could apply to almost any service, and to tons of products aimed to increase efficiency. A quick google search for the line will bring up vacation planning services, horse stables, janitorial services, and the one you probably heard it from, Scrubbing Bubbles. Scrubbing Bubbles is throwing away money on a slogan that does not build their brand.

“Welcome to the Human Network”

Yes, Cisco is trying to demonstrate how technology doesn’t need to be complicated and that they have excellent customer service. But who is their real audience? Is it the Marketing Director who wants to be able to pick up the phone and call someone, or the HR head who values interpersonal connection? No, it’s the IT guy who wants to make sure that the system works, without interruption, automatically.

“Believe in Something Better”

Like the Scrubbing Bubbles slogan, this could apply to anyone. It’s too grandiose of a slogan for an unknown company like U.S. Cellular. I’m sure it was just made by combining four or five different slogans their marketing team came up with in order to make everyone happy.


It’s tough to make a one word slogan work for a company, especially a company that has a “too expensive for what you actually get” reputation.

So what DOES make a good slogan?

  • Quickly explains the value your provide
  • Memorable (often by evoking emotion or humor)
  • Simple

One of my favorite slogans is from Diapers.com.

“We Deliver Everything But The Baby”

There is no question what diapers.com does after you hear this slogan. It’s simple, memorable, catchy, and tells exactly what they do. I can’t think of a better use of the domain name.

“Change We Can Believe In”

This slogan works well as a whole, but let’s break it down. If they solely went after the word ‘Change’ by itself like Acura went after ‘Advance,’ this would not have been as effective. The Obama campaign established the whole line first, and as it caught on, they could simply use the word ‘Change.’ The word ‘We’ gives it that popular team mentality, and makes people want to be part of something. ‘Believe’ signals vision, trust, and confidence, and appeals to people’s aspirational goals. Altogether, this slogan is rock solid.

Slogans should be used to enforce your brand. If done right, you can ‘claim’ additional words in consumer’s minds. Take the time when making a slogan and make sure it appeals to your audience’s needs.

April 4, 2011

Mobile Mad Libs

The team over at Twilio was running a contest to create a game using their amazing voice and SMS developer platform this week, and I just submitted my entry. The game? Mobile Mad Libs. It’s a word game for those long road trips where you can’t (safely) play Angry Birds on your iPhone, but still want to keep your mind active.

Try it for free! Dial 718-569-7938.

April 2, 2011

Twilio + WhitePages API = Win

I’m currently working on a Twilio application that requires a complete caller ID lookup system. The caller ID that comes on most phones is very basic, and uses something called CNAM (Caller NAMe). Twilio has a simple CNAM function built in that costs $0.01 per query, but CNAM gives pretty skimpy data. These queries only give one line of info and if the person is using a cellphone, it’s likely only going to give you something like “Wireless Caller” or “Cingular Wireless Customer.”

Thank god for the WhitePages API.

It took me quite awhile to find the API, but when I did I let off a big fist pump. Currently their API is in beta, and only allows you to make 200 calls a day (Pro Tip: build up your own database with all the calls you make to save on repete queries). After a quick whois on whitepages.com, I got their office number in Seattle and next thing I know I’m speaking with Jim Nuccitelli, the director in charge of their API. Jim helped push my application along and told me about some upcoming advances in their API (Spoiler: awesomeness to come).

So, I’ve ripped apart their API and am using it to look up info on incoming numbers through Twilio. Below is a PHP function that does a WhitePages lookup for a ten digit phone number and returns an array with the following:

  • First Name
  • Middle Name
  • Last Name
  • Street Address
  • City
  • State
  • Zip
  • Business Name
  • Phone Type (Cell, home, business, etc)
  • Carrier
function phoneNumberLookup($number){
	// $number should be 10 digits, eg] 4565551337
	$url = "http://api.whitepages.com/reverse_phone/1.0/?phone=$number;api_key=$apiKey";

	global $whitePages;
	$whitePages = array(
	"wpFirstName" => "",
	"wpMiddleName" => "",
	"wpLastName" => "",
	"wpAddressFullStreet" => "",
	"wpAddressCity" => "",
	"wpAddressState" => "",
	"wpAddressZip" => "",
	"wpBusinessName" => "",
	"wpPhoneType" => "",
	"wpCarrier" => ""

	function contents($parser, $data){
		global $nextVar, $whitePages;
		if( ($nextVar != '') && (trim($data) != '') && ($whitePages[$nextVar] == '') ){
			$whitePages[$nextVar] = $data;

	function startTag($parser, $data){
		global $nextVar;
		switch ($data) {
			case "WP:FIRSTNAME":
				$nextVar = 'wpFirstName';
			case "WP:MIDDLENAME":
				$nextVar = 'wpMiddleName';
			case "WP:LASTNAME":
				$nextVar = 'wpLastName';
			case "WP:FULLSTREET":
				$nextVar = 'wpAddressFullStreet';
			case "WP:CITY":
				$nextVar = 'wpAddressCity';
			case "WP:STATE":
				$nextVar = 'wpAddressState';
			case "WP:ZIP":
				$nextVar = 'wpAddressZip';
				$nextVar = 'wpBusinessName';
			case "WP:TYPE":
				$nextVar = 'wpPhoneType';
			case "WP:CARRIER":
				$nextVar = 'wpCarrier';

	function endTag($parser, $data){

	$xml_parser = xml_parser_create();
	xml_set_element_handler($xml_parser, "startTag", "endTag");
	xml_set_character_data_handler($xml_parser, "contents");

	$fp = fopen($url, "r");
	$data = fread($fp, 80000);

	if(!(xml_parse($xml_parser, $data, feof($fp)))){
		die("Error on line " . xml_get_current_line_number($xml_parser));


	return $whitePages;


Since the WhitePages API requires numbers to be in 10 digit format, I’ve also got a tiny function to sanitize a number for this format.

function phoneFormatTenDigits($number){
	// takes numbers like +14565551337, or (456) 555-1337 and turns them to 4565551337
	$number = preg_replace('[D]', '', $number); // gets rid of all non-digits
	if( substr($number, 0, 1) == '1' ){
		$number = substr($number, 1); // gets rid of the first digit if it's a 1
	return $number;

If you used this, say thanks by tweeting out this page.

March 20, 2011

Scrub against temporary email addresses

Validating a user’s email addresses is a must, but most developers just pop in the first premade validation function they find without actually evaluating how effective it is.

Most canned functions simply:

  • Check for the @ symbol
  • Check if the domain has a “dot something” at the end

More advanced ones:

  • Check if the domain is actually registered via cURL or PHP functions like dns_get_record and checkdnsrr
  • Check if the TLD exists (against a list of all known ICANN TLDs)
  • Check for existing accounts with the same email, minus periods and pluses (for services like Gmail where bbqsauce@gmail.com, b.b.q.sauce@gmail.com, and bbq.sauce+tastesgood@gmail.com go to the same inbox)

Still, I have never seen a script to filter against disposable email services. Disposable email services allow users to generate a temporary email addresses in a single click. I’ve used mailinator.com over a dozen times to register for a site that I only want to use once. I never have seen a site filter against it.

So here comes Brian to the rescue, giving all you validation junkies a huge list I complied of 119 disposable email domains to check against. If you prefer, you can download this list as a PHP array.

Disposable Email Domains

mytrashmail.com Continue Reading →

January 17, 2011

Crack Masterlock Combinations

Master Lock

This past weekend I created a site that makes it easy to retrieve your forgotten Masterlock combination. If you were to manually attempt every combination, you would have to go through 64,000 combinations. This site uses a known masterlock algorithm to bring the possibilities down to just 80. Not bad?

Check it out:


So why did you REALLY do this Brian?

I wanted to learn jQuery. I’ve found that it’s easiest to learn something new when you have an end goal in mind. Your brain figures out how to fill in the cracks and actually apply the information you’re taking in. I highly suggest this method of learning. It’s worked well for me with PHP, MySQL, HTML & CSS, SEO, and Affiliate Marketing.

December 20, 2010

Local Site Lease

Most small businesses are reluctant to sign up for SEO services. They really don’t know what it is, it’s hard to prove ROI, and typically have a pushy sales force repping it. I’ve seen way too many charlatans armed with meta tags sell overpriced and over promised services. Hell, I probably get two calls a week from firms trying to sell me (a guy who writes about SEO) services, guaranteeing me high rankings for whatever terms I want.

Rent Local Websites

There had to be a better way to sell SEO. A way that had instant gratification, traction, and clear ROI. I started Local Site Lease in early 2009 to do just this. We optimized tons of local domains for the catering, landscaping, and snow removal industries, pushing them to the first pages for targeted searches. Throw in some link building, a nice WYSIWYG editor, and we’ve got a recipe for success. Companies then rent a site for their geographic area and industry that already had high rankings and Google juice.

We’re actually looking for a motivated developer to work on upgrading our old system (wow, I’m calling it old and it’s only been two years since it launched) with some of the new bells and whistles to hook in automated link building. If you’re that person, shoot me an email with some of your experience.