New Site:

Together with Steve Salloway of Davis Advertising, I launched Virtual Ad Club today.  The site is an online community for advertising professionals, inspired by the old meatspace group, the Worcester Advertising Club.

The site will cover general advertising, account services, martech and media ends of the business, as well anything else that generally fits under the general category of advertising.

The site is a WordPress backend, with BBPress forums attached.  This is the first time in a while I’ve worked with BBPress and I must say it has come a long way.  I’m not certain it’s everything vBulletin was, but I think in this case it’s going to fit the bill nicely.

As a bonus, I’ll be writing the occasional bit on martech, which I’m really looking forward to.

If you’re an advertising professional, Virtual Ad Club is the place for you!

Google Will Mark Non-HTTPS Websites as Insecure

Mark Cahill can migrate a Wordpress site from http to https for you

Google, the gift that keeps on giving.

Like that kid that reminds the teacher she didn’t assign any homework before the long weekend, Google again costs website owners money and wastes their time. So now site owners like me need to migrate a WordPress site from http to https.  What are we to do?

Google announced some time ago that their Chrome browser would start marking all sites that do not use the https protocol. as insecure this July. Further, SearchLand has been reporting that for sometime Google’s top search results have returned more than 50% https sites.  In other words, their algorithm is favoring HTTPS sites.

Mark Cahill can convert a wordpress site from http to https for youFor site owners, this means they’ll likely need to buy SSL certificates, install them, and convert, then debug, their sites to get the coveted padlock showing in the Chrome browser.

In a word, this really stinks for owners of large, non-ssl sites.  Like me.

You see, back in the day, we said SSL was only required if you were doing ecommerce and we built our sites accordingly.  Hence we’ve got massive sites like that have gig upon gig of content laden with possibly externally linked images, that won’t pass for HTTPS.


So how do you migrate a WordPress site from http to https?

  1. Setup the cert, do the redirects, import all external image content (or remove it if there are copyright issues), setup the site again in webmaster tools, then hope the change doesn’t roll the dice again on your current search engine rankings.  See you in a couple months…
    I should note here, the problem is external images, not adding the cert.
  2. Ignore it and let Google make an example of you.
  3. Mark Cahill can migrate a wordpress site from http to https for youHire an outsourced team of monkeys to manually find download and replace the images and hope they don’t screw up.
  4. Hire a real engineer to do the migration programmatically.

I was able this morning to update to use the new protocol, and was able to get a script to move the images and rewrite the links in my wordpress setup.  That’s a big thing, as the site had over a thousand posts, with a similar number of images that had been linked from around the web.  As you’ll see, I’ve now got the padlock showing next to the URL in the browser.  Then I did the same thing for and this afternoon I’ve got two more sites on tap.

The short version is this:

The change to SSL/HTTPS can be done, but it’s really not a do it yourself thing if you’ve got externally linked images and you aren’t an engineer.   I can migrate a WordPress site from HTTP to HTTPS quickly and easily at an attractive price.  Contact me

New Site:

Wordpress site with woocommerce Paypal Adaptive integration

I haven’t been doing a lot of freelance over the past couple years, but I have just finished a great site called – a WordPress site with Woocommerce Paypal Adaptive integration.

First off, I should explain that Carnival glass is moulded or pressed glass, always with a pattern and always with a shiny, metallic, ‘iridescent’ surface shimmer. It is highly collectible, and is generally broken down into “antique” from around 1900 to the 1950’s and “contemporary” which is anything up to present day.

The site is built on WordPress, using the venerable Woocommerce ecommerce engine for shopping cart.  The site functions as a marketplace, so payments are setup to go directly to different owners, using a neat Woocommerce with Paypal Adaptive integration.  It’s also making use of the USPS API to pull real time shipping prices.

The Woocommerce Paypal Adaptive integration allows the site to take payments and provide a portion of the sale price to the site, and deposit directly into the account of whichever seller owned the piece.  Basically a marketplace. with a multitude of sellers, but without the hassle of disbursing payment manually.

Challenges on the project included some issues with shipping classes from the post office, basically Woocommerce was grabbing the first price it saw, instead of the preferred Priority Mail 2 Day price.  Another major issue was our need to reconfigure the search function to return specific results, rather than the standard “fuzzy” results.

Since initial launch, we’ve been working on fine tuning and SEO.  I’m pleased to report that the SEO results on individual products is excellent.  The main keywords for the site are an ongoing project.

I’ve got to say this was one of the most enjoyable web development projects I’ve done in quite a while. Great customer, interesting requirements and a beautiful end product.

Give it a check and enjoy!


Communications Nightmare

