Why Facebook will never catch up to Google

I don’t think Facebook will ever catch up with Google, personally.  Maybe FB knows what everyone “likes” and can sell ads, but Google has equally good data on users.
More than that, they bought all kinds of dark fiber after the dot com bust, created shipping container data centers conveniently located at many of the internet’s peering points, and makes their own servers for mammoth processing and storage capacity.  They are 10 years ahead of FB
And it culminates with this (and I want one!) …

I don’t think Facebook will ever catch up with Google.  FB knows what everyone “likes” and can sell ads, but Google has equally good data on users and also sells ads.  FB knows what people are talking about at any given moment while Google knows what people are interested in and searching for.   Call this one even.

But for years, Google was buying dark fiber on the cheap after the dot com bust.  They’ve created shipping container data centers conveniently located at many of the internet’s peering points.  They’ve created their own servers for mammoth processing and storage capacity.  They are 10 years ahead of FB in hardware and physical infrastructure.

And now this: Google unveils pricing, rollout strategy for high-speed Internet service

Facebook is trendy and users could decide FB is no longer cool at the drop of a hat (though I admit it’s far stickier than that, considering they have years of my pictures and history in a timeline).  Google, on the other hand, is building physical infrastructure in our country, stuff that people will rely on every day of their lives.  It’s the ultimate toll road.

And that’s why Google’s market cap is 4X Facebook’s (and I didn’t even mention Android).

Edamame vs. the Sago Palm

The choice is pretty easy, if you ask me.  I hate sago palms!

Edible landscaping can look just as pretty as decorative shrubs with the additional benefit of yielding several pounds of fresh edamame for my girls.  The soil was improved, too, thanks to the beans fixing nitrogen in the roots.  I just added pepper plants to follow the beans, I’ll mulch them to cover the dirt, and next we’ll see a flourish of beautiful  red, yellow, orange, and green sweet peppers!

I think this picture says it all!  Edible landscaping for the win!


The Driveway Strawberry Patch

Edible landscaping is the way to go. I turned a patch of full sun nothing alongside the driveway into a strawberry patch. Not only does it look great, but my girls get organic strawberries all summer long!

edible landscaping driveway strawberry patch

edible landscaping driveway strawberries

Red Pen and Comments in the Margin for your UI

Do you remember how your High School English teacher graded your papers?  Mine all used red pen and circled things and wrote comments in the margin.  I still do this today when I write something important.  I print a copy, grab a red pen, and turn into a ruthless editor on the lookout for just a few simple things, like using fewer words.

But red pen and comments in the margin doesn’t only apply to writing.  You can apply the same principles and concepts to a user interface.  Take a screenshot of your application, print it out, and find yourself a red Bic.  There’s something special about writing on and drawing over an image of your application because it’s something you probably never do.  Editing a screenshot in Photoshop is good, too, though sometimes not as satisfying.

Working example

Below is a before and after screenshot of a single sidebar in FoodHub Pro that shows my Red Pen and Comments in the Margin thinking.  My software is constantly evolving and improving, and there’s no need to let ego get in the way of a great UI.  It might be that this sidebar could be refined further if we find that users don’t actually need all of the widgets.

The “After” image has fewer words, fewer lines, no distracting headers, and is shorter overall with no loss of functionality.

Use a Red Pen and Comments in the Margin and let me know how your UI turns out.  I’d love to see more before/after examples.


FoodHub Pro sidebar with "red pen and comments in the margin" editing

#1:  Use fewer words

How many times have you heard someone explaining something and they said “What that means is …”  These words don’t say anything.  Just say what it means, don’t preempt.

What that means is be thrifty with words.”

The first four words mean nothing and the last four mean everything.  Take your red pen and cross through half of that sentence.

What words can I cut from my sidebar?  ”New Purchase Order” and “Choose a grower …” can be concisely written as “New PO for grower …”  That’s a 33% word discount!

#2:  Avoid clutter

Don’t make me think, don’t make me read, and especially don’t hide the few words I must read beneath words I want to ignore.

The headers in my sidebar have no purpose other than to be bigger and bolder than the words that have meaning, like the “From” and “to” labels and “Show only” which implies filtering capability.

#3:  Remove stuff

Do we really need headers?  Headers are generally meant to delineate blocks of stuff, which I think it particularly well suited by wells.  Headers are big, bold words that aren’t important.  They are too tall.  Wells, on the other hand, provide excellent delineation of things and implies depth on a page.   With fewer meaningful words remaining in a well, the purpose of the widget becomes obvious and you don’t need a header to explain what it is.

Are there any form fields that aren’t really needed?  Our customers don’t change business models very often (read: never), which means the type of Purchase Order created never changed.  We tucked that option away on a config screen and dropped it from our form.  It simply wasn’t needed.

The Results Have Been Measured

Without any loss of functionality and with an immeasurable increase in clarity and simplicity, we can measure results by counting what remains.

  1. 30% of words removed
  2. 100% of tall and bold headers removed
  3. 100% of bold form field headers removed
  4. 0% change in distinct widgets with wells replacing horizontal lines
  5. 0% loss of functionality
  6. Increased clarity and simplicity:  immeasurable

