13 July 2010

Managing SharePoint SandBox (User) Solutions

In SharePoint 2010, Microsoft has provided new functionality called “Sandbox” or “User Solutions” that allow administrators and Site Collection owners to upload new functionality scoped to a single site collection. This means that site collection owners can host bespoke code or 3rd party add-ons that are useful to them without affecting others on the same farm. This functionality is incredibly useful in situations where organizations have shared SharePoint farms that serve the needs of various groups. It’s also very useful if organizations are looking to leverage services like SharePoint Online or Microsoft Business Productivity Online (both services offer a SaaS-based version of SharePoint), but have historically been prevented from including custom code.

In the May issue of SearchWinIT’s SharePoint E-Zine, I discuss the management controls and shortcomings of this new feature.

03 July 2010

Can Search really solve Information “Findability?”

We’ve all heard the lament from end users and IT professionals alike: “I can’t find what I need in our … [fill in the blank here – network share, intranet, portal, etc].”  The reason, virtually universally, is that: 1) there’s an unintelligible organization to the content and 2) using the internal search tool never seems to return the results people need/want.  As a result, there’s a growing sentiment that “the solution” is to just get a Google appliance (or other inappropriately expensive search tool) and everything will be fine.  It’s worthy of note that this sentiment comes from all levels in the organization – from executive business management to senior IT management and all the way down to the average joe/jane employee (IT or not) - making the statement carry that much more weight.

Interestingly, there’s a certain logic to this statement (perverse though it may be to people who spend their professional careers mired in trying to solve the problem of findability).  When most people search for content on the web, they overwhelmingly use Google’s search technology.  In my own experience, if the content exists, it’s likely I can find it with Google search.  How Google makes is happen is a mix of complex mathematics, massive computing power and (seemingly to me) black magic, since even companies with vast resources invested in bettering search (like Microsoft) have yet to equal Google’s search success.  However, isn’t Google’s success also partly due to perception and, frankly, low expectations?

By and large, research suggests that most people “hope” to find content when searching the web.  If I execute a query using Google’s search site, I don’t actually know if the content I want exists.  I hope that it does and, when I find it,  I’m pleasantly surprised.  By contrast, when I search for content internally, it’s not a question of “if” the content exist, it’s a question of where.  I know that the content lives somewhere inside my … [again fill in the blank – file share, intranet, portal, etc], I just don’t know where. 

When I use my portal’s search engine to execute a query, I expect to find the content I want.  However, when the content I know exists doesn’t appear in the search results (or doesn’t seem to appear), I get very frustrated (can I get a Marine hoo-rah if you empathize??).  If I’m feeling particularly persistent, I may execute another query, perhaps using different keywords, to see if I can find my content in a different way.  This second attempt may or may not yield better results.  In the end though, my perception is I’ve just wasted a bunch of time and I’m no better off.  Worse yet, I have now come to two very harsh, though potentially inaccurate, conclusions: 1) Google rocks and I don’t understand why we don’t use it internally and 2) whatever search technology we are using internally stinks (I’ve heard clients use more colorful language, which I’ll spare you here).  Also, and not any less important, I’m very deeply disappointed that I will be spending more wasted energy duplicating an effort to either recreate the content I can’t find or, at least, doing duplicative research to support the work I actually have to complete.

