2015 Climbing Goals Recap

Onsight of Tricks for You (5.12a)
Onsight of Tricks for You (5.12a)

Erica does a year in review for her climbing goals (click here for her’s) so I decided to document mine as well.  Below were some of my goals for 2015 and other thoughts on how the year went.

I really liked Erica’s 12 5.12’s in 2012 goal a few years ago (see post on cragmama here) so I decided to try to send 15 5.12’s in 2015.  It doesn’t have the same ring to it but I ended up surpassing the goal with sending (excluding repeats) 20 5.12’s in 2015.

DSC05395
Left El Shinto (5.12b)

Ten Sleep helped a lot with this goal because I sent 6 5.12’s there with all of them being 2 goes except for one which I onsighted (Tricks for You 5.12a).  By September I had achieved my goal with my 15th send of the year when I sent Fine Motor Control (5.12a).

After having some luck in the 5.12b range this year I was hoping to send a 5.12c at some point.  I worked on Hard Rock Café (5.12c) several times but walked away with only a one hang.  I had picked out what seemed like a perfect 5.12c for me in Ten Sleep called Left El Shinto.  Unfortunately, others also felt like it was too perfect and in the recently released latest guidebook, the route had been downgraded to 5.12b.  I did send the route but ended up giving myself a 5.12b credit for it.

Techman (5.12c)
Techman (5.12c)

After I sent Freaky Stylee (5.12a) earlier this year I decided to get on Techman (5.12c) with Erica this fall.  Techman is a V5/6 boulder problem into some hard 5.11 climbing and shares the same 5.12a crux finish with Freaky Stylee.  It ended up taking me 3 attempts to send and the send was epic.  I almost fell off at crimpy crux and at two of the hard 5.11 moves later.  What I was really excited about was the Freaky Stylee crux which I fell at so many times in the spring and in the past few years I did without any issues both times I tried it that day.

2015-12-30_8-58-32I use 8a.nu to track my sends and I really enjoy their ranking system.  I set out a goal for my all time score to be equal to my yearly score.  What this basically means is that the top 10 sends of my life happened this year.  I wasn’t sure it was going to happen because I needed to have 10 of at least the following:  5.12b, 5.12a second go, 5.11d flash, 5.11b/c onsight.  While at Ten Sleep I was able to accomplish this goal.  Here’s a link so see how I did for the year.

Gangsta (5.12a)
Gangsta (5.12a)

I have bouldered well at the gym by getting a lot of V5’s and V6’s (including a stray V7 and V8).  I was hoping to have an outside send of at least a V5 this year but it didn’t happen.  We didn’t boulder outside at all this past year.  My birthday bouldering bash was rained out in January, Hound Ears was postponed and since we were so ropes focused because of our Ten Sleep trip, we just didn’t make it a priority.  Hopefully next year.

Check Your Grip (5.12a)
Check Your Grip (5.12a)

Lastly, it felt great to get redemption on a few routes that gave me issues last year.  Freaky Stylee (5.12a) took me a total of 9 attempts and Gangsta (5.12a) took me a total of 16 attempts to send.  I was also excited to get several sends that are steeper such as Lost Souls (5.12a) and Check your Grip (5.12a).  Other memorable moments were sending three 5.12’s in a single weekend (Freaky Stylee (5.12a) on a Saturday and then Fired For Sandbagging (5.12a) and Michelin Man Original Finish (5.12b) on Sunday) and onsighting Tony The Tiger (5.11c).

Unable to Manually Start Workflows

Recently, after we finished migrating our large external farm from SharePoint 2010 to SharePoint 2013, I started hearing complaints that some user’s could not manually start workflows.  They would either get a 403 Forbidden or get the “Sorry, you don’t have access to this page” message.

2014-09-16_8-57-02

The stack trace on the back end produced the following:

Microsoft.SharePoint.Utilities.SPUtility.HandleAccessDenied(HttpContext context) at Microsoft.SharePoint.Utilities.SPUtility.HandleAccessDenied(Exception ex) at Microsoft.SharePoint.SPSecurableObject.CheckPermissions(SPBasePermissions permissionMask) at Microsoft.SharePoint.WorkflowServices.StoreSubscriptionService.EnumerateSubscriptionsByEventSource(Guid eventSourceId) at Microsoft.SharePoint.WorkflowServices.ApplicationPages.WorkflowPage.ConstructStartArray() at Microsoft.SharePoint.WorkflowServices.ApplicationPages.WorkflowPage.OnLoad(EventArgs e)

