OneDrive for Business site folders page

o4b

Recently Microsoft updated OneDrive for Business on Office 365 with some new features. Full details can be read in their blog: https://blog.onedrive.com/onedrive-for-business-updates-web-user-experience/

As you can see below a new left navigation item has appeared called ‘Site Folders’.

image

This takes you to a new screen which shows all the sites which you have followed as shown below.

image

Hovering over an item allows you to click into it.

image

Clicking in shows the libraries within the that site.

image

One final observation is that the page itself lives off the ‘Social’ list in the users ‘personal site’ (For the techies out there the MySite Personal site equivalent). So in theory it could be manipulated, although this is of course risky.

Thoughts on the UX and Features for this update

So looking at the implementation as it stands I think there are still some possible enhancements that could be made.

UI Design and considerations for your branding

As you can see from the screen grabs, the site logo is being brought into the UI for the page. So this page suffers the same issue as the ‘Sites’ page when the client branding implementation uses the same site logo for every site. This information becomes repetitive and adds little value. So if you are considering a global branding implementation maybe it would be worth considering a more statically defined ‘logo’ image and allowing the individual sites to use their own logo. This would help this page pop more visually. This global logo in the suite bar is also on Microsoft’s public roadmap for implementation.

Site naming

Site naming is brought even more to the fore for this page (It was already evident on the ‘sites’ page). Many sites are not being named with these features in mine, so when presented with a list like this and the ‘sites’ page the sites are actually hard to differentiate. So when thinking about a site naming scheme it will be important to think about this capability at the same time. How you can message this to end users, especially once the new ‘Group’ features come along and end users have the potential to be creating new site collections associated to mailbox and Yammer groups. Maybe a good method is to provision sites with names to give appropriate length urls then retro fit a more descriptive site title.

Information presented

So there is a very basic collection of information presented, Name and site logo and a followed or modified date depending which level of the hierarchy you are on. In my opinion this isn’t really as useful as it could be. It also causes some confusion with the dates where it switches from date followed to modified. It doesn’t make it clear what was modified, it also doesn’t seem to add value to the experience as you can not filter or sort by either date.

Thoughts about migrating content into Yammer from forums

YammerMig

This article hopes to cover the considerations and possible approach for planning and migrating existing forum content into Yammer. Yammer doesn’t provide any form of ‘migration’ or ‘import’ for other system content. They take the stance that the working paradigms created by Yammer are unique to the platform and that managing the transition from old system to Yammer is where the investments should be made. The Yammer article here describes their high level thoughts on the subject, key for me was the statement:

2. Start fresh with content

Our customers’ experience has shown that technical migrations of content are not generally recommended, as information on Yammer tends to be more ephemeral in nature – not necessarily needed as material for future reference. There is better potential for users to be invested in and engaged with the new network if they are empowered to shape its structure and content themselves.

The realities of Client engagements tends to be slightly less black and white, where most want to consider some form of carry across information into Yammer where they have existing knowledge management forums established. Many of our clients have established forums woven into the day to day behaviours, the information within them can’t be wilted on the vine so to speak.

One key takeaway before diving into the more detailed thoughts….

Consider why you are migrating, unless its aligned to a business benefit realisation or business goal then the effort of the migration is mis-aligned to its value to the organisation. Also consider what your new operating model is, don’t migrate an old operating behaviour along with the content, you MUST migrate the content into the new behaviours and approaches you aim to have using Yammer integrated within your organisation.

Understanding the source forum information

Whatever the technology platform involved whether it is SharePoint forums or another forum technology the key element to a successful migration is auditing and understanding the content within the current forums. Key elements to understand are as follows:

  • Users
  • Forums metadata such as Title, description and logo image
  • Security model
  • Thread content
    • Styles of thread, such as single origin, multi-thread
    • Thread parenting, which forum the earliest multi-origin thread comes from
    • Mentioning users
    • Mentioning metadata
    • Attachments
    • Links
  • Value add activities like adding additional tagging or additional metadata content

From there you need to plan the content destinations in Yammer. Not always will there be a one forum to group mapping. In fact, now may be a sensible time to ‘refactor’ the approach to segregation of the conversations to something that is more relevant or easier to understand.

Users

The source system is unlikely to hold user accounts in the same fashion as Yammer. Therefore a mapping exercise is needed. Yammer users are keyed off the email address (the primary key as such).

A full listing of the users who have interacted with the forum needs to be generated. Alongside this a full extract of the Yammer users information should also be requested. In order to have all users within the Yammer Network you must establish the first date your network existed and pull the data from that date. The Yammer data export will only pull data where a user was interactive for that time period. This means you need to go a long way back for the first extract to get all the required user records. Subsequent users can be pulled in more recent extracts if you need to refresh and append data.

From this point you have the source and destination user lists. The next step is to produce a mapping between them. In general a good approach is to manipulate the records in the source user list to append the email address if possible. If you can get the source users to have a unique email address then you can map them directly against the Yammer user list.

From the mapping exercise you’ll be left with users in both lists who are not matched. Ignore the non-matches in Yammer side as they’re not really going to be a problem for migration as they have never interacted with the source forum. The non matched users in the source user list is where the focus should be placed. You have the following options:

  • Map all non-matched forum users to a generic account in Yammer. Something like Company Alumni, this has the advantage that it’s simple to map, and you can tie everything to one central user. During your Yammer rollout you can then inform the user base about the Alumni user and promote this as historic facts. The disadvantage of this approach is if there is value in knowing who made every thread post. Consider a situation where the discipline for the forum is more detailed and technical, users may still require to know who made which comment in order to trace that individual even outside of the organisation.
  • Map all non-matched forum users to newly created Yammer users. The advantage of this is that the user to thread relationship is maintained. Disadvantages is that you will have to consider how users are managed. If DIRSync is being performed this may be more complex. Also these users need to be active during migration and then suspended once the threads are added.

For the purposes of forum migration it is unlikely you need to consider the values within the user profiles and migrating those, but again this is worth discussing for your scenario.

Groups

Consider how you will be mapping in the existing forums. Do the existing forums contain threads which span wide topics? Could it be beneficial to split the existing forum into smaller segments, in which case the thread mapping to Yammer Groups needs to establish this. Also consider that the groups may not yet exist, so you might have to work out the creation and admin assignment as well. Be careful not to orphan any threads which are topics that no longer fit into the Yammer Group structure.