I noticed the other day that rather than becoming easier, corporate communications have become significantly harder. The dream has always been one universal way to contact people and share information that allows everyone who needs it to get it, while maintaining corporate security.  Instead of creating this, we’ve ended up with a Tower of Babel in which we are forced to seek out and actively watch numerous applications.

For example, on any given day these sites/apps/programs for Corporate Communications

  • The Slack Channel for my local dev team
  • The Slack Channel for my global dev team
  • Skype to converse with a specific team in India
  • What’s App for management discussions
  • Google Hangouts to interact with the Customer Support Team in India
  • Corporate email
  • Text from a handful of management types who don’t like any of the previous options

The Corporate Communications NightmareThere are more that I use less frequently.  My point is that rather than simplifying communications over time, we’ve complicated them, and in doing so, increased the likelihood that important messages will be missed.

The problem is that rather than committing to that one “killer app” which has failed to materialize, we’ve Balkanized our communications and compartmentalized our information.

What’s needed?  I’d say that one “killer app”, but time has shown that’s not the solution.  Better, we need to be smarter about what we use.  While it’s nice to let teams choose their apps to help facilitate communications that will work for them, we need to remember that we can also be creating barriers within our organization.

The solution comes down to people making better decisions.  We all need to collectively stop asking “can we” and think more in terms of “should we.”

Just a thought…

Thoughts on Self-Publishing

Self-Publishing Advice from the experience of my first book

Available at

I had the wonderful opportunity to guest lecture at Emerson College this week on the subject of “Self-publishing”.  It caused a bit of retrospection, it being a full year now since I published Blue Ice.

My most important self-publishing advice,  the elephant in the room, as voiced by one of the students:  “If you had it to do again, would you self-publish, or go with a traditional publisher?”

That really gets right to the core of the matter.  Personally, if there were a publisher who was willing to offer an acceptable deal, I’d definitely go with them.  Two words: “Marketing Budget” strike true with me.  I don’t miss having to deal with an agent, having to respond to publishers, etc. and wonder if anything was going to happen.  I do miss having someone who will actually handle the marketing.  Someone who can run ads, etc.

As a new writer, the first and most important task is to get your name and your book out there.  To build readers, to find a market.  Who better to do that than a marketing department.

That said, I can’t imagine myself hat in hand trying to find an agent at this point.  Maybe if one came after me…

Some other general advice that may or not be of use to you if you do choose to self-publish:

  • Find an editor you can work with and hang on to them.  Pay them well, they’re an important team member.
  • Hire a real professional copy editor.
  • Find the best graphic designer you can and pay for your cover design.  REALLY – books are judged by their covers, and you’re not going to get anyone to read your book if you’ve got a crappy cover.
  • Seriously consider putting your book into the Kindle Select program – it will make it available for free reading to Kindle Prime users, and you’ll still get paid $2.99.  More eyeballs is a good thing.



A Surprisingly Good Year

Looking back at 2013 for me personally, I’m amazed at the improvements in my life, and I’d like to both acknowledge and give thanks.  Let’s take a look at the picture of where I was just a scant year ago:

  • Living with my mother after separating from my wife.
  • Didn’t have a steady job.
  • Saw my kids on weekends, if that.
  • Was barred from buying health insurance by the State of Massachusetts (a joy many in the US will come to know in the coming years).
  • Had massive IRS problems.

In general, the outlook was bleak, and people often asked me how I maintained such a positive outlook.  The answer is simple: when when you’re surrounded by problems, it’s easy to find success.  Just start solving the issues, and you’ll quickly start putting together a bunch of games in the win column.

As I sit here at years end:

  • I have a wonderful job working with great people like Slava Brodskiy and David Zakur at Lycos.
  • I have a nice house on a pond where life is wonderful.
  • Both of my daughters are living with me full time.
  • I released my book last May.
  • While I haven’t completely paid off the IRS yet, I have a deal with them and the contents of my checking account isn’t disappearing regularly anymore.
  • I finally got health insurance again in Sept., even if it does get cancelled again tonight via Obamacare.
  • After 15 years I finally own thanks to Kelly Conlin.
  • Re-kindled friendships with old friends like Graham Pettingill, Jay Groccia, Kevin Condon and so many others.
  • Reconnecting with relatives I haven’t seen in years thanks to my cousin Susan Haun.
  • Many wonderful memories of living with my Mom, and the knowledge that my daughters finally have gotten to spend time with her.
  • Finally got to meet Karl Susman face to face after years of friendship via the Interwebs.

There are so many other triumphs, I can’t name them all.  I am utterly thankful, especially to friends like Jim Spencer who helped get me interesting and good paying freelance work, Slava Brodskiy who hire me at Lycos when I needed an opportunity.

The key for me has always been having a network of good friends.  For all of you, I am truly grateful.

There was a post on Facebook “21 Habits of Happy People” and it’s worth all of us taking to heart for the New Year.  My old friend Bruce Wells sums it up wonderfully:

One of the nicest things I had said to me in 2013 was from a co-worker. She recently asked me, “How did I always stay so upbeat?” The question kind of surprised me. I am human, I have bad moments and days. I reflected on the question and answered, “It’s all about attitude. You can decide how you deal with any given moment in your life. I just decide (generally) to have a good day every day”. I thought about the question she asked as I read this article. The article definitely explains this better than I did with my brief answer. Take a few minutes to read this. Absorb what it is saying. Make a commitment to try to live each day by the concepts expressed here. It wont happen overnight. Just continue to work on it day to day and see the results. If we could all work on this the World would become a sooooooooooo much better place. Peace, Love and wishing you an amazing and fabulous 2014.


I couldn’t agree more. Decide to have a good day every day.

Cheers and Happy New Year.

4 Words Make a Major Difference

Just a year ago, I proclaimed my freedom from the Tyranny of the Commute in a post on this blog.  The chief culprit in the absurdly long commutes I’d suffered for over a decade was the incredulously Rube Goldberg style design of the the traffic pattern at the on ramp to Rt. 95/128 north coming from the Mass Pike.  Numerous merges and crossover created an automotive version of a battle royale; a free for all in which everyone lost…

This past July, as a test, Mass Highway made a minor adjustment to the traffic flow.

  1. They reserved the right lane of Rt. 128 for traffic merging on from the on ramp.
  2. The put up a programmable billboard with 2 clear messages, using 4 simple words:
    1. Keep Moving
    2. Merge Later
  3. They painted traffic lines on the on ramp to try to get drivers to merge into a single lane prior to hitting the final on ramp.

20130903_084405The results were astounding.  No traffic backups that I can remember for July or August.  Instead of my normal 1.5 hour commute, it has been taking me an hour, or less.

This morning was the big test.  School is back in session.  The normal backups along the Mass Pike occurred, just after Rt. 495, at the Reservoir, then again just after Rt. 30.  Prior to the change, this would be a clear indicator of at least a 30 minute backup at the tolls.  This morning, not a single car waiting, everyone sailed through.

Oh that this change had happened a decade ago!

Grace Potter and the Nocturnals tear it up at Tanglewood

There is hope for music after all, and it comes in the form of a hippy chick from Vermont

Rock isn’t dead; in fact it turned up at one of the least likely venues, Tanglewood in Lenox, summer home of the Boston Symphony Orchestra on Monday night and it came on the bus that brought Grace Potter and the Nocturnals to town.

From the minute they took the stage, the crowd was on their feet, and they remained that way the whole way through the band’s energetic 2 hour plus show.  From the start, with an up beat “Medicine” off the band’s eponymous 2010 album, Grace had a hold on the crowd.

You like the way she makes you feel
She got you spinning on her medicine wheel
She’s crossing me with magnetic sand
She hypnotize with her mojo hand

– Medicine

The early set was  laced with material off the latest album, “The Lion, The Beast and the Beat”, released in late 2012, with “Never Go Back”, “Timekeeper”, “Keepsake” all featured prominently.

From there, Grace launched into a request for “Treat Me Right”  a song off her first album, released in 2005 entitled “Nothing But the Water”.  Here their jam band roots shown, with a well matured, smoky, sultry version of the song, delivered down tempo.  A thoroughly different treatment than the album, or the earlier faster paced, heavier versions of the song.

Continue reading “Grace Potter and the Nocturnals tear it up at Tanglewood”

Migration from Drupal to WordPress

I’ve been working on migrating a fairly large site from Drupal to WordPress (actually WP is just a middle ground, it’s moving from there to another platform) and noticed a lack of decent information about Drupal to WP migration.  Since I had to put some time in cleaning up MySQL scripts, and working through the move, I thought it’d be a good idea to document the information for anyone who needs to make the migration in the future.

First off, the original Drupal site is at version 6.22 and I’m migrating into WP 3.4.2.