Figuring out the problem just took a little investigation.  I recently used this as a Demo for a SharePoint session I did recently at my local SharePoint Saturday.  From that session I have a video of the issue and how I determined the cause.  Skip to about 2:15 for the start of the issue and investigation.  Click here to see the video

So basically the new SharePoint 2013 Workflow Manager is checking for Contribute access at the Site (SPWeb) scope when determining if someone should see the list of workflows for a list (see first line of the method in the code below).

// Microsoft.SharePoint.WorkflowServices.StoreSubscriptionService
public override WorkflowSubscriptionCollection EnumerateSubscriptionsByEventSource(Guid eventSourceId)
{
	this.context.Web.CheckPermissions(SPBasePermissions.EditListItems);
	WorkflowStore workflowStore = new WorkflowStore(this.context.Web);
	eventSourceId = StoreSubscriptionService.ConvertToGuidToken(eventSourceId, this.context.Web);
	WorkflowFile[] files = workflowStore.QueryWithGuid("0x0100AA27A923036E459D9EF0D18BBD0B9587", StoragePublishState.Unchanged, "WSEventSourceGUID", eventSourceId);
	return this.ConvertToWorkflowSubscriptionCollection(files);
}

So in our scenario, our users had read access to the site but contribute access on the list.  This should allow them to start the workflow and it did in SP 2010.  I currently have a Design Change Request (DCR) open with MS regarding this issue so hopefully it will be fixed soon.  Once I hear more, I will update this post.  In the meantime there seems to be two workarounds.

Workaround 1:  Earlier in the code I determined that if you DON’T setup and connect a SharePoint 2013 Workflow Manager to the farm, then this code will never run and thus it will work just like it did in SP 2010.  Of course the issue with this workaround is you can’t have any SP 2013 workflows.

Workaround 2:  Basically give everyone that needs to manually start workflows contribute access to the site, and then break inheritance to all lists and libraries where the user DOESN’T need contribute access and remove their contribute access.