Red Pen and Comments in the Margin works as well for interface design as it did for my old English teacher.  It cuts through clutter and simplifies by eliminating anything that doesn’t directly and succinctly address the task at hand.  Everything in the design is subject for removal, from redundant or unnecessary words to unused elements to the use of white space.  Each item in a design should fight for its life because a good editor always has a red pen handy.

It’s simple math

Gardening and edible landscaping serves up some incredible meals.


edible landscaping gardening local seafood

How to send asynchronous requests in PHP

It’s easy to make asynchronous calls in PHP with just a little bit of HTTP header knowledge and some library code around PHP sockets.

This technique is useful when posting requests to your own server for bits of logic you’d like to run in the background.  If you don’t control the endpoint, you might not be comfortable with some of the limitations, such as the inability to read anything from the response.  So, you couldn’t post data to a webservice and receive an HTTP 200 OK response and certainly not an ID for an object newly created by the service call. Any bad IP address would give you an error and you’d also get an error if your socket couldn’t connect. This level of error handling might be sufficient for what you need.

For best performance, use IP addresses instead of DNS entries to prevent the need for look-up and resolution.

For fire and forget stuff, this is the bees knees:

(Please ignore my class definition and Controller superclass. This is actual working code from my CodeIgniter application where I scratched this out as a proof of concept)

class Scratch extends SQ_Controller {

    function Scratch() {

    function index() {

        echo "PHP Async Test...

        $params = array(
            "one" => "111111",
            "two" => "22222",
            "three" => "33333",
            "four" => "44444",
        $this->curl_post_async("", $params);

    function longone(){

        $one = $_POST["one"];
        $two = $_POST["two"];
        $three = $_POST["three"];
        $four = $_POST["four"];

        echo uniqid("You won't see this because your PHP script isn't waiting to read any response");

        // put some long delay in here, so you can see how quickly the async requests returns

        // and the proof that something actually happens...  write out the HTTP params that were sent over the wire
        $fp = fopen('/PATH/TO/YOUR/DIR/FOR/OUTPUT/data.txt', 'w');
        fwrite($fp, $one);
        fwrite($fp, $two);
        fwrite($fp, $three);
        fwrite($fp, $four);


    function curl_post_async($url, $params = array()){

        $post_params = array();

        foreach ($params as $key => &$val) {
              if (is_array($val)) $val = implode(',', $val);
                $post_params[] = $key.'='.urlencode($val);
            $post_string = implode('&', $post_params);


            $fp = fsockopen($parts['host'],
                $errno, $errstr, 30);

            $out = "POST ".$parts['path']." HTTP/1.1\r\n";
            $out.= "Host: ".$parts['host']."\r\n";
            $out.= "Content-Type: application/x-www-form-urlencoded\r\n";
            $out.= "Content-Length: ".strlen($post_string)."\r\n";
            $out.= "Connection: Close\r\n\r\n";
            if (isset($post_string)) $out.= $post_string;

            fwrite($fp, $out);

A few rules of business and travel

Business Rule #17432: When travelling on business, work!  There are no interruptions.  There are no kids demanding attention.  It is quiet and it’s the perfect time to focus.  There is no one to answer to about anything, so open the laptop, turn off the TV (why it is even on?), and get to work.

Business Rule #9813: Unless your job requires you to schmooze clients and ply them with liquor, don’t drink.  Not only does it impede Business Rule #17432 above, but the last thing you need is to be hungover during the big conference the next day or not as quick as you’d like to be.  Get to bed early and hit a home run while you’re away.  You’re away from your family, you are sacrificing something, so make it worthwhile!

And this is just a suggestion, but try to get the elite hotel room: 1337 (for hackers only)


Never let a consultant handle your core business

From I, Cringley:

In Minneapolis, Best Buy is known as a body shop.  While they have something like 1000 IT workers, most of them are temporary contractors.  They come and go.  The number of IT people who are Best Buy employees is very small.  Too few to effectively set direction or do things well.  Best Buy depends on an army of consulting firms to do its IT planning and projects.  They do what they are asked to.  Unfortunately there is a big disconnect between what the business really needs and what IT is doing.

Never let a consultant handle your core business.  Every retailer needs to be in the IT business.  Walmart pioneered IT for retailers, what, 40 years ago?  All Best Buy had to do is follow.

Braintree’s customer support is 1st class

Braintree — an online payments processor — aims to have a developer-friendly API for integration and touts excellent customer service as one of their strengths.

I have been on the phone with these guys several times this week as I integrate our subscriptions at GreenWizard more tightly with Braintree for better reporting. Every interaction with the support staff at Braintree has been quick, pleasant and helpful, and each episode left me happy to have chosen Braintree as our payment gateway.

BT guys, if you’re reading this, feel free to use this as a happy customer testimonial. Keep up the good work. Your sandbox is also a pleasure to work with (unlike a major gateway who’s name rhymes with paypal).

Get the latest subversion revision number with Bash

Here’s  a quick one-liner you can use in Bash to get the latest subversion revision number from your present working directory:

sed -n '4p' .svn/entries

Use backticks to assign it to a local variable you can use when making a build (say, a zip archive of a website or other type of artifact you might want to create):

version=`sed -n '4p' .svn/entries`

Switch to our mobile site