Author: Derek

  • The Developer’s mid-life crisis – and 5 ways to overcome it

    The Developer’s mid-life crisis – and 5 ways to overcome it

    According to Wikipedia, a midlife crisis is:

    Midlife crisis is a term coined in 1965 by Elliott Jaques stating a time where adults come to realize their own mortality and how much time is left in their life.

    I particularly like this supporting thought, that during this time, “people may reassess their achievements in terms of their dreams.”

    I went to university in the late 1990s, a time when the Internet was emerging and the geek stereotype was being shaken off.  In those days, coding for a living wasn’t quite fully mainstream, but for those of us to pursued it, we had a promising and potentially lucrative career ahead of us.  Job prospects were strong, and it wasn’t unusual to have multiple opportunities to consider, with above-average pay, upon graduation.  At that time, I dreamed of being the guy who came up with new three-letter-acronyms and writing definitive works on a subject.

    A lot has changed in the past 20 years.  Coding today is mainstream, talked about in the media, promoted to children.  Tech success stories are commonplace, and we can’t possibly imagine a world without Google, Facebook, and Amazon.  And I, like many of my peers, find myself no longer on the bleeding edge of tech, but instead spending my time supporting and building run of the mill business apps.

    In this new environment, developers (I posit) have reached nearly commodity status.  There are lots of us.  The supply curve has changed, and while demand is still strong (the Bureau of Labor Statistics projects 22.8 percent employment growth for software developers between 2012 and 2022, much faster than average for all occupations. During that time period, an estimated 139,900 jobs will need to be filled) it’s harder and harder to distinguish oneself from their peer group.

    Additionally, the rise in new, more glamorous technologies such as mobile apps have pinched career developers in to choosing a path in which to invest their time, training, and focus.  Do we stick with the stable corporate job, or jump ship for the hip new startup?

    In short, we face a mid-career crisis.

    One day you wake up and suddenly feel like all the cool kids are doing fancy mobile apps and you’re stuck in the belly of the corporate beast writing TPS reports.  Or maybe you go to a Code Camp or conference and instead of getting rejuvenated you get depressed over all the tech that you’ll never be able to use in your job because the opportunities don’t present themselves.  In short, the crisis strikes, and when you reassess your achievements in terms of your dreams, you feel like you’ve come up way short.

    I know I’ve felt this way.

    And here’s how I overcome it.  It’s not quite like going out and buying a red convertible, but these things serve to give me a boost.

    Sign up to give a presentation or user group talk.

    One of the more rewarding things I have done in the past couple years is preparing talks for local user groups.  The key?  Always selecting a topic that I hardly know anything about.  In doing so, I create a condition for myself to learn with a deadline, powered by the fear of embarrassment.  This has been a great way for me to immerse myself in the tech topics I wouldn’t otherwise get to use in my day job.

    Start a side project.

    If your day job isn’t giving you the opportunities you want, then consider a hobby project that can be a sandbox for you to try things out.  For me, HomeSpot HQ is that project – and it routinely gives me a place to try and incorporate the hot new things.

    Start mentoring

    Rather than bemoan the next generation of developers and how easy they have it, why not invest in them.  Help teach them strong principles that make life as a developer better.  You know, things like SOLID and DRY. Or how to write good code comments. Many areas have tech summer camps that would love volunteers to help campers learn the ropes.

    Take a Twitter sabbatical

    The main channel by which I hear about all the things everyone else is working on is via my Twitter feed.  But sometimes there are days when having those constant reminders is downright depressing.  In that moment, fire a Ctrl-F4 or Command-W to blow that tab away, and find a moment to stop comparing yourself to everyone else.  Chances are, they have been (or will be) in the same place in their career.

    Commiserate with others

    Want to feel better about your situation?  Go talk with one of your peers and hear their story.  Again, it’s pretty likely they have been through the same crisis moments, and probably have some insight about how to cope constructively.  Or, they might have a horror story to tell that proves again the grass isn’t always greener.  Who knows, maybe that conversation will propel you to take action!

    If your achievements and your dreams aren’t matching up, remember that you can change either side of that equation.  Still, there are endless opportunities to achieve waiting out there for you. You just have to decide to go after them.

    Photo credit:https://commons.wikimedia.org/wiki/File:MX-5_Red.jpg

  • Multi-column navigation menus in SharePoint

    Multi-column navigation menus in SharePoint

    Here’s a quick tip to provide a pseudo-mega-menu in SharePoint.

    This CSS revision should work with the standard SharePoint 2010 and 2013 horizontal navigation menu that uses either Managed Navigation or Structured navigation.

    Let’s look at a normal presentation of the Global navigation menu.  You can see if I have more than 10-12 items, I have to scroll the browser to see the full menu.

    sp-menu-single-column

    By simply using CSS to render the menu using multiple columns, we can now see the whole menu above the fold of the page.

    sp-menu-multi-column

    Here’s the CSS to apply.  You’ll need to put this in to an alternate CSS file or otherwise reference it through your custom master page.

    /*two column nav dropdown - only in wide view*/
    @media (min-width: 768px) {
      #topnavbar .nav li.static > ul.dynamic {
        text-align: left !important;
        width: 550px !important;
      }
    
      #topnavbar .nav li.static > ul.dynamic > li.dynamic {
        display: inline-block;
        list-style-type: none;
        float: left !important;
        width: 49% !important;
      }
    
      #topnavbar .nav li.static > ul.dynamic > li.dynamic:nth-child(odd) {
        clear: left !important;
      }
    }
    

    A few additional comments:

    • In this specific case, I am using Bootstrap, so that is why the .nav class indicator is included in the selector.  It is also why I wrap this CSS block in a media query so that the multiple column display only is applied in the largest views of the page.
    • You’ll notice that it renders the menu items left to right, not down the first column, then up to the second column.  This is simply an easier approach since we never know how many menu elements are present.

    There are other Mega Menu approaches that incorporate images or multiple menu hierarchies.  However, if you just needing to compress the menu above the fold, this is a pretty efficient method.

  • CodeSpaces and the risk of cloud computing

    CodeSpaces and the risk of cloud computing

    I love small business.  They innovate. They drive our economy.  They offer products in an agile manner.

    I love cloud computing.  It’s convenient.  It’s flexible.  It makes things affordable that once were cost prohibitive.

    Doing business with anyone carries risk, and some may feel that doing business with small businesses carries greater risk.  But we do it anyway because we like the product or service that is offered.

    One such small business that I have done business with is CodeSpaces.  They were a startup that provided cloud-hosted Source code control such as Subversion and Git.  They had a continually improving project management dashboard oriented around agile methodologies.  They were affordable, with plans as low as $2/month.

    When I started HomeSpot HQ, I had a laptop.  I did most of my development on that laptop, but knew I needed a place for source code control.  Being familiar with Subversion, and being in need of a free or low cost solution, I researched and found CodeSpaces.  Upon registering for an account, I pushed my source files in to the cloud, ready to access them anywhere.

    CodeSpaces announced yesterday that their service had been breached by an unauthorized attacker, and that a good portion of the code, project information, and other customer data that had been willingly pushed to the cloud by their customers had been irreversibly destroyed.

    CodeSpaces issued this statement about the incident:

    Code Spaces will not be able to operate beyond this point, the cost of resolving this issue to date and the expected cost of refunding customers who have been left without the service they paid for will put Code Spaces in a irreversible position both financially and in terms of on going credibility.

    As such at this point in time we have no alternative but to cease trading and concentrate on supporting our affected customers in exporting any remaining data they have left with us.

    Thankfully for myself and for HomeSpot HQ, I had moved off of using CodeSpaces for my ongoing source control solution.  But had I not, then not only was CodeSpaces’ business compromised, but quite possibly mine would have been as well.

    I frequently receive emails from new HomeSpot HQ users that read something like this.  “I really love your product and am excited to use it.  However, what happens to my data if you disappear as a business?  Is there a way to export or extract it?”

    These users are rightfully being proactive in considering the safety and trustworthiness of the cloud.  They recognize the value of the data they would provide, and the value of the time required to provide it.  They want assurances that their effort will not be wasted because we close up shop overnight.

    CodeSpaces is the victim of a crime.  They indicate in their full statement that they have withstood previous attacks without incident.  It is unfortunate that this crime leaves the company in a state where their only option is to close.

    This story (and many like it) illustrate the risk we take when using hosted services.  It forces me as the provider of such a service to redouble my efforts to keep my customer’s data secure.  This is the world we live in.

     

    Photo credit: https://www.flickr.com/photos/carbonnyc/

     

  • MDSFailover: Master page mismatch – SOLVED!

    MDSFailover: Master page mismatch – SOLVED!

    One of the promising new features in SharePoint 2013 is the Minimal Download Strategy, which allows pages in non-publishing sites to be rendered using AJAX callbacks rather than full round trips and page refreshes.  When it works, it provides a very seamless user experience, with only the essential portions of the page being changed.

    However, when MDS fails, there is not much to go on.  You will get some basic entries in the ULS log, but I found them to be just vague enough to not be helpful.

    One such message is as follows:

    MDSLog: MDSFailover: Master page mismatch occurred in MDS: Context Page MP (currentMPToken) = ['|WORKGROUPS|TEST:|WORKGROUPS|TEST|_CATALOGS|MASTERPAGE|SEATTLE.MASTER:2.15.0.0.0.15.0.4481.1005.2.FALSE.:en-US:en-US:RW'], MP supplied by page in URL (originalMPToken) = ['|WORKGROUPS|TEST:|_LAYOUTS|15|SEATTLE.MASTER:0.15.0.0.0.15.0.4481.1005.2.FALSE.:en-US:en-US:RW'], Current Request URL = ['https://domain.com/workgroups/test/SitePages/Home.aspx?AjaxDelta=1&isStartPlt1=1392132082249']

    A bit of context for how MDS works.  In order to be able to partially load a content page, certain elements of both the referring and destination page must be the same, namely the master page.  If the two pages are determined to have different master pages, then SharePoint must force a full page load.  The examination of the pages occurs on the /_layouts/15/start.aspx page, which is an intermediary page that is loaded as a url is followed.

    If MDS fails, the start.aspx page will then do a full redirect to the destination url.  The net effect of this failover however is a longer than normal page load since there are several redirects occuring.

    In my case, however, this didn’t make sense.  I was on a brand new Team site, and had made no master page changes.  So why was MDS reporting a mismatch?

    After hours of inspecting the page load sequences in Firebug and Fiddler, a curious observation came to light.  MDS was working fine on pages that were in the _layouts folder, such as Site Settings and All Site Content.  It was only pages in the main site that were failing.

    It reminded me that in Central Administration, in the General Settings for a Web Application, there is a selection to indicate if pages in the _layouts are use the Site master page or not.

    generalsettings

    I found that if this property is set to No, the content page will render using _catalogs/masterpage/seattle.master location while the _layouts pages (including start.aspx) will render using _layouts/seattle.master.  As best as I can tell, the MDS check is looking at the start.aspx master page rather than the actual destination page’s master page to make its comparison.  While the content of these pages may be identical, since the paths are different, MDS fails over and issues the full redirect to the target url.

    On a new web application, this setting defaults to Yes, so you may only experience this behavior if you have changed it.

    I found very little about the MDSFailover online so I hope this helps the community.

  • Raising Coders goes live

    Raising Coders goes live

    RC-AvatarI’m very excited to share that my new podcast, Raising Coders, is now live.

    Raising Coders is an honest discussion about kids, technology, and parenting.

    In this inaugural “Hello, World” episode, I cast a vision for the podcast, and ask my six-year-old what technology is.

    Check it out, and let me know what topics you’d like to discuss in future episodes.

    https://www.raisingcoders.com/s1e0-my-vision-for-raising-coders/

  • Responsive Design in SharePoint 2010 – WintellectNOW training

    Responsive Design in SharePoint 2010 – WintellectNOW training

    I’m very excited to have completed my first video training course for WintellectNOW.

    Responsive Design in SharePoint 2010

    This hour-long course is an in-depth look at using the Bootstrap responsive framework in SharePoint 2010 publishing sites.  It was a lot of fun to create, and will hopefully be the first of many that I produce.

    Here’s the course overview:

    wintellectnow-rwdsp2010-overview

     

    I’

  • You’re going to fall behind

    You’re going to fall behind

    5725727517_f8dfc7b214_b
    https://www.flickr.com/photos/pigpilot/

    Earlier this month, I wrote about how it’s inevitable that you’re going to be distracted during the course of your workday.  Today I’m adding a second installation to the “You’re going to…” series by assuring you that You’re going to fall behind.

    What I mean by this is that as a developer, there will always be things you can’t keep up on.  Be that a new language, framework, toolkit, backlog of features, unit test coverage, or even documentation.  There simply has become too much to learn, too much to consume, too much to monitor, for any normal person with a day job to manage.  And that is okay.

    Back in the day

    When I started software development in the late 1990’s, there really were fewer options for how you did your work.  It really came down to a few languages, and those mostly supported by Microsoft, namely FoxPro, Visual Basic, and C++.  Even Java, released in 1995, was only beginning to garner some momentum.  Consequently, there were finite choices, and seemingly finite amounts of reference material to consume.  These are the days when not only would you get 25 3.5 inch floppy disks to install the product, you’d get 3 or 4 printed volumes as instructional guides.  If you were lucky enough, as I was, to have an employer who would spring for the CD-ROM based MSDN library subscription, then your reference base grew a bit more, especially with each quarterly release.

    But in the end, if I had a problem I couldn’t solve, the standard solution was at the other end of the Microsoft Support telephone number.  I have many memories of sitting on hold waiting for a support representative to pick up so I could ask a single question.

    The release cycles for new products in the late 90’s and early 2000’s were long.  And the infancy of the Internet at that stage meant that only so many new products or technologies became available each year.  I dare say it was manageable, and if you paid attention, you could reasonably stay current with the latest and greatest.

    The Internet changed everything

    In my view, the Internet has had two significant impacts on the field of software development.  The first is the amount of content available related to any given programming language, or in fact any given specific issue.  The second is the acceleration of new technology being released for developers to leverage.

    To illustrate the former point, do a simple Google search for your programming language of choice.  The results may surprise you.

    asp.net-mvc-search

    21 million results.  21 million pages that all may have something relevant to the problem you are trying to solve.  It’s no wonder we feel overwhelmed.

    How to keep up

    Just as you would if you found yourself falling behind the pack in a footrace, keeping up with the industry requires that you dig deep in to your core and put all you have towards closing the gap.  Here are some things I have found useful.

    1. Plan to give a talk

    One of the most effective ways I have found to embark on learning a new technology or method is to commit myself to giving a presentation about that topic.  This can be at a user group, a code camp, or even just as a lunch-and-learn with your team.  The risk of embarrassment in front of your peers is a giant motivator, and a deadline can help you prioritize and structure your learning.

    2. Optimize your online consumption

    With the glut of material out on the Internet, how possibly do you filter though the volume and get to the best resources.  One method I use is to always start with what I call my trusted sources.  These are individuals like Scott Hanselman, K. Scott Allen, and Randy Drisgill, who have an established reputation as reliable authors.  The next tier is material from the producers of the technology themselves.  Everything from Microsoft down to the discussion threads on CodePlex, if it’s directly tied to the people creating the technology, chances are you’ll get better quality information.  Finally, expand to the general tech blogosphere.  Every developer has their own application and experience with a language or tool, and that broad base will give you lots of insight as to what is good, bad, and ugly about the product.

    3. Online video and Podcasts

    In the last few years there has been a downright explosion of online video training materials available online.  Free sites like DimeCasts; paid sites like WintellectNow and Pluralsight; and of course, lots of user-sourced material on YouTube.  The genre of tech-focused online screencasts is maturing rapidly and gaining not just popularity, but quality.  Similarly, chances are there are dozens of individual podcasts available oriented around the topic du jour.  Online training and podcasts are great because they can be portable as well as passive.  You can listen to a podcast while on the treadmill, or watch a video while traveling.  These are great tools to help you incrementally grow in knowledge.

    4. Start a side project

    If you are like me, and I think most developers, you learn best by doing.  So if your main job doesn’t afford you the opportunity to explore and apply new technology, create your own project that does.  I started HomeSpotHQ.com in 2009, and it became the venue in which I learned MVC.  Setting off to create a product, whether or not you make it public, is a great form of focused learning.  If you’re particularly motivated, you can follow in Jennifer Dewalt’s footsteps and do 180 websites in 180 days, each implementing a specific method or tool.  The point is to not just read and watch, but do.

    Long journey, first steps

    I think being a developer forces you to be a lifelong learner.  There’s no other way to stay competitive and relevant in the marketplace.  So when you find yourself worrying or frustrated because you learn about yet another JavaScript framework that released, remember that we’re all in the same boat.  Pick up an oar, set a target, and get to work.

    Photo credit: https://www.flickr.com/photos/pigpilot/

  • You’re going to be distracted.

    You’re going to be distracted.

    This month I’ve been trying to see if there is a measurable difference in regard to how much I get done when working at the office vs. working at home.  For most of my career I’ve considered working out of the office the way to really get things done, as an escape from the distractions that come with being in a venue filled with people who want to interrupt you.

    What I am finding, however, is that for every knock on the door interruption at the office, I seem to have just as many screaming child interruptions at home.  Everywhere I go it seems, there are the actual and metaphorical squirrels intent on catching and keeping my attention.

    1458555513_1e0f119799_b
    https://www.flickr.com/photos/binaryape/

    The point is, of course, not about location, as much as it is that you’re going to be distracted.  Our work life is full of interruptions, be them email, instant messaging, phone calls, knocks on the door, reloading cups of coffee, going to the bathroom, lunch, retrieving something from the printer, daily standups….you get the idea.  At home, these things all basically exist just the same, and are augmented by children, laundry, the UPS guy, the neighbor’s lawn service, going to the school bus, and dozens of other things.

    But wait! Maybe working at the coffee shop will be better?  Nope, there you have the hiss of the espresso machine, the constant coming and going of people, and worse, other people’s children!

    So how do we get things done?  How as a developer can I possibly have a block of uninterrupted time suitable to starting and finishing a task?

    Learn the time of day that works best for you, and do your best work in it

    One year while I was in college, a class scheduling conflict required me to put in hours at my internship between 6:00am and 10:00am several days a week, returning to campus for lunch and classes in the afternoon.  I found during that time that I worked well, and by that I mean I had strong focus, during the early morning hours.  That time slot is much harder to come by these days as there are lunches to be made and kids to feed, but occasionally I’ll find myself awake early and able to preempt the day with some productive hours.  For others, it may be mid afternoon when they find their best focus, when the crises of the new day are dealt with.  Still others stay up late.   Whatever your preference, by organizing the most important tasks around the time when you do the best work, more may be achieved.

    Operate on clear deliverables

    When I clearly know the particular task at hand, and it is a self contained unit of work, I find my ability to focus and complete that task without being derailed by distractions is much stronger.  Whether it is a bug ticket, a specific item to research, or a new feature, having a tangible, manageable task to complete makes it easier to return to the task after an interruption occurs.

    Shut down your browser

    In my normal Chrome instance, I have 3 tabs of email inboxes, Twitter, Drudge Report, and Hacker News.  That’s six distractions that I invited in to my day.  In any idle moment, be it the recompile of a project, or the start up of a new virtual machine, my default action is to touch all six of those tabs looking for changes.  F5 is the enemy!  As hard as it is, working in a vacuum sometimes is the best way to narrowly focus on a task.

    As I age I’m learning that focus is a skill, and one that must be practiced and honed.  What are your methods for staying focused and getting things done?

  • PowerView report fails –  No credentials are available in the security package

    PowerView report fails – No credentials are available in the security package

    So I’ve got a PowerView report hosted in SharePoint.  And it throws up the following when I try to load it:

    PowerView Auth fail

    The full error details are:

    <detail><ErrorCode xmlns="https://www.microsoft.com/sql/reportingservices">rsCannotRetrieveModel</ErrorCode><HttpStatus xmlns="https://www.microsoft.com/sql/reportingservices">400</HttpStatus><Message xmlns="https://www.microsoft.com/sql/reportingservices">An error occurred while loading the model for the item or data source 'EntityDataSource'. Verify that the connection information is correct and that you have permissions to access the data source.</Message><HelpLink xmlns="https://www.microsoft.com/sql/reportingservices">https://go.microsoft.com/fwlink/?LinkId=20476&amp;EvtSrc=Microsoft.ReportingServices.Diagnostics.Utilities.ErrorStrings&amp;EvtID=rsCannotRetrieveModel&amp;ProdName=Microsoft%20SQL%20Server%20Reporting%20Services&amp;ProdVer=11.0.3128.0</HelpLink><ProductName xmlns="https://www.microsoft.com/sql/reportingservices">Microsoft SQL Server Reporting Services</ProductName><ProductVersion xmlns="https://www.microsoft.com/sql/reportingservices">11.0.3128.0</ProductVersion><ProductLocaleId xmlns="https://www.microsoft.com/sql/reportingservices">127</ProductLocaleId><OperatingSystem xmlns="https://www.microsoft.com/sql/reportingservices">OsIndependent</OperatingSystem><CountryLocaleId xmlns="https://www.microsoft.com/sql/reportingservices">1033</CountryLocaleId><MoreInformation xmlns="https://www.microsoft.com/sql/reportingservices"><Source>ReportingServicesLibrary</Source><Message msrs:ErrorCode="rsCannotRetrieveModel" msrs:HelpLink="https://go.microsoft.com/fwlink/?LinkId=20476&amp;EvtSrc=Microsoft.ReportingServices.Diagnostics.Utilities.ErrorStrings&amp;EvtID=rsCannotRetrieveModel&amp;ProdName=Microsoft%20SQL%20Server%20Reporting%20Services&amp;ProdVer=11.0.3128.0" xmlns:msrs="https://www.microsoft.com/sql/reportingservices">An error occurred while loading the model for the item or data source 'EntityDataSource'. Verify that the connection information is correct and that you have permissions to access the data source.</Message><MoreInformation><Source>Microsoft.ReportingServices.ProcessingCore</Source><Message msrs:ErrorCode="rsErrorOpeningConnection" msrs:HelpLink="https://go.microsoft.com/fwlink/?LinkId=20476&amp;EvtSrc=Microsoft.ReportingServices.Diagnostics.Utilities.ErrorStrings&amp;EvtID=rsErrorOpeningConnection&amp;ProdName=Microsoft%20SQL%20Server%20Reporting%20Services&amp;ProdVer=11.0.3128.0" xmlns:msrs="https://www.microsoft.com/sql/reportingservices">Cannot create a connection to data source 'EntityDataSource'.</Message><MoreInformation><Source>Microsoft.AnalysisServices.AdomdClient</Source><Message>Authentication failed.</Message><MoreInformation><Source>Microsoft.AnalysisServices.AdomdClient</Source><Message>No credentials are available in the security package</Message></MoreInformation></MoreInformation></MoreInformation></MoreInformation><Warnings xmlns="https://www.microsoft.com/sql/reportingservices" /></detail>

    And so begins the journey of trying to uncover just which set of credentials isn’t in the right place.  Let’s stop and look at the flow that occurs when you try to load that report:

    PowerView Report hands off to BI Semantic Model (also hosted on SharePoint on the WFE server, running under an application pool)

    BI Semantic Model points to SQL Server Analysis Server Instance on your SQL Server.

    Credential check occurs on SSAS Instance to determine if adequate permissions exist for requesting user.  If so, query runs, data sent back, and report displays.  If not, we get an error like the one above.

    Like many things in SharePoint, this transaction can be governed by Kerberos, which facilitates the passing of credentials from one server or service to another.  It’s easy to confirm if this is a Kerberos issue by changing our report to use a specific username and password.

    In the PowerView gallery, change to the All Documents view, then drop down the menu for your specific report and select Manage Data Sources.

    In my case, the entry for EntityDataSource is shown.  Click on that to get the details.

    Here’s what happens when we use the Windows authentication (integrated) or SharePoint user option and click Test Connection.  No worky.

    pass-through-fail

    Here’s what happens when we put in specific credentials and click Test Connection.

    named-user-success

    So while the symptoms and appears would point to a Kerberos configuration issue, in truth, the solution (in my case) lies with the Claims to Windows Token Service.

    By default, this service is provisioned to run as Local System.  But there is guidance to run this as a domain account.  However, in doing so, additional local security policy changes must be made on the server on which the service is running, in this case, the SQL server.

    The domain account used by the Claims to Windows Token Service needs to be granted the following rights through the Local Security Policy:

    1. Act as part of the operating system

    2. Impersonate a client after authentication

    3. Log on as a service

    You can find these settings under Administrative Tools > Local Security Policy > Local Policies > User Rights Assignment.

    No reboot is necessary for these changes to take effect.  As soon as I returned to my PowerView report and refreshed, the report loaded without error.

    Hat tip to this thread for pointing me in the right direction.

  • SQL Server 2012 SP1 Reporting Services Add-In for SharePoint installation fails with error 1603 – SOLVED!

    SQL Server 2012 SP1 Reporting Services Add-In for SharePoint installation fails with error 1603 – SOLVED!

    Oh, the depths of the nuances found in SharePoint.

    While setting up a new SharePoint 2013 farm that included the Business Intelligence components, we were not able to get the Reporting Services Add-In to successfully install.  The installer would run all the way through, then roll back the entire thing and show this:

    Failed Install

    Looking to the log of the installer, here’s what we found:

    2014-01-08 11:27:54: User: svc_sp2013farmadmin
    2014-01-08 11:27:54: Installing Report Server feature.
    2014-01-08 11:27:58: Beginning uninstall of cab files.
    2014-01-08 11:27:58: Cab files uninstalled successfully.
    2014-01-08 11:27:58: Calling copyappbincontents command.
    2014-01-08 11:28:52: SharePoint Products Configuration Wizard version 15.0.4420.1017. Copyright (C) Microsoft Corporation 2012. All rights reserved.

    Performing configuration task 1 of 3
    Initializing SharePoint Products configuration…

    Successfully initialized the SharePoint Products configuration.

    Performing configuration task 2 of 3
    Installing the application content files…

    Installing the SharePoint Central Administration Web Application content files…

    Installing the SharePoint Web Application content files…

    Failed to install the application content files.

    An exception of type System.NullReferenceException was thrown. Additional exception information: Object reference not set to an instance of an object.

    Total number of configuration settings run: 2
    Total number of successful configuration settings: 1
    Total number of unsuccessful configuration settings: 1
    Successfully stopped the configuration of SharePoint Products.
    Configuration of SharePoint Products failed. Configuration must be performed before you use SharePoint Products. For further details, see the diagnostic log located at D:\SharePointLogs\PSCDiagnostics_1_8_2014_11_27_58_106_1169585150.log and the application event log.

    I swear Object reference not set to an instance of an object is the most infuriating error message ever created.

    We also were getting an event log entry.

    Failed to install the application content files.
    An exception of type System.NullReferenceException was thrown. Additional exception information: Object reference not set to an instance of an object.
    System.NullReferenceException: Object reference not set to an instance of an object.
    at Microsoft.SharePoint.Administration.SPAspConfigurationFile.ApplyActionToXmlDocument(XmlDocument xdAction, XmlDocument xd, String sourceFileName, SupportedXmlDocutmentActions supportedActions)
    at Microsoft.SharePoint.Administration.SPAspConfigurationFile.MergeWebConfig(XmlDocument xdWebConfig, String fileMask)
    at Microsoft.SharePoint.Administration.SPWebService.ApplyApplicationContentToLocalServer()
    at Microsoft.SharePoint.PostSetupConfiguration.ApplicationContentTask.Run()
    at Microsoft.SharePoint.PostSetupConfiguration.TaskThread.ExecuteTask()

    After a bit of searching I finally came across this thread on MSDN, which suggested (of all things) to remove any Comments from the web.config files for my web applications.  Odd, but worth a try.

    I found the following in the web.config for my MySites web application.  I don’t remember commenting that line out, but I went ahead and removed the comments and saved the file.

    <modules runAllManagedModulesForAllRequests="true">
    <remove name="AnonymousIdentification" />
    <remove name="FileAuthorization" />
    <remove name="Profile" />
    <remove name="WebDAVModule" />
    <!--<remove name="Session" />-->
    ...
    </modules>

    I then re-ran the Installer for Reporting Services, and sure enough, it finished successfully.

    Given that the comment is legitimate XML markup it seems odd that the SharePoint Configuration Wizard would choke on it.  But nevertheless, I’m past this issue an on to the next one.