If you’re still reading, I suspect you not only empathize, but are hoping I’ll give you “the solution.”  My honest response is that if I had a silver bullet solution, I would probably be very wealthy.  I would be cruising the Atlantic on a large yacht, with a drink in my hand and not searching for anything in particular except perhaps the elusive lime to add a little something extra to my libation.  Since my reality is that there is no silver bullet solution (and I don’t have a boat), I offer some truisms and suggestions about finding content in your organization and how to make that process better:

  • Taxonomy is required (really) 
    If you want people to find content, in any repository, you must (I don’t use this work lightly) apply some sort of organizing  principle to that content (“organizing principle” is synonymous with taxonomy).  You don’t have to look much further than your physical file rooms (organized alphabetically), biology (order, genus, species, etc – you remember high school biology no?) or virtually any other repository of stuff to figure out that if it’s not organized you’ll have a slim chance of finding what you need.  To provide a very concrete example, look at Best Buy’s navigation for a technology category approach that helps you find the product you want; if you can’t find what you want, let it stand as an example of how poor taxonomy can confound someone.  That said, I recently had a CIO tell me that he didn’t “get” the value of taxonomy and that we all live in a “search-based world.”  Again, though I respect this particular CIO and I get the sentiment, it’s just not reality.  You must develop a way to organize your content and make that organization (taxonomy) infinitely clear to the people for whom it will be the path to finding content nirvana.   Frankly, not everyone will use search to find content and a poor taxonomy will impact your search tool’s ability to return relevant results.
  • Google is good, but it’s not likely to work internally
    It’s true search technology has improved tremendously.  Google is clearly the leader.  However, their success is not actually magic and probably won’t translate to internal search success; public search and “enterprise” search are different beasts; Google is very good at public search, but haven’t fared any better than any other search company within the enterprise.  Also keep in mind that, Google’s dominance in general public web search stems from a number of factors, most of which do not exist inside of any singular company (a few of those key dimensions are listed here):
    • An overwhelming volume of content that can imply topic relevance through cross-linking (keywords in one document and/or site that are linked to other content and/or sites that imply authority for that keyword)
    • Massive computing power that can be used to execute complex algorithms (their specific “secret sauce”)
    • Search analytics that help create patterns of relevancy based on actual user click behavior (result select or re-query)
    • Legions of Google staffers that constantly improve Google’s algorithms over time (based on content data and analytics).  Despite what you may have heard about what Google does for a living, it’s all about search (not phones or collaboration software).  No other part of their business comes close to generating the amount of revenue (obviously through ads shown with search results) or has the same amount of resources devoted to it.
    • Like Microsoft had “help” from IBM becoming a dominant player in the PC operating system business, Google had a similar giant help them early on – Yahoo.  When Yahoo was the most popular site on the web, guess what search technology they used?  That deal made it much easier for Google to supplant their patron, in later years, as the leader in search.
  • Search is not the exclusive answer to findability
    Even if someone could create the perfect search engine that returned very precise and relevant results, why do you want to force your user community to execute a search just to find content?  Doesn’t the mere act of search introduce yet another set of clicks and keystrokes?  Isn’t the goal to “get there in less than two clicks” and “provide answers quickly?”  Think about your own experiences with search.  How long does it take to formulate the appropriate query?  To review the results?  To find the right result, click on it and validate it’s actually what you want?  Wouldn’t it be easier to create a very clear path to the right content?  Better yet, don’t you already know a good deal about your employees and couldn’t you predict at least some of their content needs?  If so, why not just surface that content on the home page of your portal (or other appropriate location)?  Better yet, wrap those items in an RSS feed and deliver them through a desktop gadget (works on both MACs and PCs).  Do you think I’m crazy?  This technology surely couldn’t exist you say (or it’s too complicated to implement).  Have you ever visited your iGoogle page?  Have you ever ordered anything from Amazon?  These sites aren’t doing anything that revolutionary in the year 2010.  They’re simply using data they already know about you to automatically find what might be relevant (or asking you to choose topics for the taxonomy that you are interested in viewing).  Is it perfect?  No.  Does it save time in the long run?  Absolutely.  Does it provide you a somewhat “searchless” content findability experience?  You bet.  Could you still supplement this approach with a search tool?  Of course.
  • Successful search experiences require constant work
    Just because you spun up a Google appliance, SharePoint search (or FAST) or implemented Autonomy, you’ve only just begun.  Like anything else in this world, success comes from discipline, dedication and an ongoing effort to ensure success.  Search is no different.  More than one of our clients has called and asked for our help in improving their search experience.  Unfortunately, virtually all of them have done next to nothing, beyond installing the software, to make search work properly.  Whether it’s not excluding common navigation items on a web site (the same navigation shown on every page messes with relevancy for those keywords), avoiding the application of metadata on documents (like no title or descriptions – not even counting the “fancy” stuff like author, department, main topic area) or leaving patently irrelevant content in the repository past it’s expiration (like the snow day policy from 2001 that for some crazy reason is the most relevant document when using “snow policy” as a query), clients frequently thwart their own best intentions.  To make search work, you must do a bare minimum, like excluding content that should never be a result (like a home page), apply metadata with appropriate values, perform periodic “gut check” searches that should yield consistently relevant results and monitor the behavior of your users by actually looking at analytic data (you’d be surprised how many queries return zero results or where no one clicks on a result).  If you just do this minimum, your search experience will dramatically improve.

