Atlantic Business Technologies, Inc.

Author: Atlantic BT

  • Think Like An Internet Marketer: Silver Bullets And Barking Dogs

    Ccathedral vs. BazaarBuilding my first web site (FoundObjects.com) in 1999 presence was half the battle. Creating a site was no small challenge. Everyone wanted $5,000 to write basic HTML and we didn’t have $500 much less ten times that. I used some precious cash to buy a book and learned how write HTML.

    There was a problem. HTML structured the page but didn’t fill it with copy or images. Each time I learned one skill two more that needed learning popped up. Web development challenge in these early days centered on finding people willing to help for a reasonable amount of money or learning how to DIY (do it yourself). We’ve come a way since 1999, but some things don’t change. Anyone can have a website only a few will understand how to make money online.

    You Get What You Pay For And Web Development Costs Are Going Up
    In 1999 presence was the challenge. In 2012 presence is assumed. Once everyone has an Internet marketing presence competition moves from presence and engineering to the battle for hearts, minds and advocacy.

    Atlantic BT Think Like An Internet Marketer HeartFighting for hearts, minds and advocacy requires different skills. Internet marketing may be the most engineering-like marketing thanks to a sea of behavior and heuristic information, but cutting clutter to make strangers love your company, brand or product is as much business therapy as business.

    As web development business therapist we see common mistakes such as:

    • Search For Silver Bullets
    • Know Thyself To Know Others
    • Barking Dog Marketing
    • Cathedral vs. Bazaar

    Stop Silver Bullet Search
    We believe in the quick fix even when life teaches otherwise. The search for silver bullets is distracting and bleeds our most valuable asset – TIME. Reject quick fixes and instant millions. People do win the lottery, but their winning never improves your odds. “Win the lottery” isn’t an effective Internet marketing plan. Anyone who tries to sell you a silver bullet or lottery ticket should be avoided. Creating greatness is HARD and requires sweat, tears and treasure.

    Know Thyself To Know Others
    Thinking Like An Internet Marketer values the web for what it can and can not accomplish. No web site makes a company’s communication more organized or clear. The web is a huge guassian blur making pointed and sharp ideas, potentially dull and confusing. How would you rate your knowledge of your company’s character on a ten point scale? If you answer anything below a 8 then you have introspective work to do. If your company, brand or product is blowing from pillar to post then, as Gertrude Stein famously said of Oakland, “There is no there, there.” Know yourself BEFORE you create any site, blog, social media or email campaign. Compare each effort in some meaningful and measurable way to your company’s core values.

    Barking Dog Marketing
    Do you walk toward or run away from a barking dog? Barking at visitors has the same impact. Greatness, transparency and honesty are more sustainable and profitable than any short term bark. Barking may improve sales or conversions for a short time, but damage to brand, positioning and long term profits and advocacy may be significant and long lasting. Every day and action matters in the battle for hearts, minds and advocacy. Read Dov Seidman’s great book HOW: Why we do anything means everything. Seidman explains why values and processes are the only things any business truly own.

    Cathedrals vs. Bazaars
    Internet marketers build sand castles. Whatever we create will be gone soon. Building sand castles requires different attributes than constructing Renaissance cathedrals meant to last a hundred years. Thinking like an Internet marketer means organizing work around:

    • Speed
    • Data
    • Creative Use Of Convention (don’t recreate what visitors expect)
    • Team
    •  The Magic 11% (see 1:10:89 Rule)
    • Listening and Leading

    Speed, passion and wrecking what needs ruination means errors, bumps and mistakes happen. If mistakes drive you crazy don’t become an Internet marketer. Mistakes are a part of the cost of being relevant in a constantly shifting space such as Internet marketing. Perfection isn’t a sustainable Internet marketing strategy. Speed, being data-centric and listening more than you talk work better. Understanding the difference between creating sand castles and accepting input from the bazaar instead of laying stones to live for a hundred years is why “Thinking Like An Internet Marketer” requires a paradigm shift. Perfectionism is too expensive for sand castle builders working in the world’s largest bazaar dodging silver bullets and barking dogs.

  • WordPress – Promote a Post in a Widget

    Here’s a WordPress plugin that will allow you to feature a single item in a widget, until you tell it to automatically expire.

    As taken from the readme file:


    Description

    Simple widget to display (promote) a specific post/page. Provides a list of from all public post types to choose an entry to promote until a specified date. When this “promotion” expires, you can either display a static message or use another post/page instead.


    Installation

    1. Upload the plugin folder to your plugins directory /content/plugins/ directory
    2. Activate the plugin through the ‘Plugins’ menu in WordPress
    3. Add the Widget “Promoted Content” to a sidebar

    Frequently Asked Questions

    What are the options?

    • Title: The displayed widget title – leaving it blank will use the post title (if you override the default, see Hooks)
    • Feature Expires: until what date (YYYY-MM-DD) to show the promoted post; after which fall back to the default
    • Feature Post: choose from the dropdown of public post types to promote
    • Default: display this entry instead after the expiration
    • Trim summary to: if no excerpt is provided, shorten the post content to this number of words

    Note that you can select the most recent post from the dropdown options.

    How can I change the defaults?

    If you don’t specify certain options, the widget will use builtin defaults. Override these with the following hook:
    [php]
    add_filter(‘abt_promo_post_defaults’, ‘YOUR_HOOK’);
    [/php]

    where YOUR_HOOK is a function that takes an array and returns the following settings:

    [php]
    function promo_widget_defaults($settings){
    return array(
    #’title’ => ‘Latest From MY SITE’, // disable to use post title
    ‘display’ => ‘Check out our new video! Credit goes to … <p><a class=”archive” href=”/category/news”>News Archive</a></p>’,
    ‘url’ => ‘#’,
    ‘image’ => ‘<img src=”‘ . get_stylesheet_directory_uri() . ‘/images/g_video.jpg” alt=”Latest from MY SITE”>’,
    );
    }
    [/php]

    What else can I use?

    Two static methods are available for “embedding” the widget in code – basically just the internal processing used by the widget function.

    abtcore_feature_widget::display_promo($args, $before_title, $after_title) 

    which uses the following

    abtcore_feature_widget::get_promo($args) 

    to get either the promoted post or the default. $args will contain an array of the widget options (title, expire, promo, default, trim).

    Function get_promo will return an array of (title, display, url, and image) to display_promo where it gets combined with the defaults from the hook to output the widget HTML.

  • How to Get a List of your Drupal Modules

    Has a client ever asked you “So what Drupal modules are we using?” With this step-by-step guide, you can now generate a list in a nice table of all of the Drupal modules a website is actively using. This jQuery snippet will help you to generate a table with links to the project page for each Drupal module.  Sign up here to receive more great tips delivered straight to your inbox, like this Drupal Module list generator.

    1. Go to http://yoursite.com/admin/modules
    2. Run the following javascript in your Console (Firebug, Developer Tools, etc – F12)

    [js]
    (function($, D, boxid){ /*–start–*/var $checkboxes = $(‘:checkbox’)
    , $checked = $checkboxes.filter(‘:checked’)
    , $dom_render_to_div = false
    ;
    console.log($checked.length, ‘enabled modules’);

    // clear old version
    $(‘#’+boxid).remove();

    var render = function(o, renderfn){
    renderfn(o);
    };
    var render_to_console = function(o){
    console.log(o.i, ‘Section:’ + o.s, ‘Module:’ + o.l, o.v);
    };
    var render_to_div = function(r){
    if( false === $dom_render_to_div ){
    var $container = $(‘<div id=”‘ + boxid + ‘” class=”debug”><h3>Active Modules</h3></div>’);
    $container.append(‘<table></table>’).append(‘<div class=”clearfix”>Copy Above</div>’);
    $container.css({
    ‘background-color’: ‘#FFFFFF’
    , ‘left’: ‘20%’
    , ‘padding’: ‘5%’
    , ‘position’: ‘absolute’
    , ‘top’: ‘20%’
    });

    $(‘body’).append($container);
    $dom_render_to_div = $container.find(‘table’);
    $dom_render_to_div.append(‘<tr><th>i</th><th>Section</th><th>Label</th><th>Version</th></tr>’);
    }
    $dom_render_to_div.append(‘<tr><td>’ + r.i + ‘</td><td>’ + r.s + ‘</td><td><a href=”https://drupal.org/project/’ + r.id + ‘”>’ + r.l + ‘</a></td><td>’ + r.v + ‘</td></tr>’);
    };

    $checked.each(function(i,o){
    var $o = $(o);
    var $row = $o.parents(‘tr’);
    var section = $o.parents(‘fieldset’).find(‘legend’).text();
    if( 7 == D ) section = section.replace(/Hide /i, ”);
    var label = “” + $row.find(‘td:nth(1) label’).text();
    var version = $row.find( 7 == D ?’td:nth(2)’ : ‘td.version’ ).text();
    var iden = $row.find(‘:checkbox’).attr(‘name’).match(/][([^]]+)]/)[1];

    var row = {“i”: i, “s”: section, “l”: label, “v”: version, “id”: iden};

    render(row, render_to_div);
    });
    /*–end–*/ })(jQuery, 7, ‘module-list-debug’);
    [/js]

  • The “Complete” How-to Set Up XAMPP on Windows

    If you run PHP locally on a Windows machine, you’re probably using XAMPP.  By default, you put all your files in the xampp directory (htdocs) to make things work.  However, if want a different directory structure (i.e. under “My Documents”) you can set up domain or subdirectory aliases.

    The following steps are the mostly-complete guide to setting up XAMPP: set alternate folders/domains/subdirectories, enable “missing” extensions, and let it play nicely with VisualStudio’s local IIS.

    1. Download zip version
    2. run setup_xampp.bat to fix directories
    3. to access your local dev like `http://ALIAS.localhost:81/whatever.php`, in apacheconfextrahttpd-vhosts.conf add your custom directories like: (note port 81 from step 7)
      [php htmlscript=”true”]

      <VirtualHost *:81>
      ServerAdmin YOUR@EMAIL.COM
      DocumentRoot “/Relative/Path/To/LocalFiles”
      ServerName ALIAS.localhost
      ServerAlias www.ALIAS.localhost
      ErrorLog “logs/ALIAS.localhost-error.log”
      CustomLog “logs/ALIAS.localhost-access.log” combined

      <Directory “/Relative/Path/To/LocalFiles”>
      Options Indexes FollowSymLinks
      AllowOverride All
      Order allow,deny
      Allow from all
      </Directory>
      </VirtualHost>
      [/php]

       

    4. Update your hosts file (C:WindowsSystem32driversetchosts) accordingly: 127.0.0.1 ALIAS.localhost
      (added bonus: wildcards in hosts file (untested))
    5. OR, instead of #3 and #4, configure subdirectory aliases in xamppapacheconfextrahttpd-userdir.conf, which will let you access your local dev like `http://localhost/ALIAS/whatever.php`
      [php htmlscript=”true”]
      <IfModule alias_module>
      # ===== Description of the following
      Alias /ALIAS “/Relative/Path/To/LocalFiles”
      # Access control, etc
      <Directory “/Relative/Path/To/LocalFiles”>
      AllowOverride All
      Options Indexes FollowSymLinks
      Order allow,deny
      Allow from all
      </Directory>
      </IfModule>
      [/php]
    6. Allow “missing” extensions by uncommenting dll line in xamppphpphp.ini
    7. If also have IIS (VisualStudio) on same computer, you’ll need to change the ports (you can use other numbers)
      1. in xamppapacheconfhttpd.conf — change `Listen *:80` to `Listen: *.81`, `ServerName localhost:80` to `ServerName localhost:81`
      2. in xamppapacheconfextrahttpd-ssl.conf — change `Listen 443` to `Listen 442`
      3. ignore the message in xampp-control that says it started on port 80 (that’s hardcoded)
  • SEO – Martin’s Tips & Free White Paper

    Martin Marty Smith Atlantic BT Marketing DirectorFree SEO Evaluation White Paper (coming soon)
    Writing a Free SEO White Paper to become the first step in our Free SEO Evaluation process. Our Atlantic BT Free SEO White Paper will share knowledge learned during a week of training in California with leading SEO expert Bruce Clay and over twenty years of combined content marketing experience on million dollar ecommerce and B2B sites by members of the talented Internet Marketing team I have the honor to lead (Martin’s Bio and LinkedIn) at Atlantic BT.

    Look for the Atlantic BT SEO White Paper soon. Today’s post shares SEO Tips prompted by a customer who successfully made SEO low hanging fruit changes and is looking to move his web site to the next level.

    SEO – Martin’s Tips Note

    SEO is a many layered challenge with touch points in site design, site reputation, viral campaigns, PPC (as a traffic generator and source of content research), hosting (site speed is becoming an increasing issue), meta data (particularly page titles), keyword aligned body copy and about fifty other things. We’ve seen tremendous SEO change in the last two years due to the growing influence of social networks. Diving into the middle of such a many layered challenge takes skill, time and a solid understanding of your site and business goals. Here are “best practices” you can implement in your site today to improve organic traffic:

    • Facebook Likes (macro and micro) – Be sure to have the Facebook LIKE button on your home page and on important individual pages such as product pages or key articles AND make sure your counters are accurate to the page the LIKE button is on. I want a macro “reach” counter capable of summarizing LIKES across multiple touch points, but no such tool exists yet (that I am aware of) so make sure your Facebook counters are aligned to pages they are on.
    • Platforms Beat Websites – read my Internet Marketing – Platforms vs. Websites post on ScentTrail Marketing to understand how significantly Internet marketing is being transformed by Web 2.0 and the promise of Web 3.0. As Amazon nears a billion pages in Google’s index understanding the interconnected “platform-yness” of Internet marketing has never been more important.
    • UGC Rules – One of the implications of living in the land of platforms is you can’t create enough content to win keyword wars on your own. You team and content creation budget isn’t big enough even if you have millions. User generated content (UGC) is KEY. Create campaigns that develop community and encourage people to share your site across their social nets (and remember to use the Facebook LIKE button whenever possible). You may want to read my 1:10:89 Rule post too as it explains how magical and rare contributors are. My favorite UGC tools are polls, contests and games. Each UGC tactic has a “best practice” application I will write about in another post.
    • Content, Community and Campaigns THEN Conversions – Living in a platform time means learning SEO stepping stones to success. Each step builds on and contributes to the next. Create a content strategy. We create content strategies with extensive keyword research, something we’ve named “branding keywords”. Branding Keywords maps keywords to business values, buying personas, buyer pain points and potential blue oceans (those keywords not frothy red with competition). This kind of research is a HUGE time commitment (days usually), but it makes your content and campaigns jump off the page. We are working on sharing these steps so anyone who wants to can “brand keywords” (look for our tutorial in about a month). Community can be as little as adding reviews or as much as building out a Facebook environment. Content without community support is a tree falling in the desert with no one to hear it. Campaigns are the “buy one get one free” or the “free white paper” or the “Holiday Sale” language of email and social marketing. You need deadlines, a great offer and compelling presentation across all touch points (site, blog, social, email) to motivate and cut through clutter and buyer apathy. Conversions come because you fire on every step. Any friction such as TRUST and REPUTATION must be fully eliminated (another post for another time). Conversions Key Performance Indicators can be anything including more time on site or increased page views. We like to make conversions some ACTION such as sign up, download or buy.
    • SPEED – Go to Alexa or use a speed evaluation tool. If your site is anything other than FAST redesign it or serve it better or both. Google’s margins erode when pages take too long to load so they will punish your listings for slow response.
    • SPAM – Work in SEO long enough and you can feel hidden SPAM traps. You know exactly how to SEO write to push keyword density without spamming. There are tools that you can use to confirm and help eliminate things like “stop words”, but do this long enough, test enough content and you develop an intuitive feel for what works. If you don’t have such a sense yet read my SEO Writing Tips 1 – 5 on ScentTrail Marketing for a quick crash course.
    • DATA – We are constantly reminded that however much we think we know about SEO we don’t know anything. SEO and the Internet live organically in Real Time. The only things that matter or define SEO success is what is happening now. The good news is there is a sea of data to help cut the cost of the gamble. SEO and Internet marketing are always gambles, but informed ones perform better and better over the long run. Every now and again we re-read Black Swan by Taleb just in case we think we can finally predict Internet marketing’s future (no one can and arrogance goes before a huge fall in our Internet marketing experiences).
    • Snake Oil – In another much younger life I sold soap for P&G, an honorable straight forward job. SEO is full of people who project confidence when they should have NONE. They use words they don’t understand but do so in a way that makes listeners confused or anxious. Here is a quick Snake Oil test. Ask a prospective SEO how they would change your home page title, the most important meta copy on any page. If they answer anything other than, “I have no idea,” RUN FOR THE HILLS. Existing sites are modeled and indexed in Google. Change is expected and accepted WITHIN parameters, within modeled limits. First rule of SEO is DO NO HARM. Anyone who, at a moment’s notice, creates a SEO plan for your site is dangerous and should be avoided. Avoid snake oil salesmen since the first rule they violate is DO NO HARM and harm within Google’s Elephant Memory Brain is forever (or a very long time anyway). Another good Snake Oil test is anyone who says, “I can get you #1 on X keyword in Y time.” The only way to achieve such a mission is to wear a black hat, to game or trick Google. Never game or trick Google. The math always wins and the over/under doesn’t favor such a tactic (what you stand to gain vs. lose). A former CFO told me, “I want you to make something happen on Google by the end of the week.” Something is happening on Google all the time, I had to explain, but only BAD things can happen for sure by the end of the week. Hard concept for a CFO to grasp.

    Keep the faith, keep creating content and find a way to move your “site” to a platform generating UGC and the magic Google Juice it provides is the most important SEO lesson once you are past the low hanging fruit of solid meta, body copy, tags and purple cow link bait.

    Hope these ideas have helped. Look for our Free SEO White paper and more on Branding Keywords soon. If you would like to be kept up-to-date with the latest at Atlantic BT (never share our list and don’t spam) use the link below to stay in touch.

    Yes, Please Add Me To Your Think Like An Internet Marketer Email List.

    Martin
    Director Marketing

    Age Of The Platform Book by Simon

    Suggested Reading:

    Phil Simon’s new book

    The Age of the Platform

  • WordPress Debugging – “Doing It Wrong” warnings

    WordPress recently added some “helpful” error messages warning you when you’re not doing certain things correctly. Specifically, adding scripts and/or styles incorrectly using the wp_enqueue_* function.

    However, even though it appears they tell you where things went wrong (via trigger_error), it actually just points you to the _doing_it_wrong function.

    Fortunately, those hook-crazy developers threw us a bone in that function:
    [php]
    do_action( ‘doing_it_wrong_run’, $function, $message, $version );
    //
    [/php]

    Now we can figure out the offender ourselves with a hook:
    [php highlight=”13″]
    /**
    * Because new WP 3.3 “doing it wrong” warnings don’t really tell you where you screwed up…
    * @param string $function The function that was called.
    * @param string $message A message explaining what has been done incorrectly.
    * @param string $version The version of WordPress where the message was added.
    */
    function abt_doing_it_wrong_helper($function, $message, $version){
    $before = <<<EOD
    <strong>$function:</strong> v$version
    EOD;
    debug_whereat(3, 5, $before);
    }
    add_action( ‘doing_it_wrong_run’, ‘abt_doing_it_wrong_helper’, 10, 3 );
    //
    [/php]

    And the helper function for printing debug_backtrace (use your own flavor):
    [php]
    /**
    * Pretty-print debug_backtrace()
    * @param int $limit {optional} when to stop printing – how many recursions up/down
    * @param int $skip {optional} when to start printing – how many calls to skip over
    * @param string $before {optional} extra html to print before the table, inside debug container
    * @param string $after {optional} extra html to print before the table, inside debug container
    * */
    function debug_whereat($limit = false, $skip = false, $before = ”, $after = ”){
    static $debug_whereat_counter; if( !$debug_whereat_counter) $debug_whereat_counter = 0;
    $uid = $debug_whereat_counter++;
    ?>
    <div class=”debug trace”>
    <?php echo $before; ?>
    <table>
    <thead><tr>
    <th id=”th-index-<?=$uid?>”><i>nth</i></th>
    <th id=”th-line-<?=$uid?>”>Line</th>
    <th id=”th-file-<?=$uid?>”>File</th>
    <th id=”th-method-<?=$uid?>”>Method</th>
    </tr></thead>
    <tbody>
    <?php

    $backtrace = debug_backtrace();
    if( $skip ) $backtrace = array_slice($backtrace, $skip);

    foreach($backtrace as $index => $trace){
    //force quit
    if($limit !== false && $index == $limit){
    ?>
    <tr><td colspan=”4″><em>—– FORCE STOP RECURSION —–</em></td></tr>
    <?php
    break;
    }

    ?>
    <tr class=”trace-item”>
    <th headers=”th-index-<?=$uid?>”><?=$index?></th>
    <td headers=”th-line-<?=$uid?>” class=”line”><?=$trace[‘line’]?></td>
    <td headers=”th-file-<?=$uid?>” class=”file”><?=$trace[‘file’]?></td>
    <td headers=”th-method-<?=$uid?>” class=”method”>
    <code><?=$trace[‘function’]?></code>
    <?php
    if(!empty($trace[‘args’])){
    echo ‘<br />’;
    while(!empty($trace[‘args’])){
    ?> {<i><?php print_r(array_shift($trace[‘args’]) ); ?></i>} <?php
    }// while !empty $trace[‘args’]
    }
    ?>
    </td>
    </tr>
    <?php
    }
    ?>
    </tbody></table><?php echo $after; ?></div>
    <?php

    }// function debug_whereat
    [/php]