Something every Language/Library debate needs to keep in mind….

There’s some discussion happening right now in the WordPress world about what javascript framework to add to WP core.  These kind of debates happen frequently in the programming world (Google “PHP sucks” for some great examples).  In the course of these types of discussions, support is usually brought up for one point of view or another by pointing to what others have written about it on the internet.  Certainly it is reasonable to glean from what has been written,  but I think it’s also important to recognize there is a silent majority of programmers out there that we’ll never get input from as demonstrated by this simple diagram I did up (horrendous but communicates the point I want to make):

peoplewhoprogrampeoplewhowrite

The intersection of people who write (and you might add write well to that) and those who program (and you might add those who program well to that) is a small portion of the entire picture.  Sure, we don’t discard what is written about, but let’s not give it undue weight either.  Ultimately, there is a silent majority of people building solutions who really don’t care about these discussions or flame wars because they are using what gets the job done.

At the end of the day, use what gets the job done.  Learn it well.  Learn it deeply.  If you’re one of the few who also has the gift/time to write, write about it!

On Vision

This is a post that has been percolating as a draft post for nearly two or three months now.  But as a theme, its something I’ve wrestled with far longer.  Those who know me well, know that at my core, I’m kind of a systems and strategy kind of guy. What makes gets my ticker picking up its pace,  is when I get to work with a big picture idea and help generate/coach the strategies and systems to see that that big picture come alive and grow.  And so, that’s why this post reflects something that strums the passion bone in my body.

I want to spend a little bit of time articulating some things I’ve come to believe about a word that gets used a lot,  but is rarely understood fully.   This post is sparked in part because I think there’s a lot of misunderstanding about what vision is, and what it is not.  Part of that is because its so elusive, and part of it is because it frequently rides the buzzword wave.  So here’s what I think about vision:

Vision inspires curiosity.

You know you’ve heard, read, or experienced vision when it leaves you hanging,  when it sparks that desire in you to know more.  That’s why some of the most compelling visions are those that paint a picture, or connect a story, with a future.

Vision does not answer all the questions.  It doesn’t tell you how something is going to happen.  It doesn’t tell you when something is going to happen.  It sometimes doesn’t even articulate where.  But compelling vision will always leave you with questions.

In the end, vision begs strategy because it inspires curiosity.

Vision Polarizes.

This is crucial.  A vision that everyone likes, is not vision, its a sedative.  The reality is, visionaries (you know, those people with a vision), have a lot of enemies.  They get a lot of flak and its often only in hindsight through the eyes of history, when they start to get labelled visionaries, that the animosity tapers down a bit.  The reality is, really compelling visions have haters and lovers.  A compelling vision is something that either calls people to it, or repels them.

It polarizes.

Coincidentally, that’s why vision is so powerful.  While a vision is polarizing, its also uniting. How?  People who are captivated by the vision, who buy into it share a common cause – a cause worth fighting for.  Sedatives, don’t inspire that kind of passion, or unity.

This also means that its really difficult for a committee to come up with a vision.  Committees are great for hashing out ideas, for brainstorming, for strategizing, for planning, coming up with mission statements, x year plans, etc..  But not for creating vision.  If a vision is launched by a committee I can pretty much guarantee you it will be safe, not polarizing and ultimately, not really a vision. Maybe what they’ll have is a really great mission statement, or slogan, or even a plan – but not a vision.

Incidentally, this also means, that great visions aren’t always popular, and not so great visions sometimes are.

Vision is an “impossible” future.

More than just a picture of something different than the status quo, on the surface, visions seem impossible.  That’s because visions paint a picture of something that isn’t in the midst of what is.  Anything else isn’t a vision it’s just a report.

This is also why having a vision is not the same thing as having a goal.  With vision, you don’t even know if it will come to pass.  You dream for it, you desire it, you’re passionate for it (if you’ve caught it), you even pursue it,  but at times it seems so impossible that you’re not sure you’ll ever see it happen.

Sometimes you don’t.