Initial steps:

  1. Get MySQL access to the Drupal site, either command line via SSH or PhpMyAdmin.
  2. Grab a full dump of the DB (yes, you may not need the whole thing, but this way you know you’ve got all the info you might need).  The Drupal db backup module in my case was incapable of backing up this db.
  3. Create a new database on the system you will use for migration and call it “drupal” – in my case I am working locally on my Xampp MySQL db.
  4. Import the db dump into your new database from the command line.  Don’t waste your time trying to use PhpMyAdmin if you’ve got a decent size backup (mine was over 3 gigs).  mysql -u username -p drupal < drupal.sql is the syntax (replace username with your mysql username and be prepared to be asked for the db password).  The import may take a few minutes for a large database. (*note: if you are having trouble getting the import to work, you likely have mysql buffer sizes set too low.  I found this to be the case with the XAMPP install of mysql, but I easily fixed it by editing my.ini via the XAMPP control panel.  I think the innodb_buffer_pool_size setting was the one that did it, but most of the buffers were upped substantially.  You can safely up innodb_buffer_pool_size to about 50% of your system memory.
  5. So now you’ve got your own import of the Drupal database.  Go ahead and create your new WP database if you haven’t already and do your WP install.

Now we’re ready to start migrating data.  First off, I import categories, but I need to warn you: WP requires unique category names, and apparently Drupal apparently does not.  You will most likely need to make sure that you don’t have Drupal Term_Data entries with names that are similar, ie, Immigration and immigration.  Change the names to something unique, like changing immigration to immigration issues and it will work.. Thus, you need to make sure that all the Category names are unique.

This script which I have slightly modified from the original from Lincoln Hawks at did the trick.  I have also added user import, which wasn’t in the original.  My WP database name is wptest and the drupal db is named as noted before “drupal”.

TRUNCATE TABLE wptest.wp_comments;
TRUNCATE TABLE wptest.wp_links;
TRUNCATE TABLE wptest.wp_postmeta;
TRUNCATE TABLE wptest.wp_posts;
TRUNCATE TABLE wptest.wp_term_relationships;
TRUNCATE TABLE wptest.wp_term_taxonomy;
TRUNCATE TABLE wptest.wp_terms;

INSERT INTO wptest.wp_terms (term_id, `name`, slug, term_group)
d.tid,, REPLACE(LOWER(, ‘ ‘, ‘-‘), 0
FROM drupal.term_data d
INNER JOIN drupal.term_hierarchy h

INSERT INTO wptest.wp_term_taxonomy (term_id, taxonomy, description, parent)
d.tid `term_id`,
‘category’ `taxonomy`,
d.description `description`,
h.parent `parent`
FROM drupal.term_data d
INNER JOIN drupal.term_hierarchy h

wptest.wp_posts (id, post_date, post_content, post_title,
post_excerpt, post_name, post_modified)
n.nid, FROM_UNIXTIME(created), body, n.title,
REPLACE(REPLACE(REPLACE(REPLACE(LOWER(n.title),’ ‘, ‘-‘),’.’, ‘-‘),’,’, ‘-‘),’+’, ‘-‘),
FROM drupal.node n, drupal.node_revisions r
WHERE n.vid = r.vid

INSERT INTO wptest.wp_term_relationships (object_id, term_taxonomy_id)
SELECT nid, tid FROM drupal.term_node;
UPDATE wp_term_taxonomy tt
SET `count` = (
SELECT COUNT(tr.object_id)
FROM wp_term_relationships tr
WHERE tr.term_taxonomy_id = tt.term_taxonomy_id

INSERT INTO wptest.wp_comments (comment_post_ID, comment_date, comment_content, comment_parent, comment_author, comment_author_email, comment_author_url, comment_approved)

SELECT nid, FROM_UNIXTIME(timestamp), comment, thread, name, mail, homepage, status FROM drupal.comments;

UPDATE `wp_posts` SET `comment_count` = (SELECT COUNT(`comment_post_id`) FROM `wp_comments` WHERE `wp_posts`.`id` = `wp_comments`.`comment_post_id`);

UPDATE wptest.wp_posts SET post_content = REPLACE(post_content, ”, ”);

UPDATE wptest.wp_posts SET post_content = REPLACE(post_content, ‘”/sites/default/files/’, ‘”/wp-content/uploads/’);
INSERT IGNORE INTO wptest.wp_users SELECT NULL AS ID, NAME AS user_login, SUBSTRING(MD5(RAND()) FROM 1 FOR 30) AS user_pass, NAME AS user_nicename, mail AS user_email, ” AS user_url, FROM_UNIXTIME(created) AS user_registered, ” AS user_activation_key, 0 AS user_status, NAME AS display_name FROM drupal.users;

UPDATE wptest.wp_posts JOIN drupal.node ON title = post_title JOIN drupal.users ON drupal.users.uid = drupal.node.uid JOIN wptest.wp_users ON = wptest.wp_users.user_nicename SET wptest.wp_posts.post_author = wptest.wp_users.ID


One note for you: I found the line where we updated our content image links didn’t really take care of what I needed.  My Drupal db was full of absolute links for image sources so I ended up having to change each by doing something like: UPDATE wptest.wp_posts SET post_content = REPLACE(post_content, ‘’, ‘/wp-content/uploads/oldimages’); for each of the image urls.  I then mass imported the images via ftp into my wp-content/uploads/oldimages/ directory.  This meant they weren’t included in the WP media library as I would prefer, but at least the images were there.

Let me know if you’ve got improvements, especially if you write a script to import the images into the media library!