If I’ve prattled on too long in this post and you’ve missed my point about findability, here’s the short version: search is not the exclusive answer to finding content; you must start with a taxonomy that everyone understands (and fits your content), implement search properly and monitor progress (making changes when necessary).  Anyone who says differently is either selling a search tool or has been sold a bridge in Brooklyn.

07 June 2010

Does SharePoint Destroy Intranet Design?

In the latest blog entry from Jacob Nielsen, he asks an interesting question: does SharePoint Destroy Intranet Design? The question is interesting in that we get a variation on that question frequently from clients: what sort of design can I use with a site running SharePoint (i.e. what constraints are there on my visual design)?  The answer to both questions is: no and anything you’d like.

In Nielsen’s article, he points out that 4 of the top 10 winning intranets from his 2010 survey use SharePoint.  In fact, this is a trend that has continued from the 2009 survey, where 5 of the top 10 used SharePoint.  Nielsen even has screen captures in his article latest article (and in the reports) showing pretty varied designs across each of the winners.  More evidence of different visual designs (and experiences) can be found in the SharePoint Sites on the WSS Demo site (interestingly, this site is now using SharePoint Foundations 2010, so it’s technically not a Windows SharePoint Services demo…).  So why all the trepidation?  I’ll blame the out of the box experience from SharePoint.

Regardless of whether you’re implementing an intranet, an internet or an extranet site, the SharePoint siren’s call of “out of the box” is very strong.  Microsoft has provided “good enough” standard site definitions, visual designs and functionality; that out of the box design experience is actually (pardon the pun) by design – Microsoft hoped to save people time.  Unfortunately, you can’t please everyone.  As a result, many organizations want to change the visual design and experience.  In the SharePoint community, this is called making SharePoint look less “SharePointy.” (I’m not sure who first coined this expression, but it now seems like common vernacular).

If you’ve come the place where you’re questioning how to improve the visual design of the application you’re building on top of SharePoint or being questioned by others about “constraints” or “restrictions,” here some key advice:

  • There are no restrictions on visual design when using SharePoint
    It’s true that there are some elements that should be included in your new design, like the ribbon (in 2010) or the page editor toolbar (in 2007).  However, neither should stop you from creating a design that fits your organization.  Just keep in mind that SharePoint controls (e.g. web parts and the elements that appear during editing) may not render the way the rest of your design does.  I would recommend rigorous testing to ensure everything works as you expect.  Design what you like and apply it to your SharePoint application.  Really.
  • You don’t have to start with a Microsoft-supplied Site Definition
    Since SharePoint ships with so many site definitions (and visual designs), most firms assume that you have to start there and then customize.  This is far from the truth.  In fact, you can create a custom site definition from scratch.  This option requires lots more work, but you may need to head down this path for any number of valid reasons.   If you decide to create your own definition, just remember that you’ll have to enable the specific SharePoint features that make sense for your design (e.g. the publishing feature or search).
  • If your visual design isn’t complex or matches the “L” navigation natively in SharePoint consider a theme
    SharePoint themes are often a good way to create a unique visual design without the work involved in creating new master pages or, with more effort, site definitions.  Many sites, though visually distinct from the standard SharePoint design, can achieve their design goals simply with a theme.   Consider this: a theme takes a competent developer approximately 8 to 10 hours, while a master page could take two to three days and a site definition could take a week or more (depending on complexity).   If you don’t need the “extras” don’t spend the time.  Another benefit is the reduced testing and maintenance required, since themes are just CSS.

While there are some considerations when developing an intranet solution on SharePoint, the product does not destroy or adversely impact intranet design.  In fact, as Nielsen points out, platforms like SharePoint are optimized to create a solid intranet foundation.  In many ways, SharePoint improves intranet development productivity by reducing the design or implementation effort in other areas of your project.

11 May 2010

Inserting Arbitrary Links in a SharePoint Calendar

Some time ago a client hired us to build a custom web part that, among other things, would color code events based on a category assigned to an event, embed an “information” link into each date of a 30 day calendar view and provide a printable view for a specific month.  At the time, SharePoint 2007 was relatively new, as an organization Consejo had been building custom extensions for SharePoint 2003 for some time and it just made sense to continue down the path of a custom web part.  Interestingly, the task of build a custom calendar web part that would properly display events in an event list is harder than you might think (another story).

