Thursday, August 29, 2013

How Will You Apply This Experience in Your Next Job?

Today marks the end of my brief run as Chief Technology Officer at Granite State College. On my way out, a respected colleague asked me, "How will you apply the experience you gained in your next job?" The question is an excellent one to which I didn't have a good, immediate answer. And because it's an excellent question I continued to ponder it throughout my last day.

Logically deconstructing the question, I see the first component as, "What experience did you gain?"

  • Cross-functional project management can be a full-time job. Unless the focus is on developing one's own staff, assigning one person to tackle this kind of project management in tandem with operations management is risky for the organization.
  • People can make work harder than it has to be. Something that only involves a few hours of technical work can end up taking several days, due to barriers that other people erect for myriad reasons. And because those barriers are erected by people, removing those barriers becomes extremely time-consuming and exhausting.
  • When working with Salesforce, iterate frequently and demonstrate progress continuously. Adding new functionality to Salesforce is easy, and as a result it's easier and more productive to release features rapidly in small batches. In short, an agile approach to feature delivery would be best in Salesforce. 

Monday, July 8, 2013

Data Loader bean for SQL Server 2012 Express

To connect Salesforce's Data Loader (28.0) to a named instance of SQL Server 2012 Express:

  1. Set the SQL Server Browser service's startup type to "Automatic"
  2. Start the SQL Server Browser service
  3. Use SQL Server Configuration Manager to enable the TCP/IP protocol for the named instance
  4. Download the Microsoft JDBC Driver for SQL Server
  5. Extract the downloaded sqljdbc4.jar to %DATA_LOADER_HOME%\Java\lib\ext
  6. Create an org.apache.commons.dbcp.BasicDataSource bean in your \conf\database-conf.xml file by adapting the sample database-conf.xml bean for SQL Server 2012 Express
  7. Create a simple extract process to create records in SQL Server to test the configuration. Refer to this working set of database-conf.xml, process-conf.xml and an SDL file as a guide.

Additional Info

Along the way you may encounter numerous errors. Below are some of the ones I encountered and how they were resolved.

FATAL [main] process.ProcessRunner topLevelError (ProcessRunner.java:238) - Unable to run process sqlServerApplicationExtractjava.lang.RuntimeException: com.salesforce.dataloader.exception.DataAccessObjectInitializationException: Database error encountered during connecting for database configuration: insertApplication.  Sql error: Cannot load JDBC driver class 'com.microsoft.sqlserver.jdbc.SQLServerDriver'.
  • Solution: Extract the downloaded sqljdbc4.jar to %DATA_LOADER_HOME%\Java\lib\ext

Caused by: java.lang.UnsupportedOperationException: Java Runtime Environment (JRE) version 1.6 is not supported by this driver. Use the sqljdbc4.jar class library, which provides support for JDBC 4.0.
  • Solution: Delete sqljdbc.jar from %DATA_LOADER_HOME%\Java\lib\ext
  • In my case, I had extracted both sqljdbc.jar and sqljdbc4.jar to the \Java\lib\ext folder

Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: The TCP/IP connection to the host localhost, port 1433 has failed. Error: "Connection refused: connect. Verify the connection properties. Make sure that an instance of SQL Server is running on the host and accepting TCP/IP connections at the port. Make sure that TCP connections to the port are not blocked by a firewall.".
  • Solution: Edit the connection string to specify a named instance, "localhost\SQLEXPRESS" instead of just specifying the server "localhost"

Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: The connection to the host IGNEOUS, named instance sqlexpress failed. Error: "java.net.SocketTimeoutException: Receive timed out". Verify the server and instance names and check that no firewall is blocking UDP traffic to port 1434.  For SQL Server 2005 or later, verify that the SQL Server Browser Service is running on the host.
  • Solution: Start the SQL Server Browser service

Caused by: org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (The server sqlexpress is not configured to listen with TCP/IP.)

RedirectHelp Page to Integrate Google Sites with Salesforce for Context-Specific Help