A goal on the the other hand is something you expect to reach.  It has an obtainable finish line.  Difficult maybe, and certainly something you may not complete.  But nevertheless can happen.  It’s possible.  Visions aren’t really like that.

This is one of the reasons why visions are so polarizing because some people will hear a vision and laugh at the audacity of those who believe in that vision.  “Such an impossible goal!”, they say.  Except, its not a goal.

A goal is deciding that you are going to quit smoking.  A vision is seeing the entire world free of the addiction of tobacco.

A goal is to build a rocket to reach orbit.  A vision is to land a man on mars.

A goal is to build an electric car.  A vision is to end humanities dependence on oil.

Catch the drift?  Oh and here’s another little interesting thing.  Visions are realized by goals. Lots and lots of incremental, obtainable, strategical, itty bitty, goals. The impossible reached by a long chain of possibles.  But it all starts with a dream for something outrageous.

This is why…

Vision requires sacrifice.

To get from here to there is going to take a lot more than wishful thinking.  If a vision is a picture of something impossible, then it its not a skip, hop, and dilly dally dance away.  It’s hard work, and perseverance, and endurance and sweat and tears, and loss, and pain to get there.  Sounds like fun doesn’t it?

The interesting thing is, compelling vision has increased value because of the cost to achieve it.  But conversely, without any cost, does the end really matter?

That’s why its interesting to watch what happens with people who are captivated by a vision.  No amount of sacrifice seems too much to inch closer to realizing that impossible reality.

Vision doesn’t always generate a movement.  But it always starts with one person.

The funny thing about vision, is that it sometimes can be so polarizing that the only person who believes it, is the one in who it was birthed.  Vision can live and die in the life of one individual.  Sad, but true (and sometimes good).

But the underlying truth, is that regardless of whether vision results in a movement or not, it is always birthed in the heart and soul of a single person.  Call it muse, or God given, or calling, or inspiration – but that spark is awakened in some guy or some gal and lives when they can’t shake it, and then embrace it.

Yet another equal and perhaps even more powerful truth, is that while a vision starts with one person, it never gets completed with just one.  That’s why I’ve found that a vision often lives and dies on how well it gets communicated, and I guess in the end, how polarizing (and thus compelling) it really is.

Vision isn’t taught, it’s caught.

You can’t teach people vision.  You invite them.  You can’t reason vision with people. After all, it’s impossible right? No, reasoning doesn’t work.  You inspire, you challenge…

You lead.

Visionaries, don’t get people on their vision train by fancy billboards, and great marketing campaigns (it only seems like they do).  Great visionaries have a vision that captivates people because they are living it, they are leading it.  An impossible reality, that’s already real to them.

Vision is not complicated.

Ha! Once the planners and the strategy masters, and engineers start mapping out the goals to see that impossible vision become reality, it certainly starts to seem complicated. But the vision itself, the essence of what gets dreamed about and communicated, and shared, isn’t complicated.

It may be impossible, but it’s simple. If you can’t remember a vision, then it’s complicated, and not really a vision (probably more a plan).

But let’s not confuse a slogan with a vision. Slogans are birthed from visions, but a vision never comes from a slogan. When you hear the well known slogan “I have a dream”, you immediately connect it with the vision Martin Luther King Jr. had for a better world.

Without the vision, “I have a dream” is just an incomplete sentence.

What’s your vision?

Here’s another somewhat uncomfortable truth.  Some of us will never have vision sparked, or birthed in us (and unfortunately some people uncomfortable with that try to manufacture it).  The reality is, that’s okay.  I believe that some of us were never meant to birth the vision…

But all of us are meant to carry a vision.

In the end…

These are just a few thoughts and observations I’ve had/made about vision.  As time goes on there likely will be more I could add (and may add) to this post.  But for now, just wanted to get this written out.  What do you think about vision?  What would you add to this?

 

 

Using circleci.com for automated WordPress plugin testing.

A few months ago, one of the teams I work with went on the hunt for a good continuous integration service for running tests on the code we write.  We jumped on the unit test bandwagon at the beginning of the year and wanted to really amp up the quality of our product by having tests run on every commit.  I was tasked with this job (and anyone who knows me knows I LOVE playing with new things, so it was a task I was looking forward to doing)