First, I would always recommend trying to buy before building; as a developer it’s tempting to build, but usually less expensive long-term to buy.  And, while there were at least one or two commercial web part options that provided color coding (Bamboo’s calendar plus web part was something we seriously considered), nothing gave our client the ability to embed their information link.  The goal for this link was to create a “light” integration between the SharePoint event calendar (where they posted all of their corporate events) and a 3rd party application that would display information related to catering for that date.  Essentially, when you clicked the information link, a new browser window opened to the URL of the event application with the date associated with the specific icon the user clicked.  Pretty simple and easy.

After a far-too-long development cycle to complete, the web part has been generally working within that client’s environment for some time.  However, they recently approached us for an update.  The request kicked off another round of investigation and an epiphany of sorts.

While attending SharePoint Summit 2010 in Montreal, I had the good fortune of attending Mark Miller’s (End User SharePoint) session on enhancing the SharePoint interface through jQuery.  Coincidentally enough, very little of Mark’s talk was about jQuery specifically, though he did share a few examples.  What he did show were numerous ways that you could manipulate the standard SharePoint interface using other JavaScript bits, including color coding a calendar, creating a printable interface and creating a tabbed interface.  Many of these scripts were developed by Christophe Humbert from Path to SharePoint.

After attending the session, trying the color coding script myself (really a combination of a calculated column and JavaScript) and seeing the possibilities, I decided to try my hand at recreating the custom web part we developed using just JavaScript and calculated columns.  While Christophe’s approach helped with the print view and the color coding, he didn’t have an example for the information link.  Fortunately, a little experimenting on my part produced the script shown below.

<script type="text/javascript">
/*
Insert the event icon script
Written by Consejo, Inc.
Questions: info@consejoinc.com
*/

var iterator = document.getElementsByTagName("td");
try
{
var i = 0;
var thisNode;
while (i<=iterator.length - 1 && iterator.length > 0)
{
thisNode = iterator[i];
var moreNodes = thisNode.getElementsByTagName("div")
if(moreNodes != null && moreNodes.length > 0)
{
for( var x = 0; x < thisNode.attributes.length; x++ )
{
if( thisNode.attributes[x].nodeName.toLowerCase() == 'class' && (thisNode.attributes[x].nodeValue.toLowerCase() =='ms-cal-topday' || thisNode.attributes[x].nodeValue.toLowerCase() =='ms-cal-topday-today'))
{
try
{
var onClickEvent = thisNode.getAttributeNode('onclick').nodeValue;
var origEventDate = onClickEvent.substring(16,37);
var cleanUp = new RegExp(/^([1-9]|1[012])+\\u002f+([1-9]|[12][0-9]|3[01])+\\u002f+\d\d\d\d/);
var cleanEventDate = cleanUp.exec(origEventDate)[0];
cleanEventDate = cleanEventDate.replace(/\\u002f/g,"-");

moreNodes[0].innerHTML += "<a href=\"http://www.videodetective.com/dvdcalendar.aspx?week=\"" + cleanEventDate + " style=\"font-size:8px;position:relative;right:-45%;\">Event Info</a>";
}
catch(err){}
}

}
}
i++;
}
}
catch (e)
{
alert( 'Error: ' + e );
}



 


To implement this script, simply copy and paste this JavaScript into a Content Editor Web Part loaded after the calendar view web part.  If you want to enhance the link, simply insert an IMG tag where the text is shown. 


The link in the script is to a site that shows what DVDs were released on the date extracted from the SharePoint calendar’s onClick event; a little regular expression work helps to extract the value provided by SharePoint.    Obviously, you should change the URL in the script to something that meets your needs, unless you really want to know what DVDs are to be released.



I very much want to thank both Mark and Christophe for demonstrating a very light-weight approach to adding new functionality to the SharePoint interface.  Next time, I’ll think twice about writing mountains of C# when trying to achieve a client’s goals.

26 March 2010

Getting to know SharePoint

Coming in May of this year, the new SharePoint 2010 promises to be a vast improvement over the existing 2007 version.  Like the transition from 2003, organizations are struggling to make key decisions about when to move to the latest version and what advantages it might provide.  In many cases, the answer greatly depends on your needs.    For enterprises that don't yet have SharePoint, but are evaluating the tool, the environment is probably even more confusing.