Also the big difference between Yammer Groups and many forum based technologies is that the Yammer Groups lack any form of hierarchy, so where a source forum may be grouping several sub sections the Yammer Groups don’t behave in this fashion. My thoughts here is that you should structure the Yammer Network to support the new working patterns you are creating. It is likely that the Yammer rollout is in support of other initiatives. So consider if the new Groups are topic/subject centric now, and how you might have to map threads into these topics. Many of the implementations we have been rolling out use a SharePoint site to aggregate the groups into a form of hierarchy or associations. This is a loose coupling though and a sensible approach, the association to hierarchy is only appropriate if the user scenario warrants it, such as a knowledge network.

Group metadata such as name, logo and description are also key for discovery by users within the Yammer Network. Consider also telling users which the primary language is for the group. Yammer has a pretty good translation mechanism using Bing Translate, but some groups naturally centre around a specific language.

Consider User membership for new Yammer Groups, do you want to add the users from the existing forums to the new Yammer Group? Sometimes this is a straight mapping one to one, sometimes if you re-jig the structure it becomes more complex. A simple algorithm is to capture all the users involved in the group threads and make sure they get added to the Group members. Again this in principal goes against what I’d normally be proposing, Users really shouldn’t be forcibly added to group it’s bad practice for good engagement and really annoys people.

Threads and Content

Threads and content form the cornerstone of the forum experience, in Yammer these map roughly to ‘Conversations’ and individual ‘Yams’. The Yammer paradigm is quite straight forward structure wise.

  • Network – The overall container for all the content
  • Groups – The segmentation of the content within the network into groupings of people who generate content
  • Conversation (aka a thread) – The conversations which are started and replied too
  • Yam (aka a message) – An individual post within the conversation thread.

Basics

Each thread message needs to be analysed for the following:

  • It’s parent message, so that it can be correctly associated into a new Yammer conversation
  • Any forum members mentioned in the content, so that the correct @mentions can be inserted into the new Yam
  • Any tagging used, so that the correct @mentions can be inserted into the new Yam (I know it sounds weird to say @ mentions again, but the user and tags are effectively the same with some meta data differences)
  • Any attachments being referenced by the message, so that the correct handling approach can be used (more about attachments in a minute)
  • Any Hrefs within the content, so that you can decide how to deal with the link (more about that in a few more lines)

Links

Handling Hrefs can take a couple of formats:

  • Keep them as is and just ensure they map into the content specification of Yammer
  • Modify the url against a mapping rule set, creating a permanent redirection to other migrated content
  • Modify the url against a mapping service, creating a permanent redirection but to something that can manage the redirection as content moves around in supporting platforms

If you go for an external link redirection service consider how long this will be in place for. Consider the overall benefits of redirection and watch the analytics tracing to ensure that users are still getting benefits from the service.

I did consider using SharePoint query rules as a way to manage redirection. Imagine that you create key threads in Yammer, you can create the links within them to point to a SharePoint site, each site can have its own query rules for content promotion. So where you’re knowledge management community also has a SharePoint site collection you can implement a local collection of search schema search query rules. If you take this approach you can effectively ‘map’ a Href into a search based url with specific terms. Then it fires across to SharePoint and the relevant promoted results would be presented.

Attachments

Dealing with attachments can take several forms:

  • Uploading the content into Yammer directly and effectively storing that content in Yammer
  • Making reference to external sources such as a web page where the content lives

Depending on your requirements may mean choosing the option most relevant almost on a message by message basis. My recommendation would be to store information outside of Yammer where it better aligns with collaboration systems such as Office365 sites, and upload directly where it makes more sense as social content. The obvious examples are a rule set which treats all Office document formats as upload to SharePoint and things such as images go into Yammer. You may also decide to treat some messages as ‘OpenGraph’ and have Yammer treat them as more like a notification than a message.

Thread sharing

Yammer allows a thread to be shared once created to another group. When sharing the thread sharer can choose to add additional text to the conversation share. Once shared the thread is effectively a new thread with its own content. So with this in mind you need to analyse the forum sharing paradigm in the current forums and decide how to map them into Yammer.

In situations where a thread appears across multiple forums. For example:

  • Original post goes into forum A, then is shared to forum B and C
  • When a user view either forum A,B or C the entire thread appears, thus capturing all the conversation once, but displaying it in multiple places

You need to consider how this maps into the Yammer sharing paradigm. I think the most sensible approach is to decide which Yammer Group the thread is most suited for, this is probably a manual decision in most cases. Once targeted for a specific group post the whole thread to that group, then share the complete thread into other groups. It might also be work retrospectively adding ‘tags’ to the thread.

Topics

Yammer has a tagging concept called ‘Topics’. Each thread can be tagged with topics to help discoverability. A user can elect to follow a specific Topic. So when migrating content analyse the content for potential topics and ensure they are tagged in the Yam with Topics. This is a value add activity and would require quite a lot of intelligence to identify topics in existing threads.

Dates

As you add new Yams to the Yammer threads you can’t influence the date stamp. So if you require date stamps to be known the only real solution is to append the information into the Yam text.

Security

Always a thorny issue, the conflicting paradigms of information security and engagement and openness working like a network.

There is definitely no right answer about how to handle security, so these thoughts are where I’d propose you started.

Yammer’s paradigm really needs Yammer Groups to remain publically visible and readable to reap the benefits from working like a network. So you need to plan how to ensure information which might have been secure remains so. Often the existing forums are restricted security wise by ‘membership’ as a way to keep a tight control of who can edit, often driven by reporting and funding concerns about membership numbers rather than true data sensitivity. For this scenario in most cases adopting the public group paradigm is fine.

Where you need a private group, say for example the Board, then using a Private group is perfectly acceptable.

You will need to audit the information in every thread for its compliance if you want to be 100% sure that you’ve not shown restricted information from the existing forums in the new Yammer Groups.

User engagement and roll out

Although not strictly migration in the technical sense don’t under estimate how you need to deal with users moving them from the old world into the new. Thinking about how to help users find threads that have moved.

One possible solution to this is to add a new reply in the existing forums which contains information about the thread location within Yammer. This helps anyone who has the old thread bookmarked come away with a smile as they can navigate to the Yammer conversation and continue the discussions. It also allows for a time of dual running where some but not all threads have made it into Yammer.

Another aspect to consider is publishing the whole process for the end user to read. Sounds little bonkers at first, why should users care or be told about the internals of an IT project. Well if you think about what Yammer has as a central pillar… it’s openness. So help users get into the correct mind set.

Yammer Technical

App Registration

The processing app must be registered within Yammer. Instructions for the App Registration process can be found in the Yammer Developer Center: https://developer.yammer.com/introduction/#gs-registerapp

Once the migration processing app is registered the Client Id and Client secret can be used by the app to make calls into the Yammer Network.

Authentication