Most WordPress users are familiar with travis-ci.org and the internets were full of instructions for getting things plugged in and up with travis.  Unfortunately, our project is inside a private github repo so we couldn’t use the free travis plan to run our tests on and the premium plan was a bit to pricey for our first attempt at this.  So after searching around, I stumbled on circle.  From all appearances, circle looked like it would work very similarly to travis and bonus points were that their plans are much cheaper – so great for getting started with.

All their documentation was great for getting things hooked up to your github repo, and getting started with tests, with the exception of one glaring thing.  I couldn’t find ANYTHING on the internets about how to setup a circleci.yml file for automating WordPress and WordPress plugin tests. Boo.  But actually, probably better in the long run because I ended up having to come up with something through trial and error and in the process learned a lot about the magic behind these scripts.

In this post, I’m not going to highlight how to setup unit testing for your WordPress plugin since there’s already a wealth of knowledge on the internets for that. Instead I just want to give an example circle.yml file that we use for our plugins at EventEspresso.com

So in the interest of passing on what I learned for anyone else searching the internets, I present to you our circle.yml script:

## Customize the test machine
machine:

  timezone:
    America/Denver # Set the timezone

  # Version of php to use
  php:
    version: 5.4.21

  # Add some environment variables
  environment:
    CIRCLE_ENV: test
    WP_MULTISITE: 0
    WP_CORE_DIR: /home/ubuntu/wordpress-develop
    WP_TESTS_DIR: /home/ubuntu/wordpress-develop/tests/phpunit
    plugin_loc: /home/ubuntu/$CIRCLE_PROJECT_REPONAME
    plugin_slug: $CIRCLE_PROJECT_REPONAME
    plugin_dir: /home/ubuntu/wordpress-develop/src/wp-content/plugins/$plugin_slug
    plugin_tests_dir: /home/ubuntu/wordpress-develop/src/wp-content/plugins/$plugin_slug/tests


## Customize dependencies
dependencies:
  pre:
    #enable xdebug.  LINE 1/2 to uncomment if you want to run a code coverage report.
    # - sed -i 's/^;//' ~/.phpenv/versions/$(phpenv global)/etc/conf.d/xdebug.ini
    #setup WP install
    - git clone git://develop.git.wordpress.org/ $WP_CORE_DIR;
    - cd $WP_CORE_DIR && cp wp-tests-config-sample.php wp-tests-config.php && sed -i "s/youremptytestdbnamehere/wordpress_test/" wp-tests-config.php && sed -i "s/yourusernamehere/root/" wp-tests-config.php && sed -i "s/yourpasswordhere//" wp-tests-config.php;
    # move plugin into tests/src
    - mv $plugin_loc $plugin_dir;
    # set up database
    - mysql -e 'CREATE DATABASE wordpress_test;' -uroot;
    # setup phpunit
    - wget https://phar.phpunit.de/phpunit.phar && chmod +x phpunit.phar && mv phpunit.phar /home/ubuntu/.phpenv/shims/phpunit

## tests override
test:
  override:
    # comment out the below line to run a code coverage report.
    - cd $plugin_tests_dir; phpunit
    ## LINE 2/2 to uncomment if you want to run a code coverage report.
    # - cd $plugin_tests_dir; phpunit --coverage-html $CIRCLE_ARTIFACTS

Where does the script go?

The circle.yml should be in the root directory of your WordPress plugin, and I’m assuming that the plugin itself has all its tests in a /tests/ directory off of the root.

What does all that stuff mean?

The circle.yml script itself is based off of the sample file circle provides. I just had to use trial and error to figure out setting up all the components needing setup on the virtual machines circle spins up to run the tests on. Let’s walk through the sections one by one.

machine:
The machine section basically is the group for all the machine variables controlling the vm setup.

timezone:
In this section you can set what the timezone will be setup for the spun up machine. In reality, you don’t have to put anything here, because WordPress runs in UTC. But if you are doing anything else on your machine or are collecting errors etc., setting the timezone could be useful.