In an effort to help clients better understand both the upcoming version and the ecosystem in general, Consejo will be presenting at several regional and international events over the coming months.  If you're looking for greater insight into how SharePoint may or may not be a fit, I would highly encourage you to attend one of the following upcoming events:

  1. "What's so special about SharePoint" (webinar) hosted by the Real Story Group, 6 April 2010, 1 to 2 p.m. EST.
    The buzz around Microsoft SharePoint has grown steadily since the product's introduction in 2001.  With the advent of SharePoint 2010, the buzz has reached a cacophony.  This raises the question: what's so special about SharePoint.  Shawn Shell, Principal and Founder of Consejo, Inc.  and Tony Byrne, Founder of the Real Story Group will present a one hour webinar to help organization separate fact from fiction and help organizations figure out if SharePoint is right for them.
  2. SharePoint Summit 2010, 12 to 14 April 2010 in Montreal, Canada
    Shawn Shell, Principal and Founder, Consejo, Inc. will be presenting a session on "Managing a successful SharePoint Project" and participating on a panel discussing findability in SharePoint ("Findability to be or not to be").
  3. Midwest SharePoint 2010 Conference hosted by Imerge Consulting, Milwaukee, WI, April 15, 2010
    Shawn Shell, Principal and Founder, Consejo, Inc. will be presenting a session on "SharePoint Tips, Tricks and Traps" to help organizations take advantage of all that SharePoint has to offer, as well as helping them avoid potential pitfalls.
  4. Hardlines Technology Forum hosted by American Hardware Manufacturers Association (AHMA), 18 to 21 April 2010 in Schaumberg, IL
    Adonis Latham, Consultant at Consejo, Inc. will be presenting a session on leveraging InfoPath forms to help enhance SharePoint implementations. 

As the year progresses, there will certainly be more conference opportunities.  If you can't make it to one of these events, subscribe to our RSS feed to ensure you're aware of future events that may be of interest to you.

24 January 2010

Code Signing in Visual Studio 2008

I recently purchased a code signing certificate from GoDaddy.  After a great deal of trouble getting the certificate fully downloaded and installed (more about that later), I then tried to sign the assemblies for an application I had just completed.  To my surprise, I received the an error: “Error Importing Key.  Object already exists.”

After all of the trouble I encountered getting the certificate, I was sure I had the right PFX file, with the private key embedded.  I had chosen that certificate in the signing tab in the assemblies properties correctly.  I was also very sure that I supplied the right password for the private key.  Unfortunately, despite my best efforts, I kept getting the same error.

Thanks to the magic of search with Google, I found loads of articles and discussion groups where users were having similar troubles with the built-in VS signing.  Lots of different solutions were provided.  Unfortunately, none of the approaches worked.  One particular discussion within the forums on MSDN gave a good, though long, summary of all of the ways some developers have tried to fix the code signing problem in Visual Studio 2008.  If you have the patience to review the source material, you’ll find that most blogs or discussions revolve around the same sorts of options; again, none worked for me.

However, I then came across a blog article by John Robbins on code signing.  John gave useful details about a lot of aspects of his challenges, but he also mentioned something I hadn’t seen before: using the sign tool from the Windows SDK to sign the complied assemblies worked for me [NOTE: I’m developing on Windows 7; if you’re using a different version of Windows, you’ll need to download the right version of the SDK for your environment].

While I’m not much for loads of steps and external utilities, John also gave a simple post-build macro you can have VS run.  Based on this blog, this is what is in my post-build for signing the compiled assembly:

"C:\Program Files\Microsoft SDKs\Windows\v7.0\Bin\signtool.exe" sign /f [CERTIFICATE PATH] /p [PASSWORD] /t http://tsa.starfieldtech.com "$(TargetPath)"

The [CERTIFICATE PATH] sequence should be replaced with the path where you stored the certificate locally (the PFX file).  The [PASSWORD] sequence should be replaced with your private key password (not the key itself, but the password you used to secure the key).  The rest of the post build event is pretty generic, except the URL parameter for the timestamp server (the stuff that follows /t).  That particular URL is GoDaddy’s timestamp server.  If you’re using a different CA, you should use the server they provide.

I hope this helps other struggling with the same issue.  If anyone has solved the problem of getting VS to handling signing through the properties dialog, I’d love to hear it. 