The processing app must authenticate to Yammer in order to make calls the API. Information about the authentication process and options can be found in the Yammer Developer Center: https://developer.yammer.com/authentication/

OAuth Impersonation

To interact with the Yammer API on behalf of another user you will need to use a Verified Admin account for the processing app and have it call the relevant REST API endpoint to collect the user token for the user in question. Information about impersonation can be found in the Yammer Developer Center: https://developer.yammer.com/authentication/#a-impersonation

Users

The Yammer API allows you to retrieve, create, update and suspend (soft delete) users. Information about the exact API call format can be found here: https://developer.yammer.com/restapi/#rest-users

Rate limits

The migration processing app must have logic to throttle the calls made to Yammer as to not exceed these thresholds. It should also monitor the responses and act accordingly to retry and ensure data integrity in the event of API calls being blocked. Information about the Yammer REST API rate limits can be found on the Yammer Developer Center: https://developer.yammer.com/restapi/#rest-ratelimits

The content at the time of writing is as follows:

API calls are subject to rate limiting. Exceeding any rate limits will result in all endpoints returning a status code of 429 (Too Many Requests). Rate limits are per user per app. There are four rate limits:

Autocomplete: 10 requests in 10 seconds.

Messages: 10 requests in 30 seconds.

Notifications: 10 requests in 30 seconds.

All Other Resources: 10 requests in 10 seconds.

These limits are independent e.g. in the same 30 seconds period, you could make 10 message calls and 10 notification calls

Pre-reqs

Also useful during the process is the availability of an Enterprise Yammer network, mainly so you can get the admin functions like data export and impersonation working. The question over having a discreet ‘dev’ network came up, my personal thoughts are as follows. If you’re not ‘live’ with Yammer while doing the migration work then why not simplify the moving parts by keeping just the main Network. At the end of the day you can always try things in a private group first to write your processing code, then open it up once the code is tested. Worst case you add messages you need to delete later. This keeps costs down. If however you’re already using Yammer, then best to go for multiple Networks. Again it’s your choice, but Yammer is a service that you can’t actually customise, so your options are safer in my opinion.

NB: This information is my pre-execution thinking and hopefully after the work is complete I’ll come back and make any amendments to the information.

SharePoint Evolution Roadshow 2014 session If apps are the answer what was the solution

SP Evo Conf

Wednesday June 11th saw the SharePoint Evolution roadshow roll into Cambridge. Bringing with it the weather Smile and a collection of SharePoint experts from around the globe.

The full days agenda can be seen here: https://www.sharepointevolutionconference.com/abstracts.html#camt1

My session kicked off the days ‘Technical’ track. The session described the evolution in thinking required when you move from the traditional SharePoint full trust solution model towards the SharePoint App model. Having been working with SharePoint apps since the pre-release program of SharePoint 2013 the session aimed to share my experiences and lessons learnt around the solution design approaches. The slides from the session are below.

 

Example Yammer analytics reporting

So over a couple of Yammer rollouts now this is a collection of the reporting that has been requested.

This is a possible collection of analytic reports for Yammer:

Group user membership activity

  1. As a group owner I would like to view the breakdown of new joiners to the group.
    • So that I can make sure they are introduced and helped to get started by community managers in my group.
  2. As a group owner I would like to view the breakdown of leavers from the group.
    • So that I can understand who is no longer part of the group and contact them to discuss why.
  3. As a group owner I would like to compare a list of users who are tagging with specified ‘topics’ against whether they are members of the group. (this one is to help me find new members based on understanding who is using tags this group uses but is not currently a member of the group).
    • So I can invite non-members to the group as they are tagging with topics central to the group.
  4. As a group owner I would like to identify users who are making positive/negative contributions.
    • So that I can drive engagement by understanding how to focus the community management to drive positive contributions.

Group activity

  1. As a group owner I would like to view the breakdown of current participation within the group members based on their contribution activity levels. Users can either be ‘lurking’, ‘active’ or ‘very active’.
    • So that I can encourage increased positive participation.
  2. As a group owner I would like to know how much activity new joiners are generating in the group.
    • So that I can help new users become involved within the group and increase my groups positive contributions.
  3. As a group owner I would like to know how many new threads were created in the group.
    • So that I can ensure that the group is engaged in new conversations.
  4. As a group owner I would like to know how many threads have been revived which were dormant in the group.
    • So that I can understand if existing content is generating new activity and why that activity may have occurred.
  5. As a group owner I would like to know a ranking of threads based on length of conversations (number of subsequent Yams).
    • So that I can see which conversations generated the most discussion.
  6. As a group owner I would like to know a ranking of threads based on number of user participants.
    • So that I can see the conversations which engaged the largest numbers of users, this will allow me to understand why the conversation was popular and tailor any future community management activity.
  7. As a group owner I would like to know a ranking of threads based on ‘likes’.
    • So I can see which conversations were liked, so that I can understand if any follow ups could be useful based on the conversation topics.
  8. As a group owner I would like to know a ranking of threads based on ‘topics’.
    • So I can see how the folksonomy within the group is forming and help guide it.
  9. As a group owner I would like to know a ranking of threads based on ‘shares’.
    • So I can see which threads are being shared and where they are shared to help build new relationships with other groups.
  10. As a group owner I would like to know a ranking of threads with ‘praise’.
    • So I can see which users have been praised within the group and that praise liked the most, thus support for the praise.
  11. As a group owner I would like to know a ranking of which threads were most responsive (the time between Yams being shortest).
    • So that I can see which were ‘hot’ conversations and determine why that might have been, was it topic, peoples availability.
  12. As a group owner I would like to list any threads with zero replies.
    • So that I can help the author of the yam get an answer or help them find someone who could help.
  13. As a group owner I would like to view the distinct users yamming in the group.
    • So that I can see who my active users are in the group.
  14. As a group owner I would like to view all the polls performed in the group.
    • So that I can see what people are polling about and help shape future group engagement.
  15. As a group owner I would like to view all the praise in the group.
    • So that I can see who has been making good contributions.
  16. As a group owner I would like to know how much activity has been done around the group notes.
    • So that I can understand how much content is being generated and maintained within the group.
  17. As a group owner I would like to know about the file activity within the group, such as type/size.
    • So that I can understand how much file based content is being stored within the group and what types of content it is.
  18. As a group owner I would like to understand any content which has been deleted from the group.
    • So that I can understand why it was deleted.
  19. As a group owner I would like to understand the level of positive versus negative yams within the group.
    • So that I can understand the split of positive and negative sentiment.
  20. As a group owner I would like to understand the top users contributing to the group.
    • So that I can champion them as influencers within the group.
  21. As a group owner I would like to understand the average thread number within the group.
    • So that I can improve engagement.