php:
Here you set what php version you want the tests to run in. One thing I haven’t been able to figure out on circle yet is whether I can have our tests run consecutively on different php versions (which seems to be REALLY easy with travis). Note, PHP5.2 is NOT an option with circle (which may be an option with travis, not clear on it).Since most hosts dropping support for PHP are jumping right to PHP5.4 (and skipping PHP5.3) that’s the version we’ve decided to run our automated tests on.

environment:
In this section you set all the environment variables you want exposed in bash for your test setup. Note the following variables I’ve setup:

  • CIRCLE_ENV: test – currently unused, I just used this to set that we’re in the CIRCLE_ENV testing environment. At some point I may use this in our test scripts so I have a way of knowing we’re running tests on a circle server.
  • WP_MULTISITE: 0 – used by WordPress test library, this basically allows us to designate that we are not running our tests on WordPress multisite (of course when we DO want that to happen we change this).
  • WP_CORE_DIR – here we set the path where wp core tests suite will be installed. Note that circle vm’s are spun up with a user named ubuntu. So all files are typically found in the ubuntu user directory.
  • WP_TESTS_DIR – here we set the path for where the tests directory will be for the WordPress phpunit tests.
  • plugin_loc – here is the path set for where the plugin will be installed. Note I use a special environment variable Circle automatically exposes called $CIRCLE_PROJECT_REPONAME. Circle automatically pulls in the project from the repo its connected with and installs it in a path in the home directory. I set this as a variable so later I can instruct the script to move the project from that location to its new home in the WordPress wp-content/plugins folder.
  • plugin_slug – just to save typing and be more explicit – this is an alias for $CIRCLE_PROJECT_REPONAME
  • plugin_dir – this is the path where the plugin will be moved to after WordPress is installed.
  • plugin_tests_dir – this is the path to the tests folder where phpunit will be run for our plugin.

dependencies:
This section of the circle.yml file is where you can setup all the dependencies before the tests are run. In our file, we only use the “pre” index (but there are others you can read about in the circle docs).

pre:
This is where you list instructions for how circle should setup the machine before the tests are run. It appears that any bash commands can be included as separate line items in this list.

  • sed -i 's/^;//' ~/.phpenv/versions/$(phpenv global)/etc/conf.d/xdebug.ini – note this line is commented out by default. it basically takes care of enabling xdebug for php. If you want to do a coverage report at the end of your tests then you need to remove the commenting.
  • git clone git://develop.git.wordpress.org/ $WP_CORE_DIR; – here we’re pulling in the WordPress development repo that contains all the WordPress tests.
  • cd $WP_CORE_DIR && cp wp-tests-config-sample.php wp-tests-config.php && sed -i "s/youremptytestdbnamehere/wordpress_test/" wp-tests-config.php && sed -i "s/yourusernamehere/root/" wp-tests-config.php && sed -i "s/ – here is where we give instructions to cd into the WordPress installation we just installed, and then modify the wp-tests-config.php file to have the db instructions.
  • mv $plugin_loc $plugin_dir; – we’re moving the plugin the tests are being run against from the directory it was installed in, into the WordPress plugins folder where it needs to be.
  • mysql -e 'CREATE DATABASE wordpress_test;' -uroot; – This just sets up the db to be used by the tests suite.
  • wget https://phar.phpunit.de/phpunit.phar && chmod +x phpunit.phar && mv phpunit.phar /home/ubuntu/.phpenv/shims/phpunit – for some reason, the installation of phpunit that comes with circle machine installations is just not setup correctly because it doesn’t work. So this line takes care of installing the latest phpunit so that it does work. This little line is the culmination of hours of work (just because there’s so little usable information, I’m not a server guru, and I had a lot of trial and error).

test:
In this section of the circle.yml file you are able to give specific instructions regarding the tests. The only parameter we use in our file is the “override” one. This just ensures that the default circle test isn’t run but instead what we specify.