If you want to use Google Sites for contextual documentation in Salesforce, the following steps will enable your users to trigger a contextual search in your Google site when they click "Help for this Page":

  1. Deploy the RedirectHelp page to a public site in your Salesforce org
  2. Open your Google site
  3. Perform a search for any keyword (e.g., "help")
  4. Copy the resulting URL. It should look something like, https://sites.google.com/a/granite.edu/technology-playbook/system/app/pages/search?scope=search-site&q=help
  5. Edit the RedirectHelp page. Set the baseURL variable to the Google site query URL, with {#section} inserted as a placeholder for the query keyword
  6. Copy the public URL of the RedirectHelp page
  7. On the "Help Settings" page in Salesforce, set the Re-direct Help URL to the public URL you just copied


Note: When you are satisfied with the functionality of the RedirectHelp page, you should set the pause variable to "0" so that the redirect is instantaneous.

Additional Info

Google Sites is a great, cost-effective way to create documentation for customized, enterprise systems such as Salesforce. However, integrating the two is not seamless out of the box.

Salesforce's Help Settings allow one to specify a Re-direct Help URL, which can be set to the base URL for a Google site. For example: https://sites.google.com/a/example.com/help/


But the Google site would not know what to do with the default loc, target and section parameters that Salesforce automatically adds to the URL.

Since the section parameter really provides the contextual keyword for the Online Help request, it would make sense to perform a search through the Google site for the keyword whenever a user clicks "Help for this page". Deploying the simple RedirectHelp page achieves this goal without custom Apex or JavaScript.

Note: This solution was last tested in Summer '13 DE and EE orgs.

Wednesday, July 3, 2013

Data Loader process.bat Error: The system cannot find the path specified

When trying to run process.bat for Salesforce's Data Loader from the command line, I encountered an error, "The system cannot find the path specified."

The problem turned out to be that I was not running process.bat from the %DATA_LOADER_HOME%\bin folder.

Running process.bat from the folder where the BAT file was located (shown below) solved the problem.


The root cause of the error is that process.bat (in Data Loader 28) looks for the JRE executable in a relative path, assuming the user is running the script from %DATA_LOADER_HOME%\bin.

Monday, July 1, 2013

How to Install Java 7 Plugin for Firefox on Windows Server 2008 R2

If you have to set up Windows Server 2008 R2 environments and try to get the JRE 7 plug-in to work in Firefox on the server, you may not have found it to be an intuitive process.

The quickest solution seems to be:
  1. Open Google, and search for "java plugin verify"
  2. Click the result with a title similar to "How do I test whether Java is working on my computer?" See the screenshot below for reference.
  3. Click the Free Java Download button
  4. Click the Agree and Start Free Download button. This should prompt you to download an installer such as "jxpinstall.exe".
  5. Once the download is complete, close Firefox
  6. Run the installer, and follow the on-screen instructions to complete the installation
  7. After the installation, return to the verification page to make sure the Java plugin for Firefox now works


For some reason, downloading and installing the JDK or the JRE from Oracle's website does not install the plugin correctly for Firefox. This is the only reliable way I've encountered so far of getting the plugin to work in Windows Server 2008 R2.

Monday, June 3, 2013

Be Courageous and Get On With It after Graduation

Blue skies and sunshine set the tone for Granite State College's commencement ceremony yesterday, celebrating the accomplishments of hundreds of newly minted alumni. Juggling full-time jobs, families, disabilities and more while tackling rigorous curricula, many of these graduates model values of persistence and discipline that all of us can emulate.

Yet... as the songs, speeches and thunderous applause all drew to a close, I couldn't help but to ponder silently: What's next for each of them? What will they do with their education and degrees? While completing the years of coursework is commendable, earning a degree is still a fairly structured process with a well-defined beginning and end. Life, however, is very open-ended, and life's unknowns are exactly what face the graduates as each one descends from the stage, leather diploma cover in hand.

I wonder whether they were moved by a common message from the speakers, that all of us can do something extraordinary for at least one other person, if we set our hearts and minds to it. Hal Jordan posed a challenge to the audience: "Be courageous. The opposite of courage is not cowardice. It's apathy." And apathy is what worries me. With so many resources invested by all parties in this education, apathy is a sure way to net little in the end.

Apathy is not usually intentional, either. I think it's just the comfortable default. When there is a clear goal in sight, we can motivate each other to reach it. But once the concrete objective of completing a collegiate program is attained, one doesn't always leave with a clear goal for what's next. Change the country? Change our state? Change our local community? These sentiments sound great, but it's unclear how to really make a difference. Instead, I fear that we will simply go back to the known goal of improving our own situations.

So, I have just one wish for all who were touched by #GSC2013: Each participant at commencement today picks a single dream or aspiration and defines a short-term goal to move in that direction. Then, as Lucile Jordan advised, we can "get on with it." Let's achieve the monumental eventually, starting with a realistic game plan that builds on the momentum of graduation.

Sunday, March 31, 2013

Maintaining Inbox Zero: No Emails in Your Inbox

"Inbox Zero" was a dream that began to look realistic when I decided to separate my emails into tiers: Chatter notifications, Basecamp notifications and everything else. When Chatter notifications were all that I was seeing in my inbox, it was easy to empty my inbox on a daily basis. But the illusion of having responded to everything faded very quickly as the number of unread emails piled up in a separate folder lurking just beneath my inbox.

Finally, to dispel the illusion and to actually respond to all incoming email, I took control of my inbox by making one simple decision. That decision is simply to check my email just twice a day, once in the morning and again in the evening. And now I am able to consistently meet a 24-hour response time to emails during weekdays.

Implementing the decision required just a few major behavior changes:

  • Schedule 90 mins per session to handle email. Time not used in a session can be reallocated to other activities.
  • Spend no more than 6 mins responding to an email. If more time is required, flag the email for follow-up. As a courtesy, after flagging an email for follow-up, I generally reply to the sender to let him or her know that I have received the email and need more time to craft a full response.
  • Once read or flagged, either move the email into another folder or delete it.


The point of this change was to increase productivity by reducing stress, anxiety and workplace distractions from two things: constantly switching into and out of Outlook, and worrying about unread emails.


If you try this or are already doing something similar, have you been able to maintain inbox zero? Or does your job demand a different way to handle email? While I am far from completing all of my tasks on a day-to-day basis, I take comfort in knowing that I can at least respond to all emails that come my way. After all, communication is a key component of everyone's work.

Tip: To follow through with eliminating email distractions, turn off email notifications in Outlook, on your tablet and on your smartphone.

Tip: The articles below may provide additional perspectives on handling email:

Wednesday, February 6, 2013

I Share, Therefore I Work

One of my staff made an off-hand remark to me, "No one knows what you've been doing lately." After I got over the initial shock of the message, I immediately suppressed my inner voice that was saying, I don't know what you've been doing either. I've heard that part of leadership is putting a good filter on that inner voice.



But more importantly, I started to explore this troubling statement more deeply as a symptom of a more fundamental, pervasive problem.

From the situation, I deduced the following:
  1. My staff member doesn't know what I'm doing. (This is a euphemism, because another way to say this is that my staff member doesn't think I'm working.)
  2. This is likely because my staff member has not seen or heard of any productive activity that can be attributed to me.
  3. Obviously (or perhaps not so obviously), I have been working.
  4. So, why doesn't my staff member know that I've been working? Simple: I haven't updated him.

You may jump to the easy and reasonable question, "So, why haven't you updated him?" My excuses would be equally easy and reasonable:
  • I manage 10 staff, including 4 direct reports, overseeing quality control of our products and support of personal and enterprise technology in the workplace
  • I manage a CRM implementation project with 10 team members having a May 13 deadline
  • I manage an online admissions application project with 7 team members having an April 30 deadline
  • I manage a customer and partner single sign-on project with 2 team members, institutional partners and outside consultants having a June 30 deadline
  • I manage countless unmet needs and high expectations coming from all departments, including my own
  • I am trying to hire additional staff on a tight budget to take on vast responsibilities
  • Blah, blah, blah...
  • In short: I have no time.




Well, now... How very self-centered of me, to say that "I have no time." Do others have more time? Probably not. What's so special about me that makes my lack of time so significant? Nothing. And if I am already time strapped, what the hell am I doing writing a blog post complaining about not having any time? Because I'm supposed to be a leader who solves departmental and organizational problems, and right now I believe we have a big problem that I am partially addressing with this post.

And that problem is inefficiency. How much time do my staff waste complaining among themselves that I'm not doing anything? How much time do my staff waste by going down one path only to find out later that I am heading in a different direction? How much productivity is lost because my staff feel lost and suffer from low morale? I don't know the magnitude, but my gut says I'd probably pop a vein if I saw the numbers.

I believe that great work comes from happy staff, and if their happiness and productivity depend on knowing what I'm doing, where I'm going and why, then I must prioritize the communication about my work, even above completion of the work itself.

Communication leads to coordination. Coordination leads to responsiveness. Responsiveness leads to adaptability. Adaptability leads to a competitive advantage that will help us not only to operate but to grow, transform and even persevere in a challenging economy and an unsettled industry.



And in a modern Web 2.0 environment that demands efficiency in all processes, including communication, meeting synchronously with each staff member or even with all my direct reports at once is simply not sustainable. The channel is too narrow, time consuming and logistically difficult to setup due to its synchronicity. But thankfully, we have an alternative channel that has completely opposite characteristics: Salesforce Chatter.

Chatter is broad, allowing me to potentially reach everyone with every post and comment. Chatter is fast because I'm typing and my audience is reading, compared to me speaking and them listening. And Chatter is easy because I can share my thoughts immediately, asynchronously without having to pull people together to gather at a specific location at a specific time.

So, I need to communicate broadly and frequently to keep my staff happy, coordinated and productive, then I believe I need to share, post and comment more on Chatter. This activity is no longer optional; it's a matter of the organization's strength and long-term survival.

You've probably heard, "If a tree falls in a forest and no one is around to hear it, does it make a sound?" How about: If a man operates in an office and no one knows about it, did he actually work? What was the real, net value of what the man did? And who gives a Mars bar about it?

Impertio Ergo Operor. I share, therefore I work.

Tuesday, January 1, 2013

How to Lose Weight and Change the World

"Happy New Year!" Between saying it and hearing it said, the phrase must've popped into my life over a hundred times in the past 24 hours. Yes, it's a new year. But while I sincerely wish my family, friends and colleagues the best possible start to the next 365 days, at the same time a question starts forming in the back of my mind: What will it take for me to have a "happy" 2013?

Perhaps the answer starts with identifying what left me less than happy in 2012. A pretty simple task, considering 2012 was by and large a very positive year. So, what left me wishing for different outcomes?

Off the top of my head, I think of two tangentially related challenges: Mastering all the responsibilities in a new job position, and weight management. Without going into all of the details, the gist of the matters are that I still have personal skill gaps to bridge in my new position, and I now have many more pounds of excess flesh to shed in order to return to a healthy weight.

Without anything obvious between them, I'd like to offer two connections shared by the two items above: First, both are roadblocks in my personal mission to build a more harmonious world. Second, and perhaps more significantly, both challenges are rooted in habits that could use revisions.

I look at the challenges I face at work and the weigh control challenge I face at home, and it seems to me that one thing is clear: If I want to tackle and overcome more complex problems at work and in the world where I don't have direct control, I should start by proving that I can completely own a process over which I should have full control: maintaining a healthy weight.

In contemplating the weight problem (and by extension the larger problems), I think back to one of the books I added to my favorites list in 2012 was The Philosopher's Diet by Richard Watson. Watson offers a simple idea: Losing weight and keeping it off is one of the most difficult projects a human being can undertake. And if one can achieve consistent weight control, one can achieve anything. So, if I want to succeed at work, one way I can seal that deal is to succeed at reaching my target weight and staying there.

Another book I'm reading, The Power of Habit by Charles Duhigg, suggests that habits can be generalized into having three components: a cue, a routine and a reward. In this sense, I know there are at least a few habits that are hurting me continuously. Thankfully, Duhigg seems to be empowering me by asserting that everyone has the power to change components of those habits to produce completely different results, ones that are desirable and exceptional. Duhigg believes in the power of self, and that's a comforting reminder to people who feel that much of their lives are outside of their direct influence.

And finally, hearing Michael Jackson's "Man in the Mirror" on the radio gave me added conviction to tackle everything systematically in the new year, following this chain of thought: improve my physical self, then raise my work performance, then advance my larger mission. Each success lays the foundation for the next success. "I'm starting with the man in the mirror. I'm asking him to change his ways. ... If you wanna make the world a better place, take a look at yourself and then make a change."

So, at the moment I find myself and everyone else in a new year filled with many new challenges to come. And with the new challenges I believe there are at least as many new opportunities to match. Then, to welcome the new year, I'd like to make a toast to stronger economies and communities in 2013, starting with a focus on improving what we ought to hold in complete control: ourselves, and specifically our weights. Cheers!