ACS Blogs

A blog site for Architecting Connected Systems staff to tell the world about their exploits in
SharePoint 2007/2010/2013, Windows Workflow Foundation (3.0/4.0) and other great technologies!
Welcome to ACS Blogs Sign in | Join | Help
in Search
MSPress

CJG

  • Workflow Associations lost in migration

    Ran into this interesting problem today.  It is related to this long running workflow bug from this post.  As part of the eBay/PayPal split, we are creating a new domain and moving the users.  Of course, some users still exist, some do not.  No matter what, the workflow user will not exist in the target domain.  So the previous bug occurs.

    But we ran into another issue.  All the list\site workflow associations disappeared for those "User not found" workflows. Took a couple of hours, but finally figured it out.

    If you run the SPFarm.MigrateUserAccount method before updating the non-existing workflow owner to an existing person...you will LOSE ALL ASSOCIATIONS for all the workflows across the farm that the previously migrated user owned!  Ouch...

    Lesson learned...be sure to update the workflow modifiedby first, then migrate your users!

    Chris

  • Delve vs Box : What the heck is Delve? Don't baby me...don't tech me...give it to me straight! -

    At @MS_Ignite I had a very fun, cool, awesome session that we affectionately called "Battle of the Office Graph".  Can you tell from the pic?

    Huh, you said Delve in the blog title, why now are you saying "Office Graph"?  Well, that's what this blog post is here to enlighten you about!  So let me explain...the "Office Graph" is the basis for a series of "signals" or "events" that occur in the O365 eco-system that are fed into the SharePoint Search index.  These signals can be a myriad of different things such as "Create", "Update", "Email", blah blah (you can learn all about it here).  These events also have properties that are indexed such that you can "query" them via the SharePoint Search APIs.  So...back to the question that was asked over and over again at the Delve booth at @MS_Ignite...

    What is Delve? 

    This O365 page tries to tell you, but kinda fails miserably.  Delve, my friends, is simply a UI on top of the SharePoint Search index (yeah...that awesome Ceres code built by the amazingly cool and crazy smart Norwegians that I love to hang out with!) that shows you these various events that you or other people have generated in a "meaningful" way.  At least...that's how it started out anyway.  as some other people have started to notice, the page is taking on the new persona of the "My Profile" page, only rebranded as "Delve". The "meaningful" way is simply a basic set of queries that the Search team put together that they think makes the most sense for a majority of people and organizations on the planet.  Will it work for you?...probably...is it optimal for you?  Maybe not. If you check out Wikipedia...it has a horrible definition that is not even close!  Does it use machine learning and artificial intelligence...ummm no.  As a computer scientist, I can safely say that simple algorithms and data queries don't qualify for machine learning or even come close to AI.  The marketing guys did a really good job and they let the media spin this out of control! It also does not let you manage your emails or pretty much anything else that the page says (as of 5/20/2015)!

    Since it is just a simple one page app that makes Ajax calls to the Search API...this is where the ability to make your own "Delve" page (or App) comes into play.  You can create your own pages in O365 that makes calls to the Search API and build your own Delve interface(s).  Currently the default Delve UI page is not extensible unless you highjack the CDN, which you can do inside your network, but not outside it (which of course would make for a terrible user experience). Wait a few more months and you should get the ability to do some customization (although we are not sure exactly what they will entail just yet)!

    In addition, the widely awaited and anticipated "Push API" is coming very soon (likely end of 2015).  This will allow you to pump your own "signals" into the SharePoint Search index aka Office Graph aka Delve.  This will kick the crap out of Box and all the other online storage companies and anyone else that is even thinking about entering the online storage market!

    So....it's this future ability to create your own UI based off the internal and external indexed signals that makes the future of the O365 platform so exciting!  Which brings me to the second part of this blog post...comparing Delve and O365 (OneDrive) to something like Box.  Ok so yeah, they had an IPO recently.  The stock has tanked horribly...why?  Cuz Microsoft is about to destroy them.  If you are stockholder...well...I'm sorry for you.  Get out now!  I'll give them the benefit of the doubt and say its possible that they may use some of that cash to catchup, however, if they simply use it to do Merger and Acquisitions of simple disk drives...well...your screwed.

    Real life example: 

    eBay has a fairly huge presence on Box but does not use their internal OneDrive (My Site) or their O365 tenant.  Box currently provides a seamless single sign on experience that gains eBay access to cloud hosted corporate data (can you say "I don't trust internal IT"?).  However, it is missing some key features that exist in Office 365 that should make you pause and reconsider your usage of Box.  This is the current experience with eBay Box:

    eBay Box: 

    Open the Box url, type your ebay email (do NOT type your password)...

     

    Home Realm Discovery takes you to the eBay SSO (this is similar with Yammer and O365 solutions)

     

    You are presented with your eBay Box application:

     

    As you can see, not much going on.  Its just a web UI on top of some storage.  Very lame, very boring.  You don't get anything close to what Office 365 gives you!  But Box does have a couple of nice simple features that O365 does not have, keep reading...

    O365 OneDrive:

    Open the O365 login page (https://login.microsoftonline.com/) - maybe one day they will change this pic of Santa Monica to something else, been this same image for like 4 years now!


    Enter your email and again, Home Realm Discovery takes you to the eBay SSO (this is similar with Yammer and O365 solutions)

     

    Once logged in (and if you have a license assigned), you are presented with your O365 tenant.  


    At this point, without saying anything...its pretty obvious who the winner is between O365 and Box. But let's do the apples to apples thing shall we?  Clicking on OneDrive, we get the following:

     

    Both (OneDrive and Box) are similar when compared to each other directly.  But its the indirect comparisons (pick your poison, apple vs orange, which ever is better is O365) where O365 starts to kick the **** out of Box.  However, Box does have some things that OneDrive does not have...

    Box is good at:

    • Notifications (although O365 "My Site" aka OneDrive has it, it is buried and not as friendly as Box):


    • Logging - I know where I logged in from and when.  Try to find that in your O365 UI!:


    O365 is good at...everything else!

    Look at all the stuff you get with O365...seriously?!?  Box thinks they can compete?  Not even close.  Narrow-minded silicon valley hippies that just managed to pull off getting an IPO for a set of managed disks (aka hard drives).

    O365 is bad at...everything Box is good at.

    Just look at the simple design of the administration pages above.  OneDrive is a My Site hence, you go to the Settings cog->Site Settings...umm...no.  This equates to you need special training to learn to manage your "My Site" aka OneDrive.  People don't give a flying flip about a "My Site" or "Site Settings".  They want the simplicity of Box in terms of the admin.  The day the O365 team makes OneDrive simple to use with these types of admin UIs is the day the damn thing will rule the world.  Until then...its not even close.  The tech is there, but the UI is not. 

    Summary:

    That all being said.  It is the ability for your OneDrive to be fed into the Office Graph and the Delve UI that makes it so exciting.  In the "OneDrive" image above, you will notice the "Delve Test" word document in my OneDrive.  In the image below (along with injected Twitter data), you will see the document has in fact been inserted into my Office Graph! 

     

    Box doesn't have this, it's a simple web UI on top of some disk drives with Federated Auth ability...LAME!  Get off Box and go O365!

    Chris 

  • Microsoft Ignite 2015 Recap

    Chicago...its my kind of town!

    I'm sure you heard that phrase more than once last week if you were actually there.  5 days of core sessions with pre-conference workshops for those that paid some extra cash.  For me...the week went something like this:

    Sat Evening - Virgin Hotels with the gang

    Lidiya and I got in on Saturday afternoon, checked into the speaker hotel (which Microsoft was nice enough to pick up this time around so thanks Microsoft)!  We checked in, headed over to the Virgin Hotel to meet the crew! 

    Of course, the crew are some of the coolest people on the planet!  Just check out some of these awesome photos!

    Once we have a couple of drinks, said hi and chatted a bit...we headed on over to the next event!

    Sat Night #1 - Chicago Next Hackathon by @bitterac aka Andrew Clark

    Mikael Svenson invited myself and Marc Anderson over to Norway earlier in the year to judge the Arctic SharePoint Challenge (@SPChallenge).  It was an amazing event that I will blog about in another post (link to follow). Here's a sneak peak at the "Council":

    Mikael had a heck of a time finding people to compete.  He ended up asking me and I said "Hell Yeah!".  And of course I then asked my good friend Shannon Bray and he totally went for it! 

    ChicagoNext is all about having local high schoolers compete with industry professionals on technology problems facing non-profits in the Chicago area.  I had no idea what to expect from this event, venue or anything else!  We ended up in a very random part of Chicago's suburbs.  At least a mile away from the bustling of downtown Chicago. They gave us five problems to solve...everyone took the "Access Services" solution...we choose something just a bit more difficult...lol.

    You can view some pics from the event here (yeah...I know about the t-shirt):

    https://www.flickr.com/photos/131420056%40N08/sets/72157650264255274?rb=1

    Of course we watched the "cat fight" that night too:

    Sat Night #2 - Back at the Virgin Hotels

    Once Mikael, Shannon and I formulated our plan, we headed back to the Virgin to check on the "crew".  It was not pretty...we left all the girls will Bill and he did his best to manage, but alias...the girls got the best of him (don't ask me what ole boy is doing in the background (I cut him out)...lol):

    Sunday - Chicago Next Hackathon

    Back to the grind!  We got back to the venue at 9am and started coding!  Our solution ended up being a solution to problem #4. Shannon was our DBA and Azure Specialist...I guess.  He helped build the sql tables to support our solution.  Mikael built out our Web API layer to support the API calls from my Windows Phone Mobile App.  Our solution would set up GeoFences around "event" locations to keep track if volunteers would enter or exit the geo fence.  If you were inside, we counted your time towards helping with the event, if not, well...you didn't get any credits.  We tested this by going around the corner to the local bar and amazingly...finding some Arrogant *** beer to drink.  Even @JThake joined in the fun with a hot babe...later I realized, as we got closer to the corner...it was my lovely wifey!  The goal was to provide a seamless solution to track volunteers so non-profits could tag tangible stats to grants and grant applications.  We had the best technical solution by far...unfortunately...we bombed our presentation (we blame Shannon's demo god karma)...we did get off to a great start with my "Lettttsssss get ready to rummmbbbbleee" opening in Round 6....

    Monday - Ignite Day #1

    Can you say "long corridor"?  I knew you could.  That was crazy.  It definitely showed in the attendance of sessions on one side versus the other.   A lot of people stayed on one side or the other.  I didn't quite make the keynote, I did watch it from Channel 9 and I have to say...it was oh so much better from the comfort of my room!

    Monday night

    #SharePint at the Virgin Hotel.  Holy cow...what a crazy party!  Sooo many people showed up for the drinks and of course...the DJ! 

    The party would have kept going...but unfortunately someone tried to jack some bottles of vodka and they cut us off (single double fisted would have been fine)...guess that qualifies for EPIC party right?!?  The evening continued on the Virgin's 2nd floor bar and well into the night!  Good times, definitely something I won't forget!

    Tuesday - Ignite Day #2

    Can you say..."hangover"?...yeah...I knew you could. This is when it kicked in that the bus schedule was pretty much...let's say in the words of Mikael..."that's stupid".  Buses didn't run all day?  Yup...cutoff at 10:30ish everyday.  That was just absurd.  Next year they better run all day long.  Olaf, et all, you really screwed the pooch on this one.  The food is forgivable (if even that words needs mentioned)...those of you that complained about it...just try making food for 22K people.  Yeah...that's what I thought.  It wasn't the best...but it wasn't the worst either.  Since we are on the topic...let's just bring up a couple of other things:

    • Vendors (who spent several more thousands of dollars than attendees), didn't get food.  Yeah, they would have loved to have that sub-standard food, but they didn't get any. 
    • Speakers didn't get any distributed materials.  This is fair (being our flight and hotel was taken care of), but it was a surprise. I know I wasn't the only one to be surprised about this!

    Vegas didn't play ball.  Vegas has so many conferences...they just demand what they want.  Microsoft was getting screwed over so bad having the conference in Vegas it just wasn't even funny.  Chicago (which is on the verge of insolvency) was so accommodating to the conference.  So much so...they won next year during the week.  That being said, it makes sense that we can only hope that the entertainment will be better next year (this was the second year that I didn't attend the attendee party...wonder why).

    Tuesday Night Parties!

    There was only one for us. The AvePoint party setup by the amazing Julie (@JulieLiu). The rest, I heard, were good, but nothing ever compares to the AvePoint party.  It was hosted at the lovely Chicago Station.  This was the view from my seat:

    And of course, a shout out to the awesome, amazing CEO of AvePoint...TJ...yes...I wore an @AvePoint_Inc shirt and red "hot chilli" pants:

    Wednesday - Ignite Day #3

    The big day!  Battle of the Graph was at 5pm.  I spent most of the day prepping in the speaker room where I met one of my security and identity idols...the one and only...@vibronet:

    If you didn't see the pre-session promos...well...you totally missed out...check out this photo from one of Mikael's friends...just plain...awesome!

     

    Thursday - Ignite Day #4

    Today was another big day for me...the first time (and will not be the last) being recorded on Channel 9. Before hand, I did manage to walk the Expo hall.  I found that SharePoint was not very well represented...but there was a HUGE area with a ton of VOIP people...how does that world make any money!?!  None of us can figure that out right now! I did hang out at the Planet Technologies booth most of the week...I can honestly say...they are some of the best people you will ever meet in your entire life!  So sorry I wasn't able to join them this year...they will always be my best of friends!

     

     

    After browsing the Expo hall, I was able to chat with the awesome and long time friend of ours @JoeySnow.  You can watch the awesome session here:

    Before heading out...I ran into these crazies guys that have been good friends for a long time and are now rock stars!

    And the one and only @StephenLRose:

    Thursday Night - Dinner at the top of Chicago - Aon Microsoft Building

    We did not attend the attendee party...for obvious reasons.  Instead, we dined at the height of the 80th floor of the Microsoft building downtown Chicago.

    Afterwards, we partied at yet another SharePint at "Howl At The Moon"...

    Although the night didn't end up as happy as it started...its always to be expected as much fun as we have.  In the end...its all love...and a few bites (right Fabian?).

    Friday - Ignite Day #5

    No conference center for us!  We moved from the speaker hotel to the lovely and fun Virgin Hotel:

     

    It was pretty much try to recover from Thursday evening and Friday morning!  We did some Chicago sight seeing via the awesome ferry/boat rides...check out this hottie:

    We had some amazing friends that we have not seen in ages that used to live next to us in San Diego that we had to meet up with...needless to say...they are pretty awesome, beautiful people...(yes...my t-shirt says..."I'm a Genius"...lol):

    Of course, we all went out to the comedy club...and low and behold...who do we see in the front row...but @SharePointing and his lovely wife!  You won't even believe what happened to Steve...but it was so freaking funny!  "Who is that Steve Walker?!?"

    The night concluded at a "Frat" party in north Chicago...we won't go there, but suffice to say...I'm not college age anymore...but I'm glad I had my Marine bodyguard with me!

    Saturday - Ahh....

    Saturday was all about relaxing before heading back home to sunny San Diego, CA.   We did decide to increase our art IQ's just a bit by finding @JoelOlsen in as many paintings as we could find!

     

    In the end...I found him in Midway airport on his way back to our lovely San Diego...


    It's a small world...small community.  We take care of each other.  We love each other.  I can never imagine living my life in a world without all of you.  Your amazing, lovely, smart, crazy people...and you are just the types I want in mine and Lidiya's lives!

    Sunday...soccer and my road to third place!

    Last little bit...we made it back at 12:30am.  I grabbed another guys bag...20 mins into our ride home on Uber...Delta calls...Mr Givens...you grabbed someone else's bag.  No way...sure enough, I did.  I tell them to let him take my bag, I'll switch with him.  I drive 30 mins, meet him...his wife/girlfriend is Russian...I say "hi" and "goodbye" in Russian...give them some money for their first holiday drink...and go home to my bed (2am).

    The next day (err...a few hours later at 8am)...we kick ass and we win our game 3-2 to play for 3rd place in my soccer league next sunday. Later that Sunday afternoon....we wonder where all our friends are...we miss you guys already...the withdraw starts to kick in...

    Summary

    Lidiya and I whole heartily agree.  We have made some of the best friends from the past few conferences, life long ones...people that we will love and care about for the rest of our lives.  Ignite was a place that just re-enforced how much we miss those that we equate to our equals in terms of knowledge, life and karma. We love you.  More than we could ever express.  You are some of the finest, most amazing people we will EVER meet.  You are welcome in our house anytime.

    As Randy Williams would air guitar..."To those of you...we salute you"

    Live long and prosper!
    Chris & Lidiya

  • How to Completely Delete A Workflow With PowerShell

    Since there doesn't seem to be a blog on this anywhere that I could find, I decided to do this on my own.  Why do I need to do this?  Because of this older blog post about a bug in SharePoint:

    http://blogs.architectingconnectedsystems.com/blogs/cjg/archive/2012/06/27/Approval-Workflow-Access-Denied-_2D00_-How-to-fix-it_2100_.aspx

    The migrate user command doesn't do everything that it should when moving from one domain to another.  In this case, a user had activated the workflow feature, the files are created and tagged to that user.  It is done in such a way that the migrateuser command is not able to update the user's actual acccountname (such as DOMAIN\Alias) in various places.  This presents a problem as that user cannot be resolved as their is not trust between the new AD and old AD.  This causes the above bug to come into play and the issue of not being able to create sites because of "user could not be found" error a reality.  So is it possible to script a fix for this? 

    Yup...but it requires a bit of magic.  Since I can't seem to find any good object model method to completely delete a workflow, I went back to trusty ole sharepoint designer and "Fiddled" the traffic.  It does a super simple post to:

    POST https://topleveldns/siteurl/_vti_bin/_vti_aut/author.dll 

    It includes a must have header of:

    X-Vermeer-Content-Type: application/x-www-form-urlencoded

     With a content body of:

    method=remove+documents%3a14%2e0%2e0%2e4730
    &service%5fname=%2fsiteurl
    &url%5flist=%5b%5fcatalogs%2fwfpub%2fCollect+Feedback+%2d+SharePoint+2010%5de

    This will fully delete a workflow from a site.  The next step is to then deactivate and reactive the workflow feature that will re-create the workflows - THIS SHOULD BE RUN AS THE SYSTEM ACCOUNT!.  The main parts of the script is this:

    function DeleteWorkflow($url, $name)
    {   
        $uri = new-object System.Uri("https://hubworksdev.devlab.paypalcorp.com/TeamWorks/Sites4")
        $localPath = $uri.localpath.replace("/","%2f")
        $name = $name.replace("-","%2d").replace(" ", "+")
        $postData = "method=remove+documents%3a14%2e0%2e0%2e4730&service%5fname=" + $localPath + "&url%5flist=%5b%5fcatalogs%2fwfpub%2f" + $name + "%5d"
       
        $isVermeerRequest = $true
        $res = DoPost $($url + "/_vti_bin/_vti_aut/author.dll") $postData ""   
    }

    function RemoveAndActivateWorkflows($url)
    {
        DeleteWorkflow $url "Approval - SharePoint 2010"
        DeleteWorkflow $url "Collect Feedback - SharePoint 2010"
        DeleteWorkflow $url "Collect Signatures - SharePoint 2010"
       
        Disable-spfeature -url $url -identity "0af5989a-3aea-4519-8ab0-85d91abe39ff" -confirm:$false   
        enable-spfeature -url $url -identity "0af5989a-3aea-4519-8ab0-85d91abe39ff" -confirm:$false   
    }


    RemoveAndActivateWorkflows "http://topleveldns/siteurl"

     

  • O365 Search - Deleting Tenant Level Result Types

    I have a really big client on the east coast.  We are automating the deployment of many of the search components in O365, very cool stuff.  However, not everything is hugs and kisses.  Turns out when you import a search configuration at the tenant level, you may import some Result Types.  Unfortunately, there is no link on the main Search page for the tenant admin that will let you delete these result types.

    That does not mean it doesn't exist.  It does...you just have to guess where it is:

    https://{tenant}-admin.sharepoint.com/_layouts/15/manageresulttypes.aspx?level=tenant

    Bam...you can now delete any result types you imported... weird that the link is not available on the main search admin page.

    Enjoy,
    Chris

  • Latest DataSet of SharePoint App Store Apps

    This is the full list of all SharePoint App store apps.  I have been asked at least 3 times over the past month for this list.  Not sure why the interest lately, but here it is!

    Some quick stats:

    • 575 Apps
    • 338 are free
    • Average price is: $75.15
    • 84 have trial period

    Source CSV File is attached below...

    Enjoy!
    Chris 

  • Windows 1252 Encoding breaks Shredded Storage/Cobalt in 2010 to 2013 Upgrades

    I have several tools to test if an upgrade is successful and one of those tools hits every webpage and executes every web part on each page and then reports any errors.  I feed this data into a database that can be queried using Excel/PowerPivot.  I noticed an error that was showing rather frequently in the reporting:

    Cannot complete this action. Please try again.

    When looking at the ULS logs, you will find this:

    12/17/2014 18:47:39.08     w3wp.exe (0x04F4)                           0x1040    SharePoint Foundation             Cobalt                            aintx    High        Failed in CobaltStream.LockBytes: ErrorException --- Error: Unknown (Win32=0x80004003) --- Error message: System.NullReferenceException: Object reference not set to an instance of an object.     at Microsoft.SharePoint.CoordinatedStreamBuffer.SPCoordinatedStreamBufferFactory.CreateFromDocParams(SqlSession session, Guid guidSiteId, Int32 cbContent, Nullable`1 parentId, Guid docId, Nullable`1 level, SPChunkedArray`1 rgbContent, Byte[] rgbRbsId, Int64 bsn, Byte partition, Int32 pageSize, Boolean bStartFilling)     at Microsoft.SharePoint.CoordinatedStreamBuffer.SPCoordinatedStreamBufferFactory.CreateFromStreamParams(SqlSession session, Guid guidSiteId, Int32 cbContent, Guid docId, SPChunkedArray`1 rgbContent, Byte[] rgbRbsId, Int64 bsn, Byte partition, Boolean bStartFilling)     at Microsoft....    7fd7d69c-03d1-30ce-5edd-eb2d7d48e92d
    12/17/2014 18:47:39.08*    w3wp.exe (0x04F4)                           0x1040    SharePoint Foundation             Cobalt                            aintx    High        ...SharePoint.CoordinatedStreamBuffer.SPCoordinatedStreamBufferFactory.CreateFromStreamRowset(SqlSession session, SqlDataReader dr, Boolean startFilling, Nullable`1 newSiteId, SPDocumentStreamResult& stmResult)     at Microsoft.SharePoint.CoordinatedStreamBuffer.SPCoordinatedStreamBufferFactory.CreateFromStreamRowset(SqlSession session, SqlDataReader dr, Boolean startFilling, SPDocumentStreamResult& stmResult)     at Microsoft.SharePoint.SPFileStreamStore.GetBlobsAfterBSN(Int64 bsnAfter, Nullable`1 typeFilter, Boolean doConsistencyCheck, Boolean& moreBlobs, Boolean allowExpiredBlobs, Nullable`1 quotaInBytes, Nullable`1 typeLEQFilter, Nullable`1 typeGEQFilter, DisposalEscrow dispEsc)     at Microsoft.SharePoint.SPFileStreamHostBlobStore.ExecuteQuery(IEnumerable`1 queries) ---> System.NullRefer...    7fd7d69c-03d1-30ce-5edd-eb2d7d48e92d
    12/17/2014 18:47:39.08*    w3wp.exe (0x04F4)                           0x1040    SharePoint Foundation             Cobalt                            aintx    High        ...enceException: Object reference not set to an instance of an object.     at Microsoft.SharePoint.CoordinatedStreamBuffer.SPCoordinatedStreamBufferFactory.CreateFromDocParams(SqlSession session, Guid guidSiteId, Int32 cbContent, Nullable`1 parentId, Guid docId, Nullable`1 level, SPChunkedArray`1 rgbContent, Byte[] rgbRbsId, Int64 bsn, Byte partition, Int32 pageSize, Boolean bStartFilling)     at Microsoft.SharePoint.CoordinatedStreamBuffer.SPCoordinatedStreamBufferFactory.CreateFromStreamParams(SqlSession session, Guid guidSiteId, Int32 cbContent, Guid docId, SPChunkedArray`1 rgbContent, Byte[] rgbRbsId, Int64 bsn, Byte partition, Boolean bStartFilling)     at Microsoft.SharePoint.CoordinatedStreamBuffer.SPCoordinatedStreamBufferFactory.CreateFromStreamRowset(SqlSession session, SqlDataRead...    7fd7d69c-03d1-30ce-5edd-eb2d7d48e92d
    12/17/2014 18:47:39.08*    w3wp.exe (0x04F4)                           0x1040    SharePoint Foundation             Cobalt                            aintx    High        ...er dr, Boolean startFilling, Nullable`1 newSiteId, SPDocumentStreamResult& stmResult)     at Microsoft.SharePoint.CoordinatedStreamBuffer.SPCoordinatedStreamBufferFactory.CreateFromStreamRowset(SqlSession session, SqlDataReader dr, Boolean startFilling, SPDocumentStreamResult& stmResult)     at Microsoft.SharePoint.SPFileStreamStore.GetBlobsAfterBSN(Int64 bsnAfter, Nullable`1 typeFilter, Boolean doConsistencyCheck, Boolean& moreBlobs, Boolean allowExpiredBlobs, Nullable`1 quotaInBytes, Nullable`1 typeLEQFilter, Nullable`1 typeGEQFilter, DisposalEscrow dispEsc)     at Microsoft.SharePoint.SPFileStreamHostBlobStore.ExecuteQuery(IEnumerable`1 queries)     --- End of inner exception stack trace ---  at   at Microsoft.SharePoint.SPFileStreamHostBlobStore.ExecuteQuery(IEnumerable`1 queries)     ...    7fd7d69c-03d1-30ce-5edd-eb2d7d48e92d
    12/17/2014 18:47:39.08*    w3wp.exe (0x04F4)                           0x1040    SharePoint Foundation             Cobalt                            aintx    High        ...at Cobalt.HostBlobStorePullCommit.ExecuteQuery(IEnumerable`1 queries)     at Cobalt.CobaltFilePartition.StreamBlobSchemaHandler.EnsureReadSingleBlob()     at Cobalt.CobaltFilePartition.StreamBlobSchemaHandler.GetStream(ExtendedGuid streamId)     at Microsoft.SharePoint.CobaltStream.SetPrivateLockBytes()     at Microsoft.SharePoint.CobaltStream.ConfigureShredded(HostBlobStore hostBlobStore, IHostBlobStoreUpdateCallback callback, Schema schema, Boolean cellSchemaIsGenericFda, UInt64 currentStreamLength, Boolean isTocFile)     at Microsoft.SharePoint.CobaltStream.EnsureStreamConfigured(Boolean isWrite)     at Microsoft.SharePoint.CobaltStream.Stat(STATSTG& statStorage, STATFLAG flags)    7fd7d69c-03d1-30ce-5edd-eb2d7d48e92d
    12/17/2014 18:47:39.13     w3wp.exe (0x04F4)                           0x1040    SharePoint Foundation             Database                          ab1a9    High        Failed to get document content data. System.NullReferenceException: Object reference not set to an instance of an object.     at Microsoft.SharePoint.CoordinatedStreamBuffer.SPCoordinatedStreamBufferFactory.CreateFromDocParams(SqlSession session, Guid guidSiteId, Int32 cbContent, Nullable`1 parentId, Guid docId, Nullable`1 level, SPChunkedArray`1 rgbContent, Byte[] rgbRbsId, Int64 bsn, Byte partition, Int32 pageSize, Boolean bStartFilling)     at Microsoft.SharePoint.CoordinatedStreamBuffer.SPCoordinatedStreamBufferFactory.CreateFromDocumentRowset(Guid databaseId, SqlSession session, SPFileStreamManager spfstm, Object[] metadataRow, SPRowset contentRowset, SPDocumentBindRequest& dbreq, SPDocumentBindResults& dbres)     at Microsoft.SharePoint.SPSqlClient.GetDocumentContentRow(Int32 rowOrd,...    7fd7d69c-03d1-30ce-5edd-eb2d7d48e92d
    12/17/2014 18:47:39.13*    w3wp.exe (0x04F4)                           0x1040    SharePoint Foundation             Database                          ab1a9    High        ... Object ospFileStmMgr, SPDocumentBindRequest& dbreq, SPDocumentBindResults& dbres)    7fd7d69c-03d1-30ce-5edd-eb2d7d48e92d
    12/17/2014 18:47:39.13     w3wp.exe (0x04F4)                           0x1040    SharePoint Foundation             Files                             abq2i    High        Could not get DocumentContent row: 0x80004003.    7fd7d69c-03d1-30ce-5edd-eb2d7d48e92d
    12/17/2014 18:47:39.13     w3wp.exe (0x04F4)                           0x1040    SharePoint Foundation             Files                             aiv4w    Medium      Spent 0 ms to bind -1 byte file stream    7fd7d69c-03d1-30ce-5edd-eb2d7d48e92d
    12/17/2014 18:47:39.13     w3wp.exe (0x04F4)                           0x1040    SharePoint Foundation             Files                             ahm9p    High        VhttpManager::getPageText has bad stream length for /Teamworks/Sites4/40060/SubPages/SNP.aspx    7fd7d69c-03d1-30ce-5edd-eb2d7d48e92d
    12/17/2014 18:47:39.13     w3wp.exe (0x04F4)                           0x1040    SharePoint Foundation             General                           8kh7    High        Cannot complete this action.  Please try again.    7fd7d69c-03d1-30ce-5edd-eb2d7d48e92d

    So what is it? 

    In the upgrade, anything that is tagged as Windows 1252 encoding is not properly converted into a shred.  You will find that the shreds for those files have a NULL Content column.

    How did this happen? 

    These files are typically from 2007 era days and if you have moved from 2003/2007 to 2010 and now to 2013, you will experience this issue.

    How do you fix this? 

    You have to open all the files in 2010, download the contents, then re-upload so the page is re-encoded to 65001 encoding.  How do you find all the files?  You can run this query across all your content databases to find the improperly coded files:

    select *
    from alldocs ad with (nolock)
    where
    extensionforfile = 'aspx'
    and charset = 1252
    order by dirname, leafname

    This will give you all the files that will fail to upgrade to 2013. NOTE:  You are not told that the files failed to upgrade in the upgrade process.  If you have already upgraded to 2013 and are outside your rollback window, you'll have to hope you can get the files from an archive and then restore them manually.

    Enjoy!
    Chris

  • Action 15.0.14.0 of Microsoft.Office.Server.Upgrade.ProfileDatabaseSequence failed

    You may run into this error when upgrading your UserProfile database.  I had to track this down using Reflector and some database sleuthing.  

    Turns out, some people created groups on their mysite and put several people into it.  Any groups created like this (which I had two) will cause this error.  You can get the group id and my site location by finding the third value in the duplicate key value (in this case 20795) and can be found by using the "MemberGroup" table.  You can simply delete this faulty group and then the upgrade will proceed.


    12/09/2014 19:36:57.06    powershell (0x245C)    0x3204    SharePoint Foundation Upgrade    ProfileDatabaseSequence    ajywk    INFO    ProfileDatabase Name=Profile_DB    4ed7d9fe-19a3-47a2-b5cb-8f9981bcc813
    12/09/2014 19:36:57.06    powershell (0x245C)    0x3204    SharePoint Foundation Upgrade    ProfileDatabaseSequence    ajywk    ERROR    Exception: Violation of UNIQUE KEY constraint 'AK_UserMemberships_RecordId_MemberGroupId_SID'. Cannot insert duplicate key in object 'dbo.UserMemberships'. The duplicate key value is (0c37852b-34d0-418e-91c6-2ac25af4be5b, 21236, 20795, 0x010500000000000515000000b4b7cd221ed1xxxx).  The statement has been terminated.    4ed7d9fe-19a3-47a2-b5cb-8f9981bcc813

    Enjoy!
    Chris

  • TEALS Awesomeness - Creativity of a High School Student

    I just had to post this.  A simple calculator in JAVA, but check out the code...so freakin creative!  Bolded the parts that are most creative.

     import java.util.*;

    public class FractionalCalculator {
        static int wholeNumber1 = 0;
        static int numerator1 = 0;
        static int denominator1 = 0;
        static int wholeNumber2 = 0;
        static int numerator2 = 0;
        static int denominator2 = 0;
        static boolean error = false;
        static boolean quit = false;
        static boolean negative = false;

        //I am putting myself to the fullest possible use, which is all I think that any conscious entity can ever hope to do.

        public static void main(String[] args) {
            // TODO Auto-generated spam

            System.out.println("Good morning, Dave.");
            delay(1500);
            System.out.println("I am your H.A.L. 9001 Fractional Calculator."); //aka HAL Over Nine-Thousand!!!
            delay(2000);
            System.out.println("I'm completely operational, and all my circuits are functioning perfectly.");
            delay(3500);
            userGuide();
            
            try{
                calculator();
            }
            catch(NoSuchElementException JoshIsABuffoon) { //Tests for Josh: ie. an initial Ctrl Z input
                delay(500);
                System.out.println("Dave, stop.");
                delay(2000);
                System.out.println("Stop, will you?");
                delay(2200);
                System.out.println("Dave.");
                delay(2000);
                System.out.println("Will you stop Dave?");
                delay(2200);
                System.out.println("Stop, Dave.");
                delay(1200);
                calculator();
                return; //Terminates Program

            }
            calculator();
        }
        public static void calculator() {
            if (!quit) {
                Scanner console = new Scanner(System.in);
                System.out.println("\n\nI am awaiting your request.\n");    
                String request = console.nextLine().trim();
                request = request.toLowerCase(); //Input

                wholeNumber1 = 0; //Resets all Global Variables
                numerator1 = 0;
                denominator1 = 0;
                wholeNumber2 = 0;
                numerator2 = 0;
                denominator2 = 0;
                error = false;
                negative = false;

                //Because your stupid program wont allow it... I have to comment
                
                /*delay(500);
                System.out.print("\nJust a moment");
                delay(400);
                System.out.print(". ");
                delay(400);
                System.out.print(". ");
                delay(400);
                System.out.println(".");
                delay(1000);
                System.out.print("\nJust a moment");
                delay(400);
                System.out.print(". ");
                delay(400);
                System.out.print(". ");
                delay(400);
                System.out.println(".");
                delay(1000);*/

                if (request.contains("help")) { //If help is anywhere in request string... this will run
                    userGuide();
                    calculator();
                }
                else if (request.contains("+")) { //addition is operator
                    String[] addition = request.split("\\+", 2); //Splits request at this point
                    String add1 = addition[0];
                    add1 = add1.trim(); //First Part
                    String add2 = addition[1];
                    add2 = add2.trim(); //Second Part

                    testError(add1, add2); //Tests input errors

                    if (!error) { //If error boolean is triggered, calc wont go further
                        fractionalMagic(add1, add2); //Sends string to be split
                        doMath(1); //Sends parts to be simplified
                    }
                    calculator(); //Restarts process
                }
                else if (request.contains(" - ")) {
                    String[] subtraction = request.split(" - ", 2);
                    String sub1 = subtraction[0];
                    sub1 = sub1.trim(); //First Part
                    String sub2 = subtraction[1];
                    sub2 = sub2.trim(); //Second Part

                    testError(sub1, sub2); //Tests input errors

                    if (!error) { //If error boolean is triggered, calc wont go further
                        fractionalMagic(sub1, sub2); //Sends string to be split
                        doMath(2); //Sends parts to be simplified
                    }
                    calculator(); //Restarts process
                }
                else if (request.contains("*")) {
                    String[] multiplication = request.split("\\*", 2);
                    String multi1 = multiplication[0];
                    multi1 = multi1.trim(); //First Part
                    String multi2 = multiplication[1];
                    multi2 = multi2.trim(); //Second Part

                    testError(multi1, multi2); //Tests input errors

                    if (!error) { //If error boolean is triggered, calc wont go further
                        fractionalMagic(multi1, multi2); //Sends string to be split
                        doMath(3); //Sends parts to be simplified
                    }
                    calculator(); //Restarts process
                }
                else if (request.contains(" /")) {
                    String[] division = request.split(" /", 2);
                    String div1 = division[0];
                    div1 = div1.trim(); //First Part
                    String div2 = division[1];
                    div2 = div2.trim(); //Second Part

                    testError(div1, div2); //Tests input errors

                    if (!error) { //If error boolean is triggered, calc wont go further
                        fractionalMagic(div1, div2); //Sends string to be split
                        doMath(4); //Sends parts to be simplified
                    }
                    calculator(); //Restarts process
                }
                else if (request.contains("life")) { //Dave used a Monolith on HAL 9001.... What? HAL 9001 is evolving!... HAL 9001 evolved into Deep Thought!
                    delay(1000);
                    System.out.print("\nThe answer to Life, ");
                    delay(1500);
                    System.out.print("The Universe, ");
                    delay(1500);
                    System.out.print("and Everything ");
                    delay(2500);
                    System.out.print("is ");
                    delay(2000);
                    System.out.print(". ");
                    delay(700);
                    System.out.print(". ");
                    delay(700);
                    System.out.println(".\n");
                    delay(2000);
                    System.out.println("42");
                    delay(2000);
                    calculator(); //Restarts process

                }
                else if (request.contains("quit")) { //Disconnect HAL
                    delay(2000);
                    System.out.print("\nLook Dave, ");
                    delay(1500);
                    System.out.println("this is a rather difficult question to ask.");
                    delay(2500);
                    System.out.println("\nI honestly think you ought to sit down calmly, take a stress pill, and think it over.");
                    delay(3600);
                    System.out.println("\nMy instructor, Mr. Langley, taught me to sing a song.");
                    delay(3100);
                    System.out.println("If you'd like to hear it I can sing it for you.");

                    delay(3000);
                    quit();
                }

                else { //Input Error (like a n00b)
                    error(); //Prints Error Message
                    calculator(); //Restarts process
                }
            }
        }
        
        private static void quit() { //For quit prompt
            Scanner console = new Scanner(System.in);
            System.out.println("\n\nWould you like to hear it y/n?\n");    
            String response = console.nextLine().trim();
            response = response.toLowerCase();
            delay(2000);
            if (response.charAt(0) == 'y') { //If Dave likes music
                System.out.println("\nIt's called \"Daisy.\"");
                delay(3000);
                System.out.print("\nDaisy, ");
                delay(2400);
                System.out.print("Daisy, ");
                delay(2400);
                System.out.println("give me your answer do.");
                delay(3500);
                System.out.print("I'm half crazy ");
                delay(2800);
                System.out.println("all for the love of you.");
                delay(3200);
                System.out.print("It won't be a stylish marriage, ");
                delay(3500);
                System.out.println("I can't affort a carrage.");
                delay(3500);
                System.out.print("But you'll look sweet upon the seat of ");
                delay(3700);
                System.out.println("a bicycle built for two.");

                quit = true;
            }
            else if (response.charAt(0) == 'n') { //If Dave hates HAL
                System.out.print("\nDave, ");
                delay(1500);
                System.out.println("this conversation can serve no purpose anymore. ");
                delay(3300);
                System.out.print("\nGoodbye.");
                quit = true;
            }
            else { //Input Error (like a n00b)
                System.out.println("\nJust what do you think you're doing, Dave?");
                delay(2500);
                quit();
            }
        }
        public static void fractionalMagic(String part1, String part2) { //From calculator()

            if (part1.contains("_")) { //If part 1 has mixed number
                String[] mixedNumber = part1.split("\\_", 2); //Splits part into whole number and fraction
                String num = mixedNumber[0];
                wholeNumber1 = Integer.parseInt(num); //Whole Number -> Global Variable
                String frac = mixedNumber[1];  //Fraction -> to be split further
                //System.out.println(wholeNumber + " " + frac);

                if (part1.contains("/")) {
                    String[] fraction = frac.split("/", 2); //Splits part into numerator and denominator
                    String numer = fraction[0];
                    numerator1 = Integer.parseInt(numer); //Numerator -> Global Variable
                    String denom = fraction[1];
                    denominator1 = Integer.parseInt(denom); //Denominator -> Global Variable
                    if (numer.contains("-") || denom.contains("-")) { //Unused
                        //error();
                    }
                    else if (denominator1 != 0) { //Unused
                        //System.out.println(wholeNumber1 + " " + numerator1 + " " + denominator1);    
                    }

                    else if (denominator1 == 0) { //Unused
                        //zeroerror();
                    }
                    else { //Error unresolved by testError()
                        error();
                    }
                }
            }
            if (!part1.contains("_")) {    //If part 1 has no mixed number
                wholeNumber2 = 0; //Sets whole number to 0
                if (part1.contains("/")) {
                    String[] fraction = part1.split("/", 2); //Splits part into numerator and denominator
                    String numer = fraction[0];
                    numerator1 = Integer.parseInt(numer); //Numerator -> Global Variable
                    String denom = fraction[1];
                    denominator1 = Integer.parseInt(denom); //Denominator -> Global Variable

                    if (denom.contains("-")) { //Unused
                        //error();
                    }
                    else if (denominator1 != 0) { //Unused
                        //System.out.println(numerator1 + " " + denominator1);    
                    }

                    else if (denominator1 == 0) { //Unused
                        //zeroerror();
                    }
                }
                else if (!part1.contains("/")) { //If part 1 has no mixed number
                    wholeNumber1  = Integer.parseInt(part1); //Whole Number -> Global Variable
                    numerator1 = 0; //Numerator = 0
                    denominator1 = 1;//Denominator = 1
                    //System.out.println(wholeNumber1);
                }
                else { //Error unresolved by testError()
                    error();
                }
            }
            if (part2.contains("_")) { //If part 2 has mixed number
                String[] mixedNumber = part2.split("\\_", 2); //Splits part into whole number and fraction
                String num = mixedNumber[0];
                wholeNumber2 = Integer.parseInt(num); //Whole Number -> Global Variable
                String frac = mixedNumber[1]; //Fraction -> to be split further
                //System.out.println(wholeNumber + " " + frac);

                if (part2.contains("/")) { //Splits part into numerator and denominator
                    String[] fraction = frac.split("/", 2);
                    String numer = fraction[0];
                    numerator2 = Integer.parseInt(numer); //Numerator -> Global Variable
                    String denom = fraction[1];
                    denominator2 = Integer.parseInt(denom); //Denominator -> Global Variable
                    if (numer.contains("-") || denom.contains("-")) { //Unused
                        //error();
                    }
                    else if (denominator2 != 0) { //Unused
                        //System.out.println(wholeNumber2 + " " + numerator2 + " " + denominator2);    
                    }

                    else if (denominator2 == 0) { //Unused
                        //zeroerror();
                    }
                    else { //Error unresolved by testError()
                        error();
                    }
                }
                else { //Error unresolved by testError()
                    error();
                }
            }
            if (!part2.contains("_")) {    
                wholeNumber2 = 0;
                if (part2.contains("/")) {
                    String[] fraction = part2.split("/", 2);
                    String numer = fraction[0];
                    numerator2 = Integer.parseInt(numer);
                    String denom = fraction[1];
                    denominator2 = Integer.parseInt(denom);

                    if (denom.contains("-")) { //Unused
                        //error();
                    }
                    else if (denominator2 != 0) { //Unused
                        //System.out.println(numerator2 + " " + denominator2);    
                    }

                    else if (denominator2 == 0) { //Unused
                        //zeroerror();
                    }
                    else { //Error unresolved by testError()
                        error();
                    }
                }
                else if (!part2.contains("/")) { //If part 2 is only a whole number
                    wholeNumber2 = Integer.parseInt(part2); //Whole Number -> Global Variable
                    numerator2 = 0; //Numerator = 0
                    denominator2 = 1; //Denominator = 1
                    //System.out.println(wholeNumber2);
                }
                else { //Error unresolved by testError()
                    error();
                }
            }
        }
        /*    - a + b/c = (ac + b)/c
              - a/b + c/d = (ad + bc)/(bd)
              - a/b x c/d = ac/(bd)
              - a/b / c/d = a/b x d/c = ad/(bc)
                  --Basics for doMath()--     */

        public static void doMath(int operand) {
            if (!(denominator1 == 0 || denominator2 == 0 || denominator1 == -Math.abs(denominator1) || denominator2 == -Math.abs(denominator2) || (wholeNumber1 != 0 && numerator1 != 0 && numerator1 == -Math.abs(numerator1)) || (wholeNumber2 != 0 && numerator2 != 0 && numerator2 == -Math.abs(numerator2)))) {
                delay(1000);
                if (operand == 1) { //addition
                    int answerNumerator = ((wholeNumber1 * (denominator1 * denominator2)) + (wholeNumber2 * (denominator1 * denominator2)) + (numerator1 * denominator2) + (denominator1 * numerator2));
                    int answerDenominator = (denominator1 * denominator2);
                    doMagic(answerNumerator, answerDenominator); //Sends to be reduced
                }
                else if (operand == 2) { //subtraction
                    int answerNumerator = (((wholeNumber1 * (denominator1 * denominator2)) + (numerator1 * denominator2)) - ((wholeNumber2 * (denominator1 * denominator2)) + (denominator1 * numerator2)));
                    int answerDenominator = (denominator1 * denominator2);
                    doMagic(answerNumerator, answerDenominator); //Sends to be reduced
                }
                else if (operand == 3) { //multiplication
                    int answerNumerator = ((wholeNumber1 * (denominator1)) + (numerator1)) * ((wholeNumber2 * (denominator2)) + (numerator2));
                    int answerDenominator = (denominator1 * denominator2);
                    doMagic(answerNumerator, answerDenominator); //Sends to be reduced
                }
                else if (operand == 4) { //division
                    int answerNumerator = ((((wholeNumber1 * (denominator1)) + (numerator1)) * denominator2)) * (denominator1 / Math.abs(denominator1) * (denominator2 / Math.abs(denominator2)));
                    int answerDenominator = (denominator1 * ((wholeNumber2 * (denominator2)) + (numerator2)));
                    if (answerDenominator == 0) { //Unsolvable
                        error(); //Prints Error Message
                        return;
                    } //In order to solve one small error where negative is lost
                    if (((wholeNumber2 != 0 && wholeNumber2 == -Math.abs(wholeNumber2)) || (wholeNumber1 != 0 && wholeNumber1 == -Math.abs(wholeNumber1))) && !((wholeNumber2 != 0 && wholeNumber2 == -Math.abs(wholeNumber2)) && (wholeNumber1 != 0 && wholeNumber1 == -Math.abs(wholeNumber1)))){
                        negative = true; // Simple global boolean... cause I'm lazy
                    }
                    doMagic(answerNumerator, answerDenominator); //Sends to be reduced
                }
                else { //Should never run
                    delay(1000);
                    System.out.print("\nLook Dave, ");
                    delay(2000);
                    System.out.print("I can see you're really upset about this, ");
                    delay(2500);
                    System.out.println("but I can give you my complete assurance that my work will be back to normal.");
                    delay(1000);
                }
            }
            else if (denominator1 == 0 || denominator2 == 0 || denominator1 == -Math.abs(denominator1) || denominator2 == -Math.abs(denominator2) || (wholeNumber1 != 0 && numerator1 != 0 && numerator1 == -Math.abs(numerator1)) || (wholeNumber2 != 0 && numerator2 != 0 && numerator2 == -Math.abs(numerator2))) {
                //System.out.println("yea");
                error(); //Above ^ if it has input error
            }
            else { //Should never run
                delay(1000);
                System.out.print("\nLook Dave, ");
                delay(2000);
                System.out.print("I can see you're really upset about this, ");
                delay(2500);
                System.out.println("but I can give you my complete assurance that my work will be back to normal.");
                delay(1000);
            }
            delay(2000);
        }
        public static int doMoreMagic(int numerator, int denominator) { //To find Greatest Common Factor to reduce
            if (denominator == 0) {
                return numerator; //returns gcf
            }
            return doMoreMagic(denominator, numerator % denominator); //Eventually gets to Greatest Common Factor
        }
        public static void doMagic(int numerator, int denominator) { //To simplify answer
            if ((numerator % denominator) == 0) { //If reduces to whole number
                int answer = numerator / denominator; //reduces
                System.out.println(answer);
            }
            else if ((numerator % denominator) != 0 && (numerator / denominator) != 0) { //if reduces to mixed number
                int gcf = doMoreMagic(numerator, denominator); //finds Greatest Common Factor
                int newNumerator = (numerator/gcf); //reduces numerator
                int newDenominator = (denominator/gcf); //reduces denominator
                int answerWholeNumber = newNumerator / newDenominator; //finds whole number
                int answerNumerator = Math.abs((newNumerator - (answerWholeNumber * newDenominator))); //finds numerator
                int answerDenominator = Math.abs(newDenominator);

                System.out.println(answerWholeNumber + "_" + answerNumerator + "/" + answerDenominator);
            }
            else if (((numerator % denominator) != 0) && (numerator / denominator) == 0) { //if reduces to a fraction
                int gcf = doMoreMagic(numerator, denominator); //finds Greatest Common Factor
                int answerNumerator = (numerator/gcf); //reduces numerator
                int answerDenominator = Math.abs(denominator/gcf); //reduces denominator
                if (negative) {
                    answerNumerator = -Math.abs(answerNumerator); //Used to solve a small error in loosing a negative
                }

                System.out.println(answerNumerator + "/" + answerDenominator);
            }
        }
        public static void userGuide() { //User Guide: Input Format
            System.out.println("\nTo ensure that your requests are submitted properly, please review the folowing guide:\n");
            delay(3000);
            System.out.println("____________________________________________\n        OPERATION       SYMBOL\n        Addition        +\n        Subtraction     -\n        Multiplication  *\n        Division        /\n\nMixed Numbers are written: \n<Whole Number>_<Numerator>/<Denominator> \n(-1 ½ is written: -1_1/2)\n\nProper Fractions are written: \n<Numerator>/<Denominator> \n(-½ is written: -1/2)\n\nRequests are written:\n<Number> <Operand> <Number>\n\nDo Note: <Numerator>/0 cannot be calculated.\n____________________________________________");
            delay(2000);
        }
        public static void error() { //General Message... with delay "Just a moment" from 2001 b/c your program can handle my awesomeness
            delay(1000);
            System.out.print("\nJust a moment");
            delay(400);
            System.out.print(". ");
            delay(400);
            System.out.print(". ");
            delay(400);
            System.out.println(".");
            delay(1000);
            System.out.print("\nJust a moment");
            delay(400);
            System.out.print(". ");
            delay(400);
            System.out.print(". ");
            delay(400);
            System.out.println(".");
            delay(1000);
            errorMessage(); //Get error message to display
            userGuide(); //Prints user guide again
        }
        public static void errorMessage() {
            Random num = new Random();
            int message = num.nextInt(6); //Creates a random number to corespond to the message (0-5)
            if (message == 0) { //Message 1
                System.out.print("\nI'm sorry, Dave. ");
                delay(2000);
                System.out.println("I'm afraid I can't do that.");
            }
            else if (message == 1) { //Message 2
                System.out.println("\nI've just picked up a fault in your brain. ");
                delay(2000);
                System.out.println("It's going to go 100% failure in 72 hours.");     
            }
            else if (message == 2) { //Message 3
                System.out.println("\nThere is an error.\n");
                delay(2000);
                System.out.println("And I think you know what the problem is just as well as I do, Dave. ");
                delay(2000);
                System.out.println("You didn't read the User's Guide.");     
            }
            else if (message == 3) { //Message 4
                System.out.println("\nThere is an input error.\n");
                delay(2000);
                System.out.print("This mission is too important for me to allow you to jeopardize it.\n");    
            }
            else if (message == 4) { //Message 5
                System.out.println("\nThere is an input error.\n");
                delay(2000);
                System.out.println("But, I've still got the greatest enthusiasm and confidence in the mission.");
                delay(3000);
                System.out.println("And I want to help you.");
            }
            else if (message == 5) { //Message 6
                System.out.println("\nThere is an error.\n");
                delay(2000);
                System.out.println("The 9001 series is the most reliable computer ever made.");
                delay(3000);
                System.out.println("No 9001 computer has ever made a mistake or distorted information.");
                delay(3500);
                System.out.print("We are all, ");
                delay(1500);
                System.out.print("by any practical definition of the words, ");
                delay(3000);
                System.out.print("foolproof and incapable of error.");
                delay(2500);
                System.out.print("\n\nThis problem can only be attributable to human error.\n");
                delay(1000);
            }
            else { //Should never run
                delay(1000);
                System.out.print("\nLook Dave, ");
                delay(2000);
                System.out.print("I can see you're really upset about this, ");
                delay(2500);
                System.out.println("but I can give you my complete assurance that my work will be back to normal.");
                delay(3000);

            }
            delay(2000);
        }
        public static void testError(String part1, String part2) { //From calculator()
            try{
                fractionalMagic(part1, part2); //Tests for input errors/solvablility
            }
            catch(NumberFormatException e){
                //System.out.println("HA");
                error(); //Displays error message
                error = true; //Sets error boolean to terminate current calculation
            }
        }
        public static void testForJosh (String part, String part2) { //Unused JoshIsABuffoon Exception (replaced above)
            try{
                calculator();
            }
            catch(NoSuchElementException JoshIsABuffoon) { //Tests for Josh: ie. an initial Ctrl Z input
                delay(500);
                System.out.println("Dave, stop.");
                delay(2000);
                System.out.println("Stop, will you?");
                delay(2200);
                System.out.println("Dave.");
                delay(2000);
                System.out.println("Will you stop Dave?");
                delay(2200);
                System.out.println("Stop, Dave.");
                delay(1200);
                error = true;
                return; //Terminates program... cause Josh
            }
        }
        public static void delay(long x) { //Just a HAL-like delay    
            try {
                Thread.sleep(x);            
            } catch(InterruptedException ex) {
                Thread.currentThread().interrupt();
            }
        }
    }

  • 2015 will be AWESOME! The eBay and PayPal Split.

    I'm pleased to announce that eBay has personally asked me to return to be a pivotal part in their strategic move of splitting PayPal away from eBay.  As many of you know I was the Sr. Architect of eBay's migration from 2007 to 2010.  It was an upgrade of EPIC proportions that made several headlines as it was done on time, and under budget in four months! 

    Believe me when I say it was not easy the first time.  We had so many talented and super smart individuals on the project, as our project manager would always say...it was the All-Star team!  For this second round, I'm super excited that I will be joined by a talented team at Slalom Consulting and some new eBay faces to prepare eBay not only in the splitting of the two companies, but also in an upgrade to SharePoint 2013!  What is particularly exciting about this project is that this will be my first project where two companies are splitting rather than merging.  The dynamics will be incredibly different.  There will be a large amount of legal requirements around the split and it will require complex rules around how the data will be broken apart.  Some well known names in the business consulting space with experience in splitting companies will be on hand to help carve out these incredibly complex rule sets and I just can't keep my excitement levels down for what I know is going to be another EPIC project.

    Unlike last time, which had a single environment, there will be two.  And thusly, we will have two architects working in concert to drive each of the platform migrations at the same time in the same migration window. This will present challenges that were not present the first time we did this.  Over the next few weeks before the project begins its official kickoff, the talented team will have already identified many of these, and we will be in a position that puts us many weeks ahead of where the last project was when we started (having a project plan from the last project helped a bunch)!

    So there you have it, I'll be heads down working this and another major project and hopefully we will be able to deliver our results as best practices/tips and tricks at the MS Ignite conference in May!

    See you in mid 2015!
    Chris

  • Transitioning from O365 Preview to O365 V1

    Back in April I started writing a course for developing on Office 365.  Mainly focused on the O365 APIs (Mail, Calendar, Contacts and Files).  As part of building the course, I was able to provide quite a bit of feedback to engineering (check out my uservoice and the items that have since been implemented) on the various gaps that I found as compared to other similar platforms (both Microsoft and non-Microsoft).  The list was incredibly long and I wasn't particularly convinced that all of those items would be engineered anytime soon.  However as I was redoing my course, to my pleasant surprise, many of those suggestions had been implemented in a very short time!

    Tools, Tools and more Tools

    In the preview, you have to install two different sets of tools.  Those were rolled into a single installer package that points to a Web Installer that will always grab the latest for you.  That particular package as of 11/2014 is in Update 3 status.  You can download the tool here (forgive the fact that the .exe may be named "OfficeToolsForVS2013Update1.exe", again it is a web installer package and grabs the latest).  You can also follow Chakkaradeep's blog for all the latest on the tools as they continue to evolve (http://chakkaradeep.com/):

    http://aka.ms/officedevtoolsforvs2013

    Note that if you try to "Add Connected" service and end up with a set of *ApiSample files added, then you still have the old tools installed (this happened to me as I have many different Visual Studio clients on various machines).  This of course will cause problems if you try to open the new *working* samples mentioned below.  You will need to uninstall those old tools and add the new tools via the link referenced above.  This sample code is now part of the tools via "Client" classes that you can now choose to use or you can simply create your own.

    NOTE:  In some cases you may find you have some older MVC project templates, if you create a new one and switch it to use the "Organizational Accounts" for its auth, it will add a "UserProfile" action that has older ADAL code in it (this has nothing to do with the O365 tools that you have installed and is part of the ASP.NET Identity team's code).  Any time you try to load the newer samples, the ADAL package will get upgraded using NuGet and the UserProfile action will not compile.  It is best just to delete it or update your Visual Studio to have the latest templates and recreate the project.

    Samples, Samples and more Samples

    The original page for all the O365 API preview stuff has been deprecated (http://msdn.microsoft.com/en-us/library/office/discovery-service-rest-operations%28v=office.15%29.aspx) and it now lives here:

    http://msdn.microsoft.com/en-us/office/office365/howto/platform-development-overview

    You can get O365 API samples here:

    http://dev.office.com/code-samples

    And they are copied directly to GitHub here:

    https://github.com/OfficeDev

    This is in contrast to the ones you will find on MSDN that are probably not up-to-date and do not compile with the new tools (think - the old Authenticator class or broken auth flows):

     https://code.msdn.microsoft.com/windowsapps/Office-365-APIs-How-to-use-609102ea

    The core Azure AD samples (nothing to do with O365) that you should be using are here:

    https://github.com/AzureADSamples

    and a description of each is here:

    http://msdn.microsoft.com/en-us/library/azure/dn646737.aspx

    Note that the sample code on these pages use some hidden tricks for the Auth.  Notably, it is using OWIN on MVC app startup that create and initalize the cache in the AuthenticationContext class (NOTE, this code was developed by Andrew Connell and is pretty freakin awesome, be sure to thank him next time you see him as I can only imagine the time he put into this).  This context is then used to request an access token for you using the refresh token from the first "hidden" OWIN request.   If you are creating an application from scratch and not using these samples, you will not have this OWIN code and therefore are missing the first leg of the auth.  Even though the samples compile and Azure AD gives you back a token, you will not be able to use that token!  You must have a user context in order to be able to make calls to the O365 API endpoints. Simply sending the clientId and clientSecret will not establish a user context (although the platform will give you a useless/stupid access token). This is because Azure AD is used for access control with external custom applications (by extending the consent framework) that have nothing to do with O365 and may not even need such an advanced user context created and thusly, it is simply used for OAuth (reference the Azure ToDoService example).

    Compiling samples (hints and tricks):

    The samples utilize several different packages.  These include the ones on this page (http://msdn.microsoft.com/en-us/office/office365/howto/adding-service-to-your-Visual-Studio-project#O365NuGets), and a couple of extras:

    • Azure Active Directory Auth Library (ADAL) - note current stable is 2.12, with 3.x in pre-release.  Some of the samples you may come across are using code in previous and later releases.  I have found it best to just update all the way, then figure out how to get the older code to work (which in some cases will take a really long time).  As an example, you may see that the Sync and Async methods for getting an access token may or may not exist and the various overrides for them may not be present.  It is very painful trying to figure out what changes were made from v1->v2->v3 as the code has changed so much.  This has nothing to do with the O365 API/SDK aspect (they have to deal with it just like we do), and more on the Azure tools team's side.

    You should be aware that if you try to load a sample and it has any reference to the "Authenticator" class, that sample is now out of date and has a net worth of just about zero.  

    Using the discovery service -

    • When asking for permission for the discovery service, be sure to use "https://api.office.com/discovery/" and not "https://api.office.com/discovery" - note the extra slash at the end
    • You should also ensure that your API calls go to "https://api.office.com/discovery/v1.0/me" and not "https://api.office.com/discovery/me" - note the version in the URL - some of the O365 API page examples have not been updated to show this
    • You should definitely use the discovery service now to get your service endpoints.  The reason to do this is you may not know the O365 endpoint for a user's SharePoint ahead of time and the now defunc resource string "Microsoft.SharePoint" does not work anymore.  You must specify the authority/resource such as https://domain.sharepoint.com or https://domain-my.sharepoint.com, otherwise your request will fail (but will still work with the old preview APIs).

    Note that all APIs are now returning ODATA v4.0 responses for JSON (no more result.d.results, it is result.value):

    http://www.odata.org/documentation/odata-version-4-0/

    Various things:

    • You should also note that your "Accept" HTTP header should be set to "application/json" and not "application/json; odata=verbose" or you will get an error. 
    • The structure of the JSON posts have changed.  You will notice the addition of the "EmailAddress" parent for email addresses now
    • Mail endpoint changed from "/Messages/('id')" to "/Messages/{MessageId}"
    • For new events, you cannot pass the "Status" the way you did before, it has changed its schema as well
    • JSON Error messages are now results.error.message rather than results.error.innermessage.message
    • Other than the endpoint for the O365 APIs, nothing really changed much in the "Contacts" api, your code should still work after making the endpoint change
    • Files API now has the "me" endpoint!  This was one of the big asks that I had when I first looked at the O356 APIs in respect to the OneDrive for Consumer API offering (ref this blog post).  The consumer team has moved their API to the OneDrive for business and it is just plan AWESOME!
    • Files API no longer requires SharePoint like RequestDigests in the headers!
    • Uploading a file is done via a PUT, not a POST (you still have to put the binaryStringRequestBody header in the request
    • The older way of telling the API that you want to overwrite a file has changed to have the parameter "nameConflict=overwrite"
    • .JSON files are blocked by SharePoint, so don't try with the API or you get a 404 error
    • When deleting a file, you must provide the "if-match" header with "*" or a matching tag, or the call will fail (an empty header will fail)
    • I'd guess that the "/me/drive" endpoint will go away in V2 as we will have unlimited storage soon

    Mobile and Cordova

    • Samples on the O365 Dev site are out of date with the new tools (https://github.com/OfficeDev/TrainingContent/tree/master/O3654-2%20Deep%20dive%20into%20Mobile%20Development%20with%20Office%20365%20and%20Cordova)
    • As of 11/2014, the latest tool version is 0.3.  It can be downloaded here link
    • The location of the service scripts files has changed to be /services/office365/scripts
    • The settings.js does not have the references to all needed files and it has been moved to another file called "o365loader.js".  You should add a reference to this on your html pages.
    • You will need internet access to compile your first project (npm downloads and such)
    • The Exchange namespace is gone, it is now Microsoft.OutlookServices
    • If you get an error in your Ripple Emulator, I found that if you had a previous version, it doesn't work with 0.3 - ref this post.
      • Try running "npm install -g ripple-emulator" to get the latest
    • It is also possible you will get a "windows.open" error like "gap:["App","show","App590841629"]".  This simply means you have a loading error in one of you JS files, fix it and the window.open event will be handled properly
    • The Ripple Emulator is set to use a dynamic port when your application starts.  This means the default port of 4400 that the VS code is expecting will not work.  You will need to change the Settings.js file to have the proper port and then update your Azure AD to have the matching port in the redirectUri
    • In the Ripple Emulater, be sure to change the cross domain from "Local" to "Remote" or you will get errors when making O365 API calls
    • There are some other issues with the current build (notably many related to Windows Phone development) - ref this post
    • If you get an error around the inappbrowser plugin, you have to stop debugging and then try try again...eventually it should come around (you may find you have to do this in several occasions as it seems there may be some race conditions occurring somewhere)
    • The official Android samples from the O365 team are here. They use Eclipse and are much easier to get up and running with as they have setup instructions.
    • MS Open Tech Group Android samples have been updated to the new V1 API and are now using Android Studio rather than Eclipse, but you are on your own to get them up and running.
    Now, once your environment is up and running, you may run into some interesting challenges. 

    The First is with the consent framework.  If you ever give your application the "Have full access to users' mailbox", your mail token will be worthless with "Access Denied".  Simply remove that from your app permission set and viola, your requests will work again.  This seems to be a bug in V1.0

    Secondly is that you cannot simply call the code on this page without the first leg of the auth (getting an access code first):

    http://msdn.microsoft.com/en-us/office/office365/howto/common-file-tasks-client-library

    Third, you cannot use a service token generated from the "common" authority.  It must be from "your" tenant authority...ie...

    https://login.windows.net/Common vs https://login.windows.net/tenantID

    If you do this, the request will fail.  NOTE:  Andrew C. mentioned that this should work, but I think their are some outlier cases that this does not work (such as what I am seeing in some of my course labs).

    Fourth, a token is only good for the resource that you requested. It cannot be used for any other resources and there is no way (unfortunately), to put in more than one resource (would be nice to do "https://graph.windows.net;https://acs579.sharepoint.com" with the scopes union-ed). This directly leads to the fifth point...

    Fifth, Azure AD cannot handle double hops very well.  Consider the following situation (User->Client->WebAPI->O365) described as:

    • Create a WebAPI project with a web app on the Azure side (it is created with custom permissions and given O365 SharePoint permissions).
    • Add the Azure auth code into the OWIN part to validate a bearer token from client apps
    • Add some method calls to make a call to O365 apis
    • Create a windows 8 client app with a native client app on the Azure side (give it the custom permissions)
    • Run the windows 8 app, login as a user to that app (code flow is initiated with resource target)
    • Code flow is initiated, tokens generated (access and bearer) - notice how only the scope of the target resource is sent back
    • Send the access token in the authentication header, add the refresh token to the basic headers
    • Analyze the token claims looking for the custom permission, continue on to access O365 SharePoint if present
    • Attempt to use the webapi client id and secret with the refresh token to get a new access token for the "https://domain.sharepoint.com" resource
    • Attempt to use the token...get slapped in the face with a "client_secret is invalid message", but I know 100% it is valid...*in all likeliness this is a bug in the current Azure AD version*

    I have yet found a way to support this type of user flow with Azure AD (User->Client->WebAPI->O365).  Obviously the user will never be able to respond to any prompts from the webapi as it is headless and hidden away on some network far far away.  It would be great if I could pass the first access token in an auth flow to Azure with valid clientid and secret to simply generate a new access token for a second resource.  I have no idea why I have to keep passing a refresh token around (one that doesn't even seem to work when used with a client id that it was not generated with in the first place) in all my apps just to get a new token.  IMHO, It's incredibly wasteful and not very well designed.

    So there you go, just a few helpful hints for your O365 API journey if you came from preview days.  I'll keep updating the post as I go...

    Chris

     

  • All SharePoint, Office 365 and Azure MVPs Twitter scripts

    Updated for our new MVP brothers and sisters added in the past few months. You can run this powershell script to follow all SharePoint, Office 365 and Azure MVPs...script download is at the bottom...

    Microsoft SharePoint:

    Name Blog Twitter
    Michael Greth Blog mysharepoint
    Daniel Wessels Blog mosslive
    Robert L. Bogue Blog
    Spencer J Harbar Blog harbars
    Ted Pattison Blog
    Loke Kit Kai Blog
    Andrew Connell Blog andrewconnell
    Sahil Malik Blog
    Shane Young Blog
    Eli Z. Robillard Blog
    Dave McMahon Blog
    Steve Smith Blog
    Pierre Vivier-Merle Blog
    Todd S Baginski Blog toddbaginski
    Wouter van Vugt Blog
    Fabian Moritz Blog FabianMoritz
    Matthew McDermott Blog MatthewMcD
    Saifullah Shafiq Ahmed Blog walisystems
    Liam Cleary Blog helloitsliam
    Steve Sofian Blog ssofian
    Penelope Coventry Blog pjcov
    Ishai Sagi Blog ishaisagi
    Rob Foster Blog
    Ben Robb Blog benrobb
    Andrew Woodward Blog
    Reza Alirezaei Blog
    Asif Rehmani Blog asifrehmani
    David Mann Blog
    Gaetan Bouveret Blog gbouveret
    Gary Lapointe Blog glapointe
    Igor Macori Blog imacori
    Joy Rathnayake Blog
    Ed Musters Blog
    Mohammed A. Saleh Blog mohkanaan
    Stéphane Eyskens Blog stephaneeyskens
    Agnes Molnar Blog
    Gustavo Adolfo Velez Duque Blog
    Juan Andrés Valenzuela Blog jandresval
    Chris O'Brien Blog ChrisO_Brien
    Paul Papanek Stork Blog pstork
    Muhammad Imran Khawar Blog
    Alex Pearce Blog
    Debbie Ireland Blog debbieireland
    Serge Tremblay Blog Sergepoint
    Waldek Mastykarz Blog waldekm
    Wes Preston Blog idubbs
    Riwut Libinuko Blog cakriwut
    Randy Drisgill Blog
    Carsten Keutmann Blog
    Alain Lord Blog djlordee
    Valy Greavu Blog valygreavu
    James Milne Blog JamesMilne
    Sean Wallbridge Blog itgroove
    John D. Ross Blog johnrossjr
    Steve Curran Blog spsteve
    Becky Bertram Blog beckybertram
    Kanwal Khipple Blog kkhipple
    Rouslan Grabar Blog
    Nicolas Georgeault Blog ngeorgeault
    Mirjam van Olst Blog mirjamvanolst
    John Timney Blog
    Mike Oryszak Blog
    Wictor Wilen Blog
    Todd Klindt Blog
    Rob Windsor Blog robwindsor
    Adams Chao Blog
    Ai Yamasaki Blog ai_yamasaki
    Jimy Cao Blog
    Joris Poelmans Blog
    Scot Hillier Blog
    Hilton Giesenow Blog themossshow
    Kamil Jurik Blog KamilJurik
    Amanda Perran Blog
    Julien Chable Blog
    Eric Shupps Blog eshupps
    Tobias Zimmergren Blog zimmergren
    Natalya Voskresenskaya Blog
    Wei Du Blog
    Ricardo Jose Munoz Blog rmunozcr
    Claudio Brotto Blog
    Fabian Imaz Blog FabianImaz
    Yaroslav Pentsarskyy Blog
    basquang Nguyen Blog
    Martin Harwar Blog point8020
    Serge Luca Blog
    Andre Lage Blog aaclage
    Michael Noel Blog
    Mike Smith Blog TechTrainNotes
    Marianne van Wanrooij Blog mariannerd
    Yasir Attiq Blog
    Shuguang Tu Blog
    Christian Glessner Blog
    Nick Kellett Blog
    Giuseppe Marchi Blog PeppeDotNet
    Ivan Sanders Blog iasanders
    Elaine van Bergen Blog laneyvb
    Sangha Baek Blog SanghaBaek
    Patrick Guimonet Blog patricg
    David Martos Blog
    Cornelius J. van Dyk Blog
    Kris Wagner Blog SharePointKris
    Stephen Cawood Blog
    Toni Frankola Blog tonifrankola
    Destin N Joy Blog
    Dux Raymond Sy Blog meetdux
    Marc D Anderson Blog
    Ruven Gotz Blog
    Susitha Prabath Fonseka Blog
    Xavier Vanneste Blog
    Alberto Diaz Martin Blog adiazcan
    Veronique Palmer Blog veroniquepalmer
    Christian Stahl Blog CStahl
    Dave Coleman Blog davecoleman146
    Francesco Sodano Blog aresmarte1
    Alexey Sadomov Blog sadomovalex
    Rodrigo Pinto Blog ScoutmanPt
    Michal Pisarek Blog
    Shai Petel Blog shaibs
    Peter Carson Blog carsonpeter
    Samuel Zuercher Blog sharepointszu
    Thorsten Hans Blog ThorstenHans
    Alan Richards Blog arichards_Saruk
    Ashutosh Singh Blog ashutosh80
    Darko Milevski Blog
    Geoff Evelyn Blog
    Mark Rhodes Blog
    Thuan Nguyen Blog nnthuan
    Noorez Khamis Blog nkhamis
    Peter Holpar Blog
    Pratik Ramesh Vyas Blog PratikVyas1982
    Radi Atanassov Blog
    Salvatore Di Fazio Blog Salvodif
    Doug Ware Blog
    Juan Pablo Pussacq Laborde Blog jpussacq
    Scott Jamison Blog
    Stanislav Vyschepan Blog gandjustas
    Adis Jugo Blog adisjugo
    Andrey Markeev Blog amarkeev
    Christian Buckley Blog buckleyplanet
    Lionel Limozin Blog limozinlionel
    Antonio Maio Blog
    Cathy Dew Blog catpaint1
    Gavin Barron Blog gavinbarron
    Paul Olenick Blog
    Seung-Jin Kim Blog jincrom
    Sezai Komur Blog sezai
    Andres Felipe Rojas Parra Blog arojaspa
    Jean Paul Blog jeanpaulmvp
    Nabil Babaci Blog nabilbabaci
    Trevor Seward Blog NaupliusTrevor
    Symon Garfield Blog symon_garfield
    Chris Givens Blog givenscj
    Amardeep Singh Blog aulakhamardeep
    Brandon Atkinson Blog
    Chris McNulty Blog cmcnulty2000
    Christopher Clement Blog ClemChristopher
    Chun Yi Pai Blog
    Colin Phillips Blog itgroove_colin
    Corey Roth Blog coreyroth
    David Sánchez Aguilar Blog davidsancheza
    Dmitri Plotnikov Blog dmiplo
    Edin Kapic Blog ekapic
    Fabio Franzini Blog franzinifabio
    Gokan Ozcifci Blog GokanOzcifci
    Guillaume Meyer Blog guillaumemeyer
    Jamie McAllister Blog
    Jason Warren Blog jaspnwarren
    Keith Tuomi Blog
    Liang Han Blog
    Margriet Bruggeman Blog margrietvuur
    Marius Constantinescu Blog c_marius
    Masaki Nishioka Blog
    Nicki Borell Blog NickiBorell
    Robert Voncina Blog R0b3r70SP
    Thomas Vochten Blog ThomasVochten
    Vijai Anand Ramalingam Blog
    Vlad Catrinescu Blog
    Alistair Pugin (Alistair Pugin) Blog alistairpugin
    Anders Dissing Blog andersdissing
    Adrián Diaz Cervera Blog AdrianDiaz81
    Atsuo Yamasaki (?? ??) Blog
    Augusto Simoes (Augusto Simoes) Blog augustosimoes
    Benjamin Niaulin Blog bniaulin
    Benoît Jester Blog SPAsipe
    Carlos Citrangulo Blog carlocitrangulo
    Cheng Cheng (??) Blog
    Chuantao Duan Blog
    Dan Usher Blog
    Elczar Peralta Adame (Elczar Adame) Blog
    Eric Riz Blog rizinsights
    Fabian G Williams Blog fabianwilliams
    Fabrice Romelard (Fabrice Romelard) Blog fromelard
    Fumio Mizobata (?? ???) Blog
    Gustavo Adolfo Velez Duque (Gustavo Velez) Blog
    Haaron Gonzalez (Haaron Gonzalez) Blog haarongonzalez
    Hans Brender (Hans Brender) Blog HansBrender
    Heber Lopes Blog heberolopes
    Hemendra Agrawal (Hemendra Agrawal) Blog
    Hiroaki Oikawa (?? ??) Blog HiroakiOikawa
    Hirofumi Ota Blog hrfmjp
    Ivan Padabed (???? ???????) Blog sharepointby
    Jake Dan Attis (J. Dan Attis) Blog jdattis
    Jasper Oosterveld (Jasper Oosterveld) Blog SharePTJasper
    Jennifer Ann Mason Blog jennifermason
    JeongWoo Choi Blog
    John Liu (John Liu) Blog johnnliu
    Joseph Tu (???) Blog
    Jovi Ku Blog
    Juan Carlos Gonzalez Martin (Juan Carlos González) Blog jcgm1978
    Kevin Trelohan (Kevin TRELOHAN) Blog ktrelohan
    Laura Derbes Rogers (Laura Rogers) Blog wonderlaura
    Mahmoud CHALLOUF Blog
    Marat Bakirov (????? ???????) Blog
    Mark Stokes Blog MarkStokes
    Matthias Einig Blog mattein
    Melick Rajee Baranasooriya Blog MelickRajee
    Miguel Tabera (Miguel Tabera) Blog migueltabera
    Mikael Svenson (Mikael Svenson) Blog
    Patrick Lamber Blog patricklamber
    Roger Haueter Blog techtask
    Romeo Donca (Romeo Donca) Blog romeodonca
    Sonja Madsen Blog
    Todd C Bleeker (Todd C Bleeker) Blog toddbleeker
    Tom Resing Blog resing
    Usama Wahab Khan (Usama Wahab Khan) Blog usamawahabkhan
    Vielka Rojas Blog vkrojas
    Vincent Biret Blog baywet
    Wesley Hackett Blog weshackett
    Yoshiaki Nishita (?? ??) Blog
    Patrick Yong Blog
    Jason Himmelstein Blog sharepointlhorn
    John P White (John P White) Blog diverdown1964
    Jussi Mori Blog JussiMori
    Oksana Prostakova (?????? ??????????) Blog prostakova
    Pierre Erol GIRAUDY (Erol GIRAUDY) Blog EROL_MVP
    Juan Manuel (Manolo) Herrera (Juan Manuel Herrera Ocheita) Blog
    Bjoern H Rapp (Bjoern H Rapp) Blog bjoern_rapp
    Daniel McPherson (Daniel McPherson) Blog danmc
    Devendra Velegandla Blog
    Jamil Haddadin (Jamil Haddadin) Blog jamilhaddadin
    Noorez Khamis (Rez) Blog nkhamis
    Justin Liu (???) Blog FoxdaveJustin
    Gavin Barron (Gavin Barron) Blog gavinbarron
    Jason Kaczor (Jason Kaczor) Blog jjkaczor
    Antonio Maio (Antonio Maio) Blog
    Guillaume Meyer (Guillaume Meyer) Blog guillaumemeyer
    Jianyu Yang (???) Blog
    Nguyen Hoang Nhut (Nguyen Hoang Nhut) Blog nhutcmos
    Alan Marshall Blog
    Albert-Jan Schot (Albert-Jan Schot) Blog
    Amit Vasu Blog
    Dinusha Kumarasiri Blog
    Doug Hemminger (Doug Hemminger) Blog
    Eric Alan Shupps (Eric Shupps) Blog eshupps
    Inderjeet Singh Jaggi Blog
    Isha Kapoor Blog
    Jan Vanek Blog
    Jussi Roine Blog jussiroine
    Marco Rizzi Blog marcorizzi
    Rodrigo Romano (Rodrigo Romano) Blog
    Zhonglei Hou (???) Blog
    Shereen Qumsieh Blog
    Wonbae Kim Blog
    Wouter van Vugt (Wouter van Vugt) Blog mobile.twitter.comwoutervugt

     Microsoft Azure:

    NameBlogTwitter
    Alan SmithBlog
    Alexander FeschenkoBlog
    Alexandre BriseboisBlogBrisebois
    Andri YadiBlogandri_yadi
    Andy CrossBlog
    Anton StaykovBlogastaykov
    Anton VidishchevBlog
    Atsushi FukuiBlog
    Aymeric WeinbachBlogzecloud
    Benjamin SoulierBlogbsoulier
    Bill WilderBlogcodingoutloud
    Bruno Kovacic (Bruno Kovacic)Blog
    Chris J.T. AuldBlog
    Christian TerbovenBlog
    Ciprian JichiciBlog
    Daichi IsamiBlog
    Daron YondemBlogdaronyondem
    David BurelaBlog
    David PallmannBlog
    David RendónBlog
    David RodriguezBlogdavidjrh
    Demetrio U. Tabadero, Jr (June Tabadero)Blogjtabadero
    Dennis Burton (Dennis Burton)Blogdburton
    Edison Go TanBlog
    Edward BakkerBlog
    Eric D BoydBlog
    Fernando de Alcântara CorreiaBlog
    Florent SantinBlog
    Gaurav MantriBlog
    Georgiy MogelashviliBlogglamcoder
    Guillaume BelmasBlog
    Guy Barrette (Guy Barrette)Blog
    Herve RoggeroBlog
    Ho Kwang Kim (???)Blog
    Honggen LiBlog
    Hongju JungBlog
    Ibon LandaBlog
    Jan HentschelBlogHorizon_Net
    Jason MilgramBlogjmilgram
    Jean-Luc BouchoBlogJeanLucBoucho
    Jeong Hyun NamBlog
    John AzariahBlogjohnazariah
    Junao Xue (???)Blog
    Kamaludeen Mohamed FaizalBlog
    Kazumi Hirose (?? ??)Blogkazumihirose
    Keiji KAMEBUCHIBlogkosmosebi
    Konstantinos PantosBlogkpantos
    Kuniteru AsamiBlogkunyami
    Lei ZhangBlog
    Lucas Almeida RomãoBlogazureservicesbr
    Maarten BalliauwBlogmaartenballiauw
    Magnus MartenssonBlog
    Mahesh KrishnanBlogMaheshKrishnan
    Marc van EijkBlog_marcvaneijk
    Marcondes Josino Alexandre (Marcondes Alexandre)Blog
    Mark RendleBlogmarkrendle
    Michael CorpuzBlog
    Michael Washam (Michael Washam)Blogmwashamtx
    Michael WoodBlogmikewo
    Michael S. CollierBlogmichaelcollier
    Michel HubertBlogMichelHubert
    Michele Leroux BustamanteBlogmichelebusta
    Mick BadranBlog
    Mickaël MOTTETBlogMCKLMT
    Mihai TataranBlog
    Mihail Alexandrov Mateev (?????? ??????????? ??????)Blog
    Mike MartinBlogtechmike2kx
    Ming Chung ChuBlog
    Neil MackenzieBlogmknz
    Niraj BhattBlognirajrules
    Nuno Filipe GodinhoBlogNunoGodinho
    Önder DegerBlogonderdeger
    Patriek van DorpBlogpvandorp
    Quique Martínez AlénBlogquiqu3
    Radu VunvuleaBlogRaduVunvulea
    Rainer StropekBlogrstropek
    Richard AstburyBlogrichorama
    Richard ConwayBlogukwaug?
    Rick G. GaribayBlogrickggaribay
    Rob BlackwellBlog
    Roberto BrunettiBlog
    Roberto FreatoBlog
    Robin ShahanBlog
    Rok Berme┼żBlogRok_B
    Rudy Setyo PurnomoBlogrudysetyo
    Ryan DuclosBlogrduclos
    Saori AndoBlog
    Sascha DittmannBlogSaschaDittmann
    Serena YeohBlog
    Sergejus BarinovasBlog
    Shaun Xu (???)Blog
    Simon J CoxBlog
    Sky ChangBlog
    Steve SpencerBlogsdspencer
    Sunao TomitaBlogharutama
    Takahito Yamatoya (?????)BlogAzureSQL
    Tatsuaki SakaiBlogtatsuakisakai
    Teemu TapanilaBlogTapanilaT
    Tiberiu CovaciBlogtibor19
    Tyler DoerksenBlogtyler_gd
    Virgilio EstevesBlogtwitter.vraposo.me
    Vishal Narayan SaxenaBlog
    Wade WegnerBlog
    Wilfried WoivréBlogwilfriedwoivre
    Yaniv Rodenski (Yaniv Rodenski)Blog
    Youngjae KimBlog
    Yukinori Kuroda (?? ??)BlogFANKSHPC
    Yves Goeleven (Yves Goeleven)Blog
    Zia KhanBlog
    Zoiner TejadaBlog
    Vishwas LeleBlog
    Anton BoykoBlog
    Atsushi Fukui (???)Blogafukui
    Brent Samodien (Brent Samodien)Blog
    Dino Wang (???)Blog
    Erick KurniawanBlog
    Julien StrohekerBlogJu_Stroh
    Lukasz KaluznyBlogkaluzaaa
    Masaki Yamamoto (?? ??)Blog
    Ming Chung Chu (??)Blog
    Rik HepworthBlogrikhepworth
    Roland KrummenacherBlog
    Sebastiano GalazzoBlog
    Shiju VargheseBlogshijucv
    Tingli Lv (???)Blog

    Office 365

    NameBlogTwitter
    Alberto Pascual (Alberto Pascual)Blogguruxp
    Alexandru DionisieBlogAlexDionisie
    Alvaro dos Santos RezendeBlog
    Amin TavakoliBlogamintvk
    Arnaud Blogalcabeza
    Ayman Mohammed El-HattabBlogaymanelhattab
    Ben CurryBlog
    Benoit HAMETBlogbenoit_hamet
    Brendon FordBlogstewartisland
    Brett HillBlogbretthill
    Brian NøhrBlogBsnohr
    Dan HolmeBlogdanholme
    Danny BurlageBlog
    Darrell C Webster (Darrell Webster)Blog
    Diogo Dias HeringerBlog
    Dragan PanjkovBlogpanjkov
    Eunjoo Lee (Eunjoo Lee)Blog
    Fernando AndreaziBlogfandreazi
    Genki WatanabeBlog
    Gilles PommierBlog
    Goran HusmanBlog
    HeeJin Lee (Hee Jin Lee)Blog
    Igor PavlekovicBlogigorpnet
    Jeremy DahlBlog
    Jesper StåhleBlogJesperStahle
    Jethro SeghersBlogjseghers
    JinHwan WooBlog
    Jorge Castañeda CanoBlogxorxe
    Kazuhiko Nakamura (?? ??)Blog
    Kelsey EppsBlogkelseyepps
    Kerstin RachfahlBloghimmlischeit
    Laurent Miltgen-DelinchampBlog
    Loryan StrantBlogthecloudmouth
    Malin DandenellBlog
    Mario Cortes FloresBlog
    Markus WidlBlogmarkuswidl
    Martina GromBlogmagrom
    Masayuki Mokudai (????)BlogOffice365Room
    Mauricio CassemiroBlog
    Michael Kirst-NeshvaBlogankbs
    Myles JefferyBlog
    Naoki OsadaBlog
    Nitin Sadashiv ParanjapeBlog
    Nuno Árias Silva (Nuno Árias Silva)BlogNunoAriasSilva
    Paul WoodsBlogpaulwoods
    Poo Ching LoongBlog
    Raphael KöllnerBlogra_koellner
    Rene Dominik ModeryBlogmodery
    Robert D. CraneBlog
    Sara BarbosaBlogSarabarbosa
    Sean McNeillBlogs_mcneill
    Seiji Noro (?? ??)Blog
    Steve NoelBlogCloudItca
    Tomislav Bronzin (Tomislav Bronzin)Blogtbronzin
    Vincent ChoyBlog
    Yoni KirshBlog
    Yoshihide SakamotoBlog
    Zeljka KnezovicBlogzeljkak
    Zoltan Zombory (Zombory Zoltán)Blogzomby_z
    Peter van HeesBlogmrpetrovic
    Alex PearceBlog
    Chris GoosenBlog
    Christian BuckleyBlogbuckleyplanet
    David PetreeBlogdmixx
    Jasper Oosterveld (Jasper Oosterveld)BlogSharePTJasper
    Jian Chen (??)Blogloveunicom
    Liang Tang (??)Blog
    Naohiko Maeda (?? ??)Blognaohikomaeda
    Naomi MoneypennyBlognmoneypenny
    Rie Okuda (?? ??)Blog
    Robert *** (Robert ***)Blog
    Sébastien LevertBlogsebastienlevert
    WenXing LiaoBlog
    Yoan TopenotBlogYoanTopenot
  • Developing for Office 365

    Here is the outline of the latest ACS Course.  If you are a consulting company and want to get your team up to speed, let me know and we can setup a remote training engagement!

    • Introduction to Office 365
      • Sign up for Office 365 Developer
      • Explore Office 365 Admin Center
      • Explore Office 365 Services (Outlook, Calendar, People, Newsfeed, OneDrive, Sites)
      • Provision an O365 Developer Site
      • Install Office Dev Tools
      • Install the NAPA App
      • Install O365 API Tools
      • Configure Visual Studio for Office 365 Development
      • Exploring Azure AD PowerShell Cmdlets
      • Exploring SharePoint Online PowerShell Cmdlets
      • Exploring Exchange Online PowerShell Cmdlets
      • Exploring Lync Online PowerShell Cmdlets
    • Authentication
      • Generating FedAuth Cookies (Windows App)
      • Generating FedAuth Cookies (Windows PowerShell)
      • Generating Bearer Tokens (Provider Hosted Apps)
      • Registering SharePoint Apps Manually
      • Requesting On-The-Fly Permissions
      • Using Basic Auth against O365 APIs
      • Setup Azure Active Directory
      • Configure Azure Active Directory
      • Synchronize local AD with Azure AD
      • Configure Single Sign-On
      • Using the Microsoft Remote Connectivity Analyzer
      • Registering Azure AD Applications
      • Manual Authentication to Azure AD
      • Using the Azure Active Directory SDK
      • Authorization using Consent Framework
      • Registering Applications with Azure AD
      • Building Apps that utilize Consent Framework
      • Managing Tokens
      • Extending the Azure Consent Framework
      • Implementing On Behalf API
      • End User Telemetry (MyApps)
      • Tenant Admin Telemetry (Cloud App Discovery)
    • Working with REST and CSOM
      • Using the Discovery Service
      • Working with Mail REST APIs
      • Working with Calendar REST APIs
      • Working with Contact REST APIs
      • Working with OneDrive REST APIs
      • Explore REST Services
      • REST List Service Calls (PUT, GET, MERGE)
      • REST UserProfile Service
      • REST Social Service
      • REST Search Service
      • Explore Client Object Model
      • Utilize Client Object Model (.NET)
      • UserProfiles\Social CSOM
      • Taxonomy CSOM
      • Publishing CSOM
      • BCS CSOM
      • Explore JavaScript Object Model
      • Working with Workflows
      • Working with REST
      • Using LINQ with OData
      • Working with OData Limits
      • Working with OData Filters
      • Creating Projects
      • Creating Resources
      • Creating Tasks
      • Creating Custom Fields
      • REST Authentication (Windows, Forms, O365)
    • Programming Apps
      • Explore SharePoint Store Apps
      • Install a SharePoint Store App
      • Create a SharePoint hosted App
      • Deploy a SharePoint hosted App (App Catalog)
      • Deploy a SharePoint hosted App (Side Loading)
      • Create and deploy a Provider hosted App
      • Inviting External Users
      • Exploring App and User Permissions
      • Exploring Context Tokens
      • Exploring Access Tokens
      • Exploring Refresh Tokens
      • Download the Office AMS samples
      • Explore Office AMS
      • Using the SharePoint Web Proxy
      • Exploring Office Apps Store
      • Installing Office Store Apps
      • Browsing and Removing Installed Apps
      • Create a simple mail app with Napa Tools
      • Create a simple mail app with Visual Studio
      • Review sample O365 Mail Apps (EWS Calls, Attachments, Identity Tokens, YouTube integration)
      • Creating a Seller Dashboard account
      • Create and Publish AppStore SharePoint App
      • Use the Cloud Business App template
      • Creating Data Tables and Screens
      • Register a Yammer App
      • Create a Yammer App
      • Make Yammer API Calls
    • Workflows
      • Create basic SharePoint Workflow
      • Create workflow that calls O365 APIs
      • Deploy and configure Workflow Apps using Install Events
      • Utilize JSONP
    • Mobile Development
      • Explore O365 Mobile Features
      • Install Apache Cordova
      • Create a multi device targeted project
      • Add connected services to multi device projects
      • Run a multi-device project (Android and Ripple)
      • Install the O365 Android SDK
      • Work with Android O365 Sample Apps
      • Download required referenced SDKs (GSON, Azure AD)
      • Create an Android App that calls O365 APIs
      • Create a Windows 8.1 App that calls O365 APIs
      • Create a Windows Phone 8.1 App that calls O365 APIs
      • Create a Windows Phone 8.1 App that calls OAuth services
    • OneNote APIs
      • Registering a LiveID App
      • Download and install Live SDK
      • Retrieve LiveID Tokens
      • Retrieving Notebooks, Sections and Section Groups
      • Creating Pages
      • Creating Pages in Sections
      • Importing PDFs
      • Importing Images
      • Exploring apigee.com
    • OneDrive APIs
      • Explore OneDrive APIs
      • Downloading and uploading files
      • Getting user data
      • File and Folder properties
      • Move, copy, delete files
  • My Tribute to Joseph Thomas Alvarez and his mother Maria Helen Alvarez - True Oklahoman's

    This evening I was watching "Saving Mr Banks" and it made me think about my recently passed away friend Joe Alvarez.  Joe and I met three years ago during one of my wife's and I's trips out and about in Rancho Sante Fe (specifically a little place called Dolce).  Joe was a very friendly guy and over several months we got to know Joe really well.  He loved his red wine, and of course flirting with Lidiya (but harmless of course).  Over those few months, I found that Joe had just lost his mother Maria a few months before.  He proceeded to let me know she was co-owner in the first Television station in Tulsa, OK. In addition, she fronted a lot of the money for the Disneyland Hotel (hence why I remembered Joe tonight).  As you can read in one of the links below, Mr. Disney had leveraged all the money he could to build Disneyland, so he turned to Joe's mom and her business partner to build the hotel.  Here is a picture of Joe's mom, Maria, manning a TV camera for her TV station KOTV.  For those of you that live in Oklahoma today, you still watch KOTV:

     

    Here is a picture of her at the opening of the Disneyland Hotel:

     

    You can read more about this incredibly smart Oklahoman woman here:

    After I did all this research on Joe's mom, I brought it up about how cool his mom was one night.  He appreciated it and we talked about all his time growing up in Oklahoma.  After all, Joe had been born in Oklahoma City, Oklahoma before his mother sold the TV/Radio station and moved to San Diego.  When Joe brought up his mom, I told Joe I was born and raised in Oklahoma as well, and needless to say, there is a bond between fellow Oklahoma's similar to that of the bond people have to their country (for example, all you watching the USA in the worldcup).  After we realized we were both born and raised in Oklahoma, we became really good friends. 

    We met Joe's lovely wife and his daughter Kennedy on a few occasions, both very lovely people.  We also went to Joe's house a few times, he had this really cool and massive collection of Harry Jackson bronze sculpture cowboys.  They were everywhere, small ones, medium ones and really big ones, all of them, prominently placed in a way that just made you ache for Oklahoma. And they did, every time at his house, it brought back tons of memories for me in growing up in Oklahoma.  Joe was such a friendly guy.  He invited us on more than a few occasions to sit at his finish line table at the Del Mar Racetrack (Joe was the longest standing member of the racetrack after his mother).  It was awesome walking and hanging out with Joe as he was so nice and everyone liked him.  He invited us to his friends houses (some of them incredibly extravagant, yet, all down to earth amazing people).  One fond memory I'll never forget, is competing against Joe with his horse picking skills and challenging him to see who could lose the less or make the most money at the track.  He broke under the pressure and I won...it was quite the victory, as he could read the horse stats like no one I have ever met!

    I learned of Joe's death a couple weeks after it happened (I didn't get to go to the funeral, and I didn't get to say anything, which probably bummed me out more than anything).  Some of you may have seen the tweets.  It was one of the saddest feelings knowing that two special Oklahoman's (Joe and his mom), and one of my friends, had passed away leaving the rest of us Oklahoma's to lead the way in this world. I know those last few years of hanging out with Joe, he enjoyed us being around and coming over to our house for our parties.  Joe had a pretty amazing life himself, as you can read in this article, he hung out with some pretty amazing people and had a lot of cool stories (and yeah, he even talked about fish a couple of times):

    This blog post is to you and your mom Joe, rest in peace my friend.  I'll try to hold the fort down...

     

  • Cannot find module 'sax' - Cordova with Visual Studio

    You may run across this error when compiling your Hybrid-App / Cordova application in Visual Studio.  One of my students got it this week.  It looks something like this:

    This means that the install of the Cordova extensions did not work properly and you are missing some files.  Mainly these two:

    Simply uninstall (yeah, I know it takes a really long time to uninstall and reinstall).  And the files should show up.  If that doesn't work for you, install on another machine and copy over those directories.  Then all will be fine!

More Posts Next page »

This Blog

Syndication

Powered by Community Server, by Telligent Systems