override:

  • cd $plugin_tests_dir; phpunit – here we cd into the tests directory for our plugin and run phpunit. That’s it! Now if you want to run a code coverage report then you make sure this line is commented out and uncomment the following line…
  • cd $plugin_tests_dir; phpunit --coverage-html $CIRCLE_ARTIFACTS – this line is commented out by default. However, if you wish to run a code coverage report then xdebug has to be enabled, and then you remove the comments from this line and comment out the previous line. What happens is when the test is complete, phpunit will create a html code coverage report and install it in the $CIRCLE_ARTIFACTS path. The groovy thing about this is that when complete, the circle artifacts path is visible on the internet so you can click the provided link (or share it with the team) to access the code coverage report. The reason why this is commented out by default is it takes significantly longer to generate a report than just running the tests, so we don’t want a report generated on every commit.

Conclusion

That’s it! I hope this is useful for anyone wanting to get WordPress unit testing setup on the excellent (cheaper) circle service. If any of you reading this are more of a server guru than I am and have suggestions for improvement I welcome that in the comments!

If I was in charge of a telecommunications company…

Yes, this is one of those “If I was in charge, I’d do this…” posts.  Don’t we all have opinions on how companies should be run?  Just had these thoughts today so decided to write them down.  Canada is known as one of the worst places for mobile phone plans (from a consumer perspective), largely because of the lack of competition.  If by some freak cosmological accident I ended up in charge of a telecommunications company, here’s some things I’d do:

I’m not going to talk about pricing or packages or anything like that, because at the end of the day what matters most for company longevity is customer loyalty and word of mouth marketing (even more so in today’s hyper social world).  The only reasons why I think the existing companies are doing so well in Canada now are because of their entrenched position with infrastructure, and the lack of choice for consumers.  With that said,

1. I’d ensure that our company has some sort of automated process that scans existing customers accounts (ooo privacy, but bear with me) and if there are any current company promotions that are better plans (either in terms of the same as what they have but cheaper, or more features than what they have for same price) than what the customer currently has we automatically switch them to the cheaper plan and notify them.

2. The plans would be simplified (which would need to happen for number 1 to work effectively).

3. Company wide policy that if a customer calls and complains about something not working, and they have ANY difficulty getting the level of service they asked for, we immediately grant them at least a free month’s service.

4. For customers who have been with the company for over three years.  We surprise a certain number of them randomly once a year with free phones and/or upgraded plans for their current phones.

That’s just four things.  Not a lot, and I fully realize there’s a lot more involved with running a company, but four things that I think would help towards gaining long term customers and viral word of mouth marketing.

What would you add?

FireHost and WordPress Multi-site… how well do they play together?

Recently, one of my clients purchased a server with FireHost.com.  We’d been on the search for a new web host for some time now to serve as the infrastructure supporting upcoming web applications we have in the works.  We needed a company who is well recommended, and will help us scale and scale quickly.

You pay a more for a host like this  but it’s part of the investment costs you need to make if you want to be positioned well for solid growth as a business.

Anyways, the purpose of this post is NOT to discredit or gripe about yet another hosting company that fails to live up to expectations. We actually really like the setup we have at FireHost. Although getting things setup were a bit of a pain – their support has been very prompt and generally okay.  No, this post is more of a fyi for folks who are in a similar situation as us.  I couldn’t find any information on this subject on the nets so thought I’d post my own findings.

One of the major components of some projects we are working on this year involves the use of WordPress multisite.  It will provide the backbone of what we are building and is crucial that we have a server environment that supports this.  FireHost does except for one niggling problem.  They have a super awesome “Web Application Protection” firewall that works really well, too well, and prevents normal usage of WordPress multisite.

At issue is that any subsites created on WordPress multisite will fully function as long as those subsites don’t post any images or certain html in their posts.  Cause if they do,  BAM, the firewall sees that as a xss attack and shuts her down.

That’s no good is it?  No.  But wait, FireHost has the solution.  All you have to do, is whenever this happens you just send them the path for the sites that the firewall does its thing on and they’ll add an exception.  Greeatt!  Except that we’re planning on using WordPress multisite to well actually make it easy for people to signup and get started on a new site right away (you know kind of like how people expect things to work? right?).  So yeah, major pain to have to send a block of paths every time the firewall acts up.