05 January 2010

Nielsen/Norman Group’s 10 Best Intranets of 2010

Welcome to 2010!  I hope you had a fantastic new year! 

To start this year on a high note, I wanted to highlight Nielsen/Norman Group’s yearly 10 Best Intranets.   The 2010 edition, like past reports, provides insights into some of the best intranets across organizations of various sizes, shapes and industries.  What I like best about the report (as well as report’s like Jane McConnell’s Global Intranet Trends Report) is the chance to see how different organizations take on the challenge of improving employee productivity through content technologies.

Here are the some of the highlights I discovered:

  • Intranets are getting a higher priority in the enterprise
    Better technology is enabling organization’s to produce better intranets.  NNG also notes the average increase in the size on intranet teams, giving enterprises more resources to produce and maintain these applications; in fact, the average team increased 27% to 14 people from 2009.  In Consejo’s own work, we have seen an increased focus on intranets across all of our clients; this is especially true of organization’s leveraging SharePoint, as much of those implementations involve internally facing applications.
  • Mobile continues to garner attention
    It’s far from a widely adopted feature, but mobile access is becoming increasingly important.  Of the surveyed companies, 30% had special mobile features.  NNG made a specific point about creating unique mobile experiences instead of merely trying to adapt an existing intranet design to a mobile device.  For example, one of our clients built a specific Windows Mobile application to download list items from SharePoint.  NNG cites another client that built an iPhone app for their intranet.
  • Social features gain real traction
    NNG called it the “year of social networking.”  Previously, NNG cautioned organizations about using the word “social” and many of our own clients refuse even use the word; one client prefers to use words like “collaborative” or “interactive” in lieu of social to avoid executive confusion with sites like Facebook.   However, as NNG points out, this trend is reversing and social media (as well as features) is gaining credibility.  For more insight into this area, take a look at the CMS Watch report on Enterprise Collaboration and Community Software.
  • CEO Blogs
    NNG highlights that the typical “boss blog” is getting a bit of a “face lift.”  Instead of the monolithic and “talk at you” approach of historical executive blogs, more organizations are, in NNG’s words, “show[ing] executives with a ‘human face’ and [helping to] make them more approachable.”    Toby Ward at Prescient Digital wrote a terrific blog article on the “8 ingredients of a great  executive blog, ” which summarizes some of the same themes NNG found in their research, specifically the inclusion of social media and audience engagement (like comments).
  • Focus on usability and improving features
    This point is a bit of an interpretation on my part, but NNG cites changes in the ways that organizations are encouraging use.  There’s less of the “built it and they will come” approach and more explicit, upfront research on usability and needs.  At Consejo, we typically encourage our clients to conduct surveys and in-person interviews to ensure the newly designed  intranet creates and improves productivity, as well as reducing the frustration that often accompanies change.  We also use that data to evaluate overall success of the intranet post launch, in addition to conducting post-launch surveys.
  • Continue quality improvement
    A trend that should simply be “par for the course,” NNG cites efforts that many enterprises are taking to improve the quality of their intranets.  Interestingly (at least for a consulting firm that focuses on SharePoint) is that “frequent use of SharePoint” was the first bullet under this heading.  NNG does note that “many other technology platforms were common as well [and that] no one solution guarantees a great intranet,” but I thought it was an interesting point (especially since half of the “winning” intranets in 2009 ran on SharePoint).  As the SharePoint Report 2009 from CMS Watch points out and what we’ve learned through our SharePoint Fast Track offering, collaborative applications like Intranets are definitely a strength of SharePoint; NNG continues to reinforce this idea through their research.  Beyond SharePoint, NNG points out that search continues to be a problem (though improving), editorial workflow is more extensively used to ensure content quality, more organizations are using role-based personalization (as well as personal customization), companies are waking up to the idea that you need to measure success (Trend Micro saved $1.6 MM) and more intranets are creating consistent presentation through the use of page templates (something WCM and portal tools have long included).  All of these trends add up to a vastly different intranet and improved experience.

As 2010 offers fresh opportunities for enterprises to further improve their intranets, it will be interesting to see how the old trends continue and what new trends emerge.  And, while we have seen both successful and unsuccessful intranets in many different kinds of organizations, it’s gratifying to see the progress being made.

We wish all of our clients and potential clients a prosperous new year!  May your intranets bloom!