We ended up implementing the second workaround above which sucks for my users.  I am hoping this is fixed soon as I have also seen other people complaining about it (http://sharepoint.stackexchange.com/questions/115311/manually-start-sharepoint-2010-workflow-in-sharepoint-2013-farm/)

Speaking at SharePoint Saturday Charlotte 2014

I am speaking at the Charlotte SharePoint Saturday 2014 event this Saturday.  Below is my abstract and slide deck if you are interested.  If you are a reader of my blog and are going to the event, please stop by and say hello.

Session Title:  Unwrapping the Black Box: Advanced SharePoint Troubleshooting and Forensics

Session Topic:  SharePoint can often feel like a black box, and with little to no knowledge of internal workings, troubleshooting can be daunting. In this session, I remind you that SharePoint is nothing more than ASP.NET Web Forms and apply some of the same troubleshooting techniques to get you out of the dark. I will also delve into some SharePoint specific tools and demonstrate actual errors and troubleshooting where the resolution requires reading Microsoft SharePoint code.

Tools/Techniques

  • Internet Explorer F12 Developer Tools
  • Fiddler2
  • Developer Dashboard
  • ULS Viewer
  • SharePoint Manager
  • Reflector/ILSpy
  • SQL Profiler

Click here for the presentation including embedded videos of demos and scenarios.

SharePoint 2013 conflicts with custom site definition

I was updating one of our custom Site Definitions from SharePoint 2010 to SharePoint 2013 recently and everything was going good until I tried to create a site from the updated definition.  I kept getting the error:

Microsoft.SharePoint.SPException: The template you have 
chosen is invalid or cannot be found.

Searching on the internet told me the most common cause of this error was a conflicting ID for the template.  I was pretty sure this couldn’t be the case since we followed the instructions here:  http://msdn.microsoft.com/en-us/library/office/ms454677(v=office.14).aspx which stated:

Change the ID attribute of the Template element to a 
value of 10000 or more. This ensures that your ID will 
not conflict with future site definitions produced by 
Microsoft. If there are other custom site definitions 
on your target farm, make sure that each one has a 
unique ID.

and we had given our template an ID of 10000.  I had previously updated another custom site definition of ours with an ID of 10001 without any issues.

So I decided to give a quick search in the SharePointRoot\template\1033\XML folder for anything that contains ID=”10000″.  Sure enough I found two site definitions, mine and a new one that comes with SharePoint 2013 called the Academic Library.

I found this article:  http://social.technet.microsoft.com/wiki/contents/articles/20149.sharepoint-2013-default-site-templates.aspx which discusses the new site definitions that come with SharePoint 2013.  You can see it listed there as:

ID Name Title
10000 DOCMARKETPLACESITE#0 Academic Library
The Academic Library template provides a rich view and consumption experience for published content and management. Authors populate metadata and apply rules at the time of publishing, such as description, licensing, and optional rights management.(IRM). Visitors of the site can search or browse published titles and add authorized selections to their collection to consume, subject to the rights and rules applied by the author. The site provides an IRM-capable document library, a publishing mechanism for authors to publish documents, detailed views for each document, a check-out mechanism, and related search capabilities.

So it would seem that if you followed the recommendations for SharePoint 2010 and used an ID of 10000 for your custom site definition, then when you try to go to SharePoint 2013, your site definition won’t work.

This is an issue because there is not a way to change the template ID of a site after it’s been created through the API.  Fortunately, I have found 2 ways to get around this.  One of them I haven’t fully run to ground and verified that it works but the concept seems valid and the other isn’t supported by Microsoft.

Option 1:

This option I got the idea from this blog:  http://iknowsharepoint2007.blogspot.com/2010/02/changing-sharepoint-site-definition.html.  The basic idea is you export your site without using compression, change some xml configuration files so they use your new ID, and then import it back into your SharePoint environment.  You might not even have to change any xml files since that post was for SP 2007.  If someone tries this method, please comment below, otherwise if I find time to give it a try, i’ll update with my findings here.

Option 2:

This involved editing data directly in the SharePoint content database.  This is unsupported by Microsoft but worked for me during my testing.  Go to the AllWebs table in the content database for the site in question.  You should be able to find your site listed by scanning the FullUrl column.  Once found, write a SQL update statement which updates the WebTemplate column to the new site definition ID.  This was an instant fix for me as I was able to immediately start the upgrade to SharePoint 2013 for that site collection.

It sucks that Microsoft told us they would never use Site Definitions ID of 10000 or more and then they go back on their word with SharePoint 2013.  Anyways, I hope this helps someone else out trying to complete their migration to SharePoint 2013.  If anyone finds a better way to fix the issue, please post in the comments below.  Thanks.

Warning: SetCookie changes implementation in SharePoint 2013

I was recently working on verifying some of my custom code worked in SharePoint 2013.  I had some older code where I needed to set cookies and use them to remember user preferences.  I was debugging my code and I noticed that all of my cookies were coming back either true or false instead of the value I put into them.  I had been using a SharePoint JavaScript method called SetCookie.  Below is the implementation that has existed in SharePoint for the previous 3 versions (2003, 2007, and 2010).

function SetCookie(name, value, path)
{
	document.cookie=name+"="+value+";path="+path;
}

But for some reason Microsoft decided to change the implementation of this method in SharePoint 2013 to the following:

function SetCookie(sName, value) {
    SetCookieEx(sName, value, false, window);
}
function SetCookieEx(sName, value, isGlobal, wnd) {
    var c = sName + (value ? "=true" : "=false");
    var p = isGlobal ? ";path=/" : "";

    wnd.document.cookie = c + p;
}

Notice this new method tries to evaluate the value into a boolean and then forcefully sets the cookie to true or false.  So if you were storing anything other than boolean values in your cookies and used this method in previous versions of SharePoint, you will now need to update your code.  For this you have two options:

Option 1:  I found there is another method in SharePoint 2013 which still implements the SetCookie the same was as previous versions of SharePoint.

function SetMtgCookie(cookieName, value, path) {
    document.cookie = cookieName + "=" + value + ";path=" + path;

}

So you can easily do a search and replace for SetCookie to be replaced with SetMtgCookie and you’ll be good to go.

Option 2:  This is the option I opted for.  I decided that as tempting as doing a quick search and replace like I suggested in option 1 sounded, I wanted to remove my dependency on SharePoint’s implementation in case it changes again in the future.  Since the older SetCookie is only one line, I just replaced my method call to that line:

document.cookie=name+"="+value+";path="+path;

It was a pretty simple change, only slightly more time taken than option 1 and I removed a dependency.

Anyway, I hope this helps someone else out when troubleshooting code migration to SharePoint 2013.