I’m not going to tell you the solution we worked out but let’s just say not ideal.

Silly?  Yeah.  I get it. But obviously someone at FireHost needs to do some thinking about how this firewall is setup and put something in place to allow for easier management of WordPress multisite while keeping the firewall working on things that it should work on, or at least be clear about the side affect of the WAP for those using WP multisite, would have saved a lot of back and forth with tech staff.  At the very least, create some sort of API or secure service for automating the firewall exceptions in cases like this where sites are being created dynamically via an application like WordPress multisite.

Anyways, again we do like what we have so far with FireHost except for this firewall experience, but I just wanted to post this up in case anyone else is thinking of using multi-site with FireHost and wondering why its not working as expected.

(I also have another reason for posting…secretly hoping some server guru out there will be able to explain how I’m either an idiot for expecting the firewall to be set up so multi-site works, or how FireHost can do things so multisite will work fine).

Update: December 2014

Just posting an update for anyone who visits this post via search engines (there are a few of you its seems.  Besides the fact that Firehost did contact us within the 30 day window that was put forward by their CEO/founder in the comments to this post, we never did get on any “beta” program.  The solution they are proposing for clients needing their own managed WAF is a $1500+/mo cost solution, which is not startup friendly.  They did offer to help get us up on ModSecurity as an alternative to their WAF solution but in the end my client and I just decided to fire Firehost (yeah pun intended) as our hosting provider and we joined the cool cats over at Digital Ocean.  We figured if we’re going to be doing most of the server setup/managing ourselves then no sense in paying a “managed” hosting provider to do it for us.  We’ve been on Digital Ocean for about 5 months now and absolutely LOVE it.

WP 3.7 drops with an interesting surprise…

I thought I was following the development of WordPress 3.7 fairly closely but something totally missed my notice and only caught my attention when a plugin I develop stopped working with the latest version of WordPress.

The culprit?

do_action( 'save_post', $post_ID, $post, $update );

Notice anything different?  The difference is that this hook used to only have 2 parameters, “$post_ID”, and “$post” but NOW it has a third one, “$update”.  It’s actually a nice addition as it makes it super easy to determine whether the post is being updated or not.  However, due to the way I hooked into this action (with a function that had extra parameters on it), Organize Series broke.  Easy enough fix, but quirky enough that I thought it deserved a post as I haven’t seen anybody mention this little addition!

 

Get wp-cli running with MAMP

I got really intrigued with the wp-cli tool for command line WordPress (seriously awesome, check it out)… however I haven’t switched my osx machine to use the built in php and mysql so I kept getting this error:

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

Easy fix:

sudo ln -s /Applications/MAMP/tmp/mysql/mysql.sock /tmp/mysql.sock

And BOOM! I’ve got wp-cli working now.

The conversations you have with yourself…

…impact what you do and how you feel.  What have you told yourself lately?  Have you been an encourager or a life sapper?  Do you hear justification or warning?  Do you bargain with yourself or hear, “you can do better?”

The inner voice is a powerful influence on our lives.

This is why you must guard what influences your inner voice.

Are you?

path not plan

I’ve been thinking about this a bit lately.  We’ve all heard the phrase,

“Those who fail to plan, plan to fail.”

Right, but also wrong.  I’ve seen people who are terrible planners succeed, and people who are meticulous planners fail.

Yet something else, seems to work.  Path.  Those who have a path, who have a direction, who have an idea of where they are going – that beats planning every time.  Why?  Because, those who are creating a path can change their plans.  Those who just plan might get the plan down pat but then miss the path.

Sometimes you may follow the path someone else blazed before you.
Then other times, you blaze your own path.

Maybe it’s just a play on words but I like the idea of path over plan (even though I’m a planner at heart). I like the idea that I have a path to follow rather than a plan to execute.  There are a lot of paths to choose from, even a few that may need creating – but that’s where the learning and the skill and the risk comes in – because that choice does matter.

Failing, doesn’t depend on your plan (or lack of it).  It depends on your path.

Choose wisely.