Demographics

  1. As a group owner I would like to map the locations of my group members.
    • So that I can understand the location spread of group members to help me target information.
  2. As a group owner I would like to view a breakdown of my group membership by job role.
    • So that I can understand the role areas my group covers to help me target information.
  3. As a group owner I would like to view a breakdown of my group membership by job grade.
    • So that I can understand the grades for the group members to help target information.
  4. As a group owner I would like to view a breakdown of my group membership by length of service.
    • So that I can understand how to engage with people in the group.
  5. As a group owner I would like to view a breakdown of my group membership by organisation element such as division.
    • So that I can understand which areas of the business are coming together.
  6. As a group owner I would like to view a breakdown of my group membership by primary language.
    • So that I can tailor the language guidance for the group.
  7. As a group owner I would like to view a breakdown of my group membership by region.
    • So that I can understand which regions are coming together within the group.
  8. As a group owner I would like to view a breakdown of my group membership by office location.
    • So that I can tailor activity to drive engagement for a specific office location.

Overall Network activity

  1. As a network leader I would like to understand the level of positive versus negative comments across the network tracked over a period of time.
    • So that I can understand the sentiment of the network usage to help foster a positive environment.
  2. As a network leader I would like to understand the total number of users within the network.
    • So that I can understand how much of the business is a member of the network.
  3. As a network leader I would like to have a list of user who are not directly part of the business within the network.
    • So that I can ensure compliance and security considerations are being managed correctly.
  4. As a network leader I would like to understand the total number of yams across the network tracked over a period of time.
    • So that I can ensure the business is utilising the network.
  5. As a network leader I would like to understand the topics being used across the network.
    • So that I can understand which subjects my organisation are discussing.
  6. As a network leader I would like to understand the number of yams which do not have a reply across the network.
    • So that I can chase up the community leaders for those groups to help get a response.
  7. As a network leader I would like to identify top influencers and champions across the network.
    • So that I can understand who the champions are and why they are influencers.
  8. As a network leader I would like to identify my most active groups and those under threat of becoming dormant.
    • So that I can promote them within the organisation.
  9. As a network leader I would like to view an activity trend over time across the network.
    • To ensure I understand what has been active and to ensure the network engagement is growing within the organisation.
  10. As a network leader I would like a list of top users by contributions across the network.
    • So that I can promote these individuals to the network as champions.
  11. As a network leader I would like a list of top groups by contributions across the network.
    • So that I can understand the most engaged groups.
  12. As a network leader I would like a list of users mentioned the most across the network.
    • So that I can understand who is being brought into conversations across the network.
  13. As a network leader I would like a list of the users with the most followers across the network.
    • So that I can understand where the spheres of influence are within the network.
  14. As a network leader I would like a list of the network admins.
    • So that I can ensure the right people are performing the role.
  15. As a network leader I would like a list of group admins across the network.
    • So that I can ensure the right people are performing the community manager roles within groups.
  16. As a network leader I would like to know a ranking of users by group admin.
    • So that I can see which users are managing the most groups in order to make sure they are provided the support to provide the right engagement.

I’d welcome any additional requests or comments on those listed above. I’ve listed them with numbers to help with any commenting.

Data model for the Yammer export files

With the Enterprise version of Yammer as an admin you can export your network from a selected date up to current. The files that are exported contain the information within your network. This post is a quick run through the data model from the files. Where I can see examples of the data types in the csv I have detailed them.

Files that come from the export page:

Admins.csv

  • Id > number
  • Name > text
  • Email > email
  • Verified > TRUE/FALSE

Files.csv

  • Id > number
  • File_id > number
  • Name > text
  • Description > text
  • Uploader_id > number
  • Uploader_type > enum (User/
  • Group_id > number
  • Group_name > text
  • Reverted_to_id > ?? Assume number
  • Deleted_by_user_id > ?? Assume number
  • In_private_group > TRUE/FALSE
  • In_private_conversation > TRUE/FALSE
  • File_api_url > URI
  • Download_url > URI
  • Path > file path
  • Uploaded_at > date
  • Deleted_at > date

Groups.csv

  • Id > number
  • Name > text
  • Description > text
  • Private > TRUE/FALSE
  • Moderated > TRUE/FALSE
  • Api_url > URI
  • Created_by_id > number
  • Created_by_type > enum (USER/)
  • Created_at > date
  • Updated_at > date
  • Deleted > TRUE/FALSE

Messages.csv

  • Id > number
  • Replied_to_id > number
  • Thread_id > number
  • Conversation_id > ?? Assume number
  • Group_id > number
  • Group_name > text
  • Participants > text
  • In_private_group > TRUE/FALSE
  • In_private_conversation > TRUE/FALSE
  • Sender_id > number
  • Sender_type > enum (USER/)
  • Sender_name > text
  • Sender_email > email
  • Body > text
  • Api_url > URI
  • Attachments > text (opengraphobject:)
  • Deleted_by_id > number
  • Deleted_by_type > enum
  • Created_at > date
  • Deleted_at > date

Pages.csv

  • Id > number
  • Page_id > number
  • Creator_user_id > number
  • Published_by_user_id > number
  • Collaborator_user_ids > number (something weird with this column)
  • Name > text
  • Group_id > number
  • Group_name > text
  • Reverted_to_id > number
  • Deleted_by_id > number
  • Deleted_by_type > Enum
  • In_private_group > TRUE/FALSE
  • Page_api_url > URI
  • Download_url > URI
  • Path > file path
  • Published_at > date
  • Deleted_at > date

Topics.csv

  • Id > number
  • Name > text
  • Created_by > number
  • Created_at > date
  • Api_url >URI

Users.csv

  • Id > number
  • Name > text
  • Email > email
  • Job_title > text
  • Location > text
  • Department > text
  • Api_url > URI
  • Deleted_by_id > number
  • Deleted_by_type > enum
  • Joined_at > ?? Assume date
  • Deleted_at > date
  • Suspended_by_id > number
  • Suspended_by_type > enum (USER)
  • Suspended_at > date
  • Guid > guid
  • State > enum (soft_delete/active

Office 365 new profile page

Microsoft recently announced improvements to the ‘Profile’ page in Office365

The image below shows what the new page looks like.

image

And when viewing someone else

image

Some observations from this update:

  • The page url has changed to ‘PersonImmersive.aspx’ which is interesting and my gut feel is this might start to help with the unification of Office365 ‘product’ stack into one platform. Think about how Yammer profiles might fit in the future, as we’ve already seen some hints that the Yammer UI will drop inside the Office365 suite bar (the blue strip at the top).
  • Documents in common is pretty awesome, more of that in another post.
  • You no longer get skills and org chart information listed. So again wild speculation time…. I would have a punt that Microsoft are beginning to recognise skills via the Social and Oslo search algorithms and will be pushing this as the way to create skills searches rather than traditional attribute driven profile searching. For me there is a balance between these approaches that needs to remain, most organisations still need formally recognised attributes as well as activity driven information about these people dimensions.
  • The profile fields in ‘edit’ have remained the same as always, in fact we have seen customisations to the native list being reverted to OOTB (ie descriptions going AWOL).
  • This change has altered the view on other ‘MySite’ host pages like OneDrive as the profile picture has been removed. To me this has made it even harder to directly navigate to your profile page unless you search.
  • The master page being used has a 16 major version.
  • For me the presence bar next to the photo is being lost in the visuals.

So that’s a quick brain dump of some random thoughts about this update.

An introduction to PowerBI

PowerBI

PowerBI is the cloud version of Microsoft BI stack. After seeing some awesome things at SPC14 I decided to take a dive into the course material on MVA.

Notes from watching the MVA course on PowerBI

(MVA training course)

Power Query

(MVA session)

Power Query represents the ‘getting data’ part of the stack. It’s available as an Excel 2013 plugin (Download from Microsoft). Over time this will be the way to get data into Excel, replacing the ‘Data’ and Power Pivot ‘Data’ ribbon features.

It has a huge number of available data source connectors:

  • From web which can pull in web based data sources
  • From file which can pull in from files like csv
  • From database which can pull from a wide variety of database systems
  • From other sources, basically a collection not matching the above categories such as SharePoint lists, the Azure services, Facebook

This list will continue to grow as the Microsoft team build more and more extensions.

There is a great feature for finding data. The ‘Online Search’ can find published data and queries from across the web (Microsoft maintain a huge collection in their catalogue), from you internal organisations catalogue and from shared queries.

Once a query is configured Power Query does as much as it can to pass the right query to the datasource. So for example if you’re pulling relational data from a DBMS Power Query is passing down the restrictive query to that DBMS to push the query load onto that system. This helps to ensure performance is optimal. Where a user is using flat files then it really can’t be offloaded so the local machine bears the brunt of the performance hit. This would be something to consider when designing solutions. I personally think this intelligence is amazing and could really play well when designing a self service BI solution.

The query can pull the data into either the local Worksheet or into the Data Model. Pulling into the Worksheet is really best employed where the dataset is of the smaller end of the spectrum, pulling into the Data Model is where larger data collections would benefit. Also consider your file size, bringing the data into the model drastically reduces its footprint. They gave an example of a 4Gb file being compressed into about 160mb file. This is important when you consider the maximum file size in PowerBI is 250mb.

Another neat feature is pulling data from a ‘folder’ into one collection. So you can bring together multiple csv files for example in a straight forward fashion.

The query can actually parse things like JSON which opens up possibilities to call data services and simply transform them to tables and related tables.

Power Query Editor

Once you create a new PowerQuery it launches the editor where you can perform loads of neat things on the data.

  • Manipulate the columns, like ordering, name, format, using them as headers
  • Splitting columns by delimiters etc.
  • Filtering
  • Removing duplicates
  • Merging additional queries into the same sheet, thus merging datasets
    • Bringing in just columns you want
    • Creating your own dimensions
    • Choosing which columns you merge on
  • Unpivoting data, as you often get data in a pivoted format as it is generally how it gets presented for reporting
  • Formula bar, which allows you to use the query language to create additional data interactions

Data stewardship

(MVA session)

Session about examining the problem space, what are the things business is trying to solve?

Information challenges:

  • Searching for data takes time, there are lots of useful datasets within an organisation which are often not available to others
  • Preparing it for use takes time, it is not always clean or in a sensible format for reuse, lots of redundant processing
  • IT spends time trying to service requests, due to the platforms and processes most users have to get IT to do the heavy lifting to create views, reports etc., they also often can’t react in a timeframe the business needs
  • IT has to also govern access and data use
  • Lack of trust is significant with business user community, because the stewardship of the data is often unknown most users question the validity or authenticity of the data

In some organisations the role of ‘Data Steward’ exists. These people tend to have a foot in both end user and IT camps. They tend to have understanding of what IT have provisioned and what the business needs.

Quote from Gartner “… only business users close to the content can evaluate information in its business context”

Data stewards can promote queries into the corporate data catalogue and help the business users understand them.

(note to self – using Yammer groups to help here would be worth looking at)

It’s an interesting viewpoint. Consider a scenario where a dataset is held in an Excel workbook and that gets emailed to another person. At this stage you have now forked the data and it has instantly become less trust worthy and accurate. Now imagine if instead you’d shared the query, now the data remains a single source and thus more trust worthy. In business it’s often the earlier stages of report creating that datasets which could be useful to be shared are created. By looking to share the queries rather than the end product reporting we are enabling more uses of the data building blocks.

The common steps an information worker is taking:

  • Identifying the need, what is the problem they are trying to solve
  • Identifying the data, what data could help them solve the problem, which domains are they from, who owns them

The ‘Data Steward’

(taken from the MVA slides)

image

Data Catalogue

This is the way we can promote the data:

  • Stores and process the metadata about the data sources available, users and their relationships
  • Provides the search functionality
  • Connects to the corporate data through the integration layer

It is a set of Office365 services.

Important note, sharing to the catalogue is only sharing the metadata of the query not the queried data itself. So the important thing to realise is the user who executes the query needs to have access to the data still.

Power Query

For Information workers:

  • Search for and access relevant data
  • Filter and merge data

For Data stewards:

  • Define repeatable data queries
  • Publish and share and annotate those queries

Data Management Portal

  • Manage metadata shared queries and published data sources
  • Monitor telemetry, the usages search etc.
  • Gain insight on data lineage

Admin Centre

  • Govern the data integration layer, admin the on-prem access

Data Publishing

Diagram taken from MVA session

image

Shows the multiple ways to publish your data to the data catalogue.

Every Office365 PowerBI tenant gets their own ‘Corporate Data Catalogue’.

The admin centre in Office365 looks something like this

image

By default when a user searches they search across both Corporate and the Microsoft public catalogues.

Some of the old drawbacks about documenting data services were that often finding the endpoint service and reading about it were disconnected. This led people to question the investment in the documentation as it was often missed. With PowerBI this descriptive is right there next to the result in PowerQuery making the metadata instantly accessible and therefore valuable.

To get all these capabilities you need to be ‘signed in’ to the PowerQuery via your tenant. Sounds obvious but its very important to factor into the messages during rollout.

Share Query dialog

So as the Data Steward you can choose to ‘share’ your query from within Power Query once you’re happy with the query configuration.

The example from the session looked like this.

image

So the shared query has the following:

  • Name which is the visible name for that query, here you should be descriptive to help people quickly scan a list for it
  • Description, helping further explain the data query, one point to think about is what sort of copy style your organisation needs, it shows up anywhere the query appears
  • Data sources, this lists those data sources being used inside this query, this will be important when you consider the data lineage
  • Sharing settings, if the user sharing is part of the ‘Data Steward’ role then they can certify the data as officially supported/verified as truth, ‘Share with’ is pretty obvious
  • Documentation url, the url to anything which is classed as the documentation, in larger organisations this could be the direct document office online url
  • Upload preview rows, does exactly what it says on the tin

Note that the data sources within the organisation can themselves be annotated to provide friendly information to the user. In the dialog above the ‘view portal’ link goes to the PowerBI admin screen which allows further description to be created for that data source. Notice the contact information to help a user to gain access to this resource.

image

Some insights from the analytics would allow you to work out the highest utilised queries/data sources and some that show up a lot in search but are rarely used. All this starts to help drive value and returns from the exploration and sharing of corporate data.

Power View

(MVA Session)

PowerView is the ‘visualise’ element of PowerBI. It is the interactive, data exploration, visualisation and presentation capability. It is based in Excel 2013.

The session scenario:

image

A retailer establishment who’s sales are collected through the POS system and contained in the traditional hierarchy of Category – Sub Category – Item

The role in the scenario is of the ‘Bar Owner’ who has little technical experience but wants to analyse his POS data to create some targeted promotions.

The demo brought in data into a Power Pivot model as below:

image

The basic step to start is to go into your sheet and from the ‘Insert’ ribbon choose ‘Power View’. The Power View brings in all the available fields and tables from the data model.

Three ways to add fields to the canvas:

  • Check the check box in the fields list in the tool pane
  • Drag it to the canvas
  • Drag it to the ‘Fields’ list in the tool pane

Once you have selected the fields you can change the representation from the ribbon options. Manipulating the display is as easy as selecting the ‘style’ you desire and from the tool pane you can manipulate the fields and filters.

It has some very neat features that when you interact with one of the graphs it will highlight the same data pivots in other graphs in the sheet. This ‘cross highlighting’ works across all the graphs in the view. Even legends are interactive.

Removing the title from individual graphs is done by selecting the graph and from the ‘Layout’ ribbon selecting ‘None’ from the ‘Title’ button.

By the end of the report creation it looked like this

image

If the default colours and design are not to your liking you can change the theme and background from the ribbon.

To add filters to the report, simply drag them from the tool pane list onto the ‘Filters’ section of the report.

Due to the interactivity of the report, a user can really drill down and use the canvas elements to gain insights into their data.

Demo included adding a ‘KPI’ from the PowerPivot ribbon.

image

Pick the column to base the KPI from and then configure the values and display as you require. Once added it will update the PowerPivot data model and this new field appears in the Power View tool pane for selection (it has a traffic light icon).

Adding a in canvas filter is as simple as dragging the field from the tool pane onto the canvas. It will then add that single column onto the canvas, but we can go a step further and turn it into a ‘Slicer’ from the ribbon. Now when a user selects a value from that column it cross highlights the rest of the canvas.

Demo then showed how to rollup the view using ‘Matrix’ for the main table and enabling the ‘Show levels’ to rollup the data further. To modify which columns get displayed is again done through the tool pane options.

In the tool pane when you drag a single field to the ‘Tile By’ option and it creates tabs which creates a design surface within the tabs. You then set up the graphs within this surface.

Power Map

(MVA Session)

Power Map is the mapping visualisations for your data.

Different steps to go through to create a Power Map visualisation:

  • Map data
    • Data in Excel, Power Pivot data model
    • Geo-code with Bing
    • 3D and 4D visuals
  • Discover insights
    • Play over time frames
    • Annotate anything interesting
    • Capture a timeframe as a scene
  • Share
    • Add effects
    • Interactive touring
    • Share workbooks

From the ribbon you can choose the ‘Map’ option.

image

Building a new tour

A tour allows you to present the information and guide the viewer across it.

image

The left hand side is the scenes, the centre is the scene content and the right hand side is the data.

Interesting note is that the ‘other’ column can basically allow you to map anything that the Bing mapping API could map to be used from your data. The example given was airport codes.

image

Adding more than just text annotation, the example here is a picture

image

During a tour you can still interact with the map, pause and drill down into the display.

image

PowerBI and mobile BI

(MVA Session)

You can add the PowerBI from the app catalogue.

As a note you can default site samples into your PowerBI site to help you get an understanding of some of the features.

To have PowerBI features light up for a specific Excel document it needs to be ‘Enabled’ in the options (part of the tile).

From the PowerBI dashboard clicking the file opens it within the Office Online.

‘Featured Reports’ is an interesting feature as it allows you to promote a report across all the users of your PowerBI capability. This is a simple as clicking ‘Add to featured reports’ from the tile context menu. There are no specified limits to the number of reports that can be set to ‘featured’.

If you don’t want to share a report to everyone but still want a short cut for it you can select ‘Favourite’ from the tile context menu to effectively pin this report as favourite. These are then found in the ‘My Power BI’ in the suitebar menu.

You can also schedule a data refresh from the tile context menu. This will call the data source and invoke a data refresh into the report.

Mobile PowerBI

You can install the Windows 8 app from the store. (Interesting it’s mobile when in fact its the Windows OS Winking smile)

By default it contains the Microsoft sample data. As seen in the screen grab below.

image

You can then add your own reports by ‘Browse’ from the context bar, select your site and pick up the Excel file containing your report. Tag it as favourite and it’ll show up on the main dashboard. Clicking into the report will then load the same Power View report as you would see in the browser.

image

You can also take advantage of the normal ‘Share’ capability from Windows 8. Here I’m choosing to share a report via email.

image

The thumbnails for the reports are also dynamically updated at intervals to reflect the actual view of the report. So even this adds a ‘peek’ style to the dashboard.

Natural Language Querying with Q&A

(MVA Session)

Q&A is natural language querying. Its primary focus is about data exploration.

Key problems Q&A is aiming to assist organisations with:

  • How do I find the right data to answer the question I have at this point in time? There could be numerous data sources and how would you know which one to look at?
  • How do I find the right answer from within the huge collection of reports? Maybe the reports just don’t give the right slice of data or present the information in a form which makes sense.

So Q&A was born to address both of these challenges.

The demo scenario is covering a typical customer data model.

image

From within the PowerBI site to enable a Excel workbook for Q&A you choose the ‘Add to Q&A’ from the tile context menu.

image

This is an important step to remember as Q&A only searches within ‘enabled’ workbooks. Another thing to note is that SharePoint permissions still dictate what a user can access. For example if a workbook is only shared with certain people, then only those people can Q&A against it even though it is enabled.

To use Q&A you click the option in your PowerBI site and you’ll see something like this below.

image

Notice that the UX is very ‘search’ like, this was done consciously by Microsoft to entice users to use Q&A like they would a search engine.

So after the user starts to type a question the Q&A begins to work its magic. Immediately it narrows down which data models it might be using. Notice the blue text below the query box is the ‘Restatement’, this is how Q&A is transforming your typed question and querying the data models. Also below that are query suggestions that Q&A thinks you might also be trying to perform.

image

A really neat feature is the visual representation of the returned query is best guessed by Q&A to provide the user with what it considers the best display for the results. On top of this is can also apply filters, as you can see I’ve added a ordering to the query.

image

As you can see the filter pane is also available within the canvas for further filtering and settings.

The query box will also help the user because it greys out words which it can’t map to the data model.

Building models for Q&A

Sometimes there are things that just need some extra work to help Q&A assist the user. Things like naming conventions in the data model versus the naming the average business user uses. You can use ‘Synonyms’ in the data model to teach Q&A the other terms.

The formatting and modelling you use to drive Power View is also supporting Q&A providing a better experience.

  • Use the correct data type for columns to help Q&A understand how to make the query to the model.
  • Set up the ‘Default Field Set’ from the ‘Advanced’ ribbon. These settings determine which fields are brought onto the canvas in Power View and they also allow Q&A to display those fields when a user just types the name of the table.
  • Set up the ‘Table Behaviour’ from the ‘Advanced’ ribbon. Setting the ‘Default Label’ allows Q&A to use the correct axis.
  • Set up ‘Synonyms’ within the data model from the ‘Advanced’ ribbon.

Note: At the time of writing this feature only comes with the Office 365 Office version from your tenant software subscription.

Synonyms are displayed within a tool pane against your model. Within each field you can add other words which might be used while looking for that column in a comma delimited list. The first one listed is the ‘primary noun’ for that entity, this is what Q&A will use in the restatement (the blue text under the user entered query).

image

Sharing with Q&A

The first option is to simply copy the url, like most search experiences, once you enter a query the url reflects this query. Thus you can distribute this url to other to effectively reuse. If you think about this wider, imagine you are asked a question by a business user, you can now find the data via Q&A and help them jump in, and then further explore from that point.

The second option is to add the question the ‘Featured Questions’ in the PowerBI site.

image

This allows you to setup various settings for the question before adding it, such as the question itself, whether to show it on the home screen, size and colour and finally and image. The image below is the home screen with the question added.

image

This image is of the Q&A screen with the question listed.

image

Behind the scenes in Q&A

The overall steps are:

Search for interpretations of question – looking across all the workbooks enabled for Q&A and finding which ones could answer the question.

image

Score and select the best interpretation – ranking the workbooks answering capability.

image

This ‘Ranking’ means that Q&A will be using the top option.

image

Select best visual – determine which visual can explain the answer. This runs through a rules engine.

image

Influencing the best answer

Search for interpretations of question > Use data modelling and synonyms

Score and select best interpretation > workbooks in the site

Select best visual > data modelling (data types, data categories)

Data Management Gateway

(MVA Session)

The Data Management Gateway has three main capabilities:

  • How can I enable corporate data feeds over OData
  • How can I enable discovery in Power Query, enabling people to find data
  • How can I refresh Excel Workbook data suing SharePoint Online

The conceptual layout for the Data Management Gateway is detailed in the diagram.

image

The Data Management Gateway sits in two places, one on-prem through a client and one online through PowerBI (PowerBI admin centre).

How does it work?

OData feeds through the Data Management Gateway

image

  1. Power Query requests data from the OData feed
  2. Data Management Gateway connects to the data source
  3. Results are returned to the Data Management Gateway
  4. The Data Management Gateway returns the data to Power Query

Data refresh

image

  1. Excel workbook is loaded into SharePoint
  2. Data refresh is called
  3. Connects to the Gateway Cloud service
  4. The Gateway Cloud service checks the users authorisation to perform a refresh
  5. If authorised sends the command to the on-prem Data Management Gateway
  6. Data Management Gateway sends the command to the data source
  7. The data source returns the results to the Data Management Gateway
  8. The results are transferred up to the Gateway Cloud service
  9. Returns the data to the Excel workbook

PowerBI Admin Centre

The admin centre provides the following:

  • Allows you to install and monitor the Data Management Gateways for the organisation
  • Configures access to the cloud enabled data sources
  • Exposes OData feeds to the corporate data sources
  • Configures the PowerBI user roles

You can access the Admin centre from either your tenant admin portal or directly via https://itadmin.clouddatahub.net

image

Interesting note, that the data source setup can be configured with either Windows or Database account. BUT you still need to add users to the datasource for them to actually access it.

Spotted new UI elements at SPC14

This short post gathers together a few things I spotted with the various demo’s which might give us a clue of some UI changes.

SuiteBar UI

Interesting to see what I assume is a version of the SuiteBar we can expect to see later this year.

image

Notice that Projects, Tasks and Oslo have appeared. Projects probably implies Project Online which currently hides in a context menu like in the picture of my tenant SuiteBar.

image

 

Sites page

Looks like the sites page might have gained some thumbnail images and a context menu fly out. Funny how this screen grab probably highlights nicely the issue most users will face. The site logo is either the standard SP version or will be set in the branding and thus be identical. Hopefully they will use the algorithms used inside Oslo to bring through something more engaging.

image

 

How Office Graph may change the OneDrive views

Below is a grab from the Oslo session which shows how the ‘Shared with me’ might benefit from the Office Graph enhancements.

image

SP.RequestExecutor cross domain calls using REST gotcha

CrossDomain

Recently I was building a prototype SharePoint hosted app to add items into the Host web. The basic operation of the app is that it queries the Host web for specific list types, then allows a user to add a collection of new items to the selected list. So read and write operations.

When dealing with the Host web it is important to remember that you are then subject to ‘cross domain’ calls and the restrictions in place for them. The browser protects users from cross site scripting and specifies that the client code can only access information within the same URL domain.

Thankfully SharePoint comes with some inbuilt options for these calls. The Cross Domain library is the primary option in either JSOM or REST forms.

I’ve been leaning towards REST mainly at the moment primarily as a focus for learning so I could get used to this method of data interactions.

So the first code sample is to get the host web task lists:

NB: This is a cut down extract of the function just to highlight the core request.

var executor;

// Initialize the RequestExecutor with the app web URL.
executor = new SP.RequestExecutor(appWebUrl);

//Get all the available task lists from the host web
executor.executeAsync(
{
url:
appWebUrl +
“/_api/SP.AppContextSite(@target)/web/lists/?$filter=BaseTemplate eq 171&$select=ID,Title,ImageUrl,ItemCount,ListItemEntityTypeFullName&@target=’” + hostWebUrl + “‘”,

method: “GET”,

headers: {  “Accept”: “application/json; odata=verbose” },
success: successHandler,
error: errorHandler
}
);

Note from this sample how the host and app web urls are used within the url combined with the SP.AppContextSite. This is the key to invoking a cross domain call in REST using the SP.RequestExecutor

The second snippet of code is the one which adds the new item to the host web list:

NB: This is a cut down extract of the function just to highlight the core request.

var executor;

// Initialize the RequestExecutor with the app web URL.

executor = new SP.RequestExecutor(appWebUrl);

var url = appWebUrl +
“/_api/SP.AppContextSite(@target)/web/lists(guid’” + hostWebTaskList.Id + “‘)/items?@target=’” + hostWebUrl + “‘”;

//Metadata to update.
var item = {
“__metadata”: { “type”: hostWebTaskList.ListItemEntityTypeFullName },
“Title”: item.title,
“Priority”: item.priority,
“Status”: item.status,
“Body”: item.body,
“PercentComplete”: item.percentComplete
};

var requestBody = JSON.stringify(item);

var requestHeaders = {
“accept”: “application/json;odata=verbose”,
“X-RequestDigest”: jQuery(“#__REQUESTDIGEST”).val(),
“X-HTTP-Method”: “POST”,
“content-length”: requestBody.length,
“content-type”: “application/json;odata=verbose”,
“If-Match”: “*”
}

executor.executeAsync({
url: url,
method: “POST”,
contentType: “application/json;odata=verbose”,
headers: requestHeaders,
body: requestBody,
success: addPrimeTasksToHostTaskListSuccessHandler,
error: addPrimeTasksToHostTaskListErrorHandler
});

Ok so at this point you’re probably wondering what is the gotcha mentioned in the title. Well here it comes and it’s one of those cut and paste horror stories which costs developers all over the land huge amounts of wasted effort.

So if you take a look at the following block of code

var url = appWebUrl +
“/_api/SP.AppContextSite(@target)/web/lists(guid’” + hostWebTaskList.Id + “‘)/items?@target=’” + hostWebUrl + “‘”;

 

//TODO: find out why this works but the below fails with not actually performing the update
//$.ajax({
executor.executeAsync({
url: url,
type: “POST”,
contentType: “application/json;odata=verbose”,
headers: requestHeaders,
data: requestBody,
success: addPrimeTasksToHostTaskListSuccessHandler,
error: addPrimeTasksToHostTaskListErrorHandler
});

You’ll notice i copied over the structure of the method from a normal $.ajax call. THIS IS MY MISTAKE!!!!

As with many things the devil is in the details. By using this ajax snippet I’d introduced a bug which took nearly 4 hours to work out (very little found on the popular search engines about this). The worst part is that the call fires and comes back with a 200 success and even enters the success handler, BUT the action is not performed.

So what is the cause? Well basically there are subtle differences in signature.

  • The ajax call ‘type’ should be ‘method’ in the SP.RequestExecutor
  • The ajax call ‘data’ should be ‘body’ in the SP.RequestExecutor

So there you have it, two word typo’s which throw no errors but cause a logical failure in the code.

I hope this helps someone else avoid the pain Open-mouthed smile

Some really useful information about this capability can be read at:

Chris’ app series covers using this library in anger – http://www.sharepointnutsandbolts.com/2012/11/access-end-user-data-in-host-web-from.html

Apps for Office and SharePoint blog article discussing the inner workings and options for cross domain versus cross site collection – http://blogs.msdn.com/b/officeapps/archive/2012/11/29/solving-cross-domain-problems-in-apps-for-sharepoint.aspx

Using REST in SharePoint apps – http://msdn.microsoft.com/en-us/library/office/jj164022.aspx

One final comment, MSDN Code has this sample: http://code.msdn.microsoft.com/SharePoint-2013-Get-items-7c27024f/sourcecode?fileId=101390&pathId=1361160678 which doesn’t really demo cross domain at the time of writing as it isn’t using the code correctly against the host web in my opinion.

Awarded Microsoft MVP 2013 for SharePoint Server

620MVP_Horizontal_FullColor

Literally minutes before leaving work on 1st  October I received the following email:

MVPEmail

This left me utterly speechless, which is not something that normal happens to me. After re-reading it about ten times the news finally sank in. I’m ecstatic that Microsoft have awarded me the MVP award for my contributions to the SharePoint community.

So I wanted to share a number of thank you’s for everyone who has supported me along the way.

Most importantly my beautiful wife who has supported my many many hours chained to my PC in the office at home beavering away on CKSDev or Presentations instead of snuggling up in front of a movie on the sofa. Without her understanding and support I definitely wouldn’t have found time to make the contributions I have. Also sitting through many hours of practice presentations before my speaking events.

Matt Smith for four years ago helping me to understand how to start to become involved in the SharePoint community.

Waldek Mastykarz for his friendship, support and advice and those midnight coding adventures before releasing a new version of CKSDev. Thanks buddy :)

Chris O’Brien for his friendship, advice and putting up with some seriously deep technical conversations over the years when I’m trying to get my head around a SharePoint feature and Visual Studio API.

The CKSDev team past and present, Wouter, Matt, Waldek, Todd, Paul, Carsten and Wictor who all at some point over the last few years have advised, written some cool code and generally helped ensure CKSDev was meeting everyone’s needs.

The event organisers for SUGUK, Evolutions/Best Practices London, SPSUK and SPSNL (Steve Smith and Combined Knowledge, Brett, Tony and Nick, Mirjam and the DIWUG peeps) for providing me opportunities to present and be part of the event teams.

My employers Content and Code and especially people like David Bowman and Tim Wallis who gave me time and support to contribute to the community. Not to mention Salvo di Fazio, Tristan Watkins and Ben Athawes.

To conclude what has been quite an emotional post to write I just want to say thanks to everyone in the community and MVP community who have helped me all these years. There are too many to list, but you know who you are :)