Microsoft Acquires ADX Studio to Enhance Dynamics CRM Offering

Microsoft has long suffered from a lack of a configurable portal layer for Dynamics CRM.  While the core product allowed you to design forms and custom entities for use by employees, developing self-service portals that were customer facing was not easily done without custom .NET code.

ADX Studio has been filling the gap by providing a third party solution that extends Dynamics CRM into self-service portals.  The solution is a .NET based solution that allows developers to build robust portals with authentication, data entry forms, surfacing of CRM data, etc. without the need for extensive development.  The solution reads the CRM schema dynamically so that if you change the underlying CRM model it is reflected automatically in the portal.

Microsoft has just acquired ADX Studio and will be integrating it into the core Dynamics product. Along with the recent acquisition of FieldOne, this means that gaps in the product that were previously being filled by third party applications will now be integrated as in house solutions.

Read More

Visio Stencil for Microsoft Azure, Cloud and Enterprise

Microsoft has published a visio stencil you can download here that contains symbols for Microsoft Azure, Cloud and Enterprise.  

image

The stencil has some neat things in including a colour chart to guide you on Microsoft branding colours:

image

There is also an existing Office 365 Visio Stencil with symbols for all the various components that you can download here.


Read More

New Invite App Makes Finding Meeting Time Easier

As part of Microsoft’s “Garage” series of apps, there is a new mobile app for organizing meetings.  One of the key challenges for organizing any meeting is finding a time where all the participants are free.  The new Invite app allows you to organize a meeting by sending out a number of possible dates and times.  Your attendees can then vote on which times they are available and you can then pick the best time based on their feedback.

Invite 1Invite 2

The app is currently available for IPhone and coming soon for Android and Windows Phone.

Read More

Integrating SharePoint with Microsoft’s new Computer Vision API

Microsoft has released a  new API called the Computer Vision API.  It provides OCR conversion from images to text.  Similar to the recent post on integration Microsoft’s new Face API, I wanted to test whether you could integrate SharePoint with this new API to act as an auto-tagging mechanism for images stored in document libraries.

Microsoft has also provided a C# and Android SDK for the Computer Vision API that you can download here.

I wanted to develop a demo that leveraged the document management power of SharePoint and integrate it with the OCR capabilities of this new API.  The demo code I’m going to describe is posted to github here.

The Scenario

Imagine you have a document library filled with images that could have text on them.  If you try to search for these images, you won’t easily find them because they have no metadata related to the content within the image.  Could we use an OCR service to scan the image and pull out the text so we could update the metadata with the found text?

Step #1: Establishing a Domain Model

I wanted a class to represent each photo.  This allows us to populate a list of photos from SharePoint, hand the list off to another class responsible for tagging the photos and then hand it back to the SharePoint service to update SharePoint back again.  Here is the class definition.

/// <summary>
   /// Value object representing a Photo. 
   /// </summary>
   public class Photo
   {
       public byte[] Image { get; set; }
       public string ID { get; set; }
       public List<string> TextInPhoto { get; set; }
       public string LanguageDetectedInPhoto { get; set; }

     public int NumberOfMatchedFaces { get; set;  }

     public int NumberOfUnmatchedFaces { get; set; }

     public List<PhotoPerson> PeopleInPhoto { get; set; }

     public Photo()
       {
           PeopleInPhoto = new List<PhotoPerson>();
           TextInPhoto = new List<string>();
       }

}

Step #2: Pulling Images from SharePoint

Using the SharePoint client APIs (CSOM) with C#, I wrote a method to pull images out of a target document library.

public List<Photo> getPhotosToTag()
          {
              List<Photo> photos = new List<Photo>();


            using (ClientContext context = Login(SharePointURL))
              {
                  try
                  {
                      var list = context.Web.GetList(PhotosToTagURL);
                      var query = CamlQuery.CreateAllItemsQuery();


                    var result = list.GetItems(query);
                      ListItemCollection items = list.GetItems(query);
                      context.Load(items, includes => includes.Include(
                          i => i[PhotoFileColumn],
                          i => i[PhotoIdColumn]));


                    //now you get the data
                      context.ExecuteQuery();


                     //here you have list items, but not their content (files). To download file
                      //you’ll have to do something like this:


                    foreach (ListItem item in items)
                      {
                          Photo photo = new Photo();
                          //get the URL of the file you want:
                          var fileRef = item[PhotoFileColumn];


                        //get the file contents:
                          FileInformation fileInfo = Microsoft.SharePoint.Client.File.OpenBinaryDirect(context, fileRef.ToString());


                        using (var memory = new MemoryStream())
                          {
                              byte[] buffer = new byte[1024 * 64];
                              int nread = 0;
                              while ((nread = fileInfo.Stream.Read(buffer, 0, buffer.Length)) > 0)
                              {
                                  memory.Write(buffer, 0, nread);
                              }
                              memory.Seek(0, SeekOrigin.Begin);


                            photo.ID = item.Id.ToString();
                              photo.Image = memory.ToArray();
                              photos.Add(photo);
                          }


                    }
                  }
                  catch (Exception e)
                  {
                      throw;
                  }
              }


   return photos;
}

The important information we need to track is the ID of the photo so that we can update it back into SharePoint once we’re finished processing.

Step #3: Sending Photos to the Computer Vision API

Once we have our list of photos, we can now send these to the Computer Vision API for text identification.

public async Task identifyTextInPhoto(List<Photo> Photos)
          {
              try
              {
                  foreach (Photo photo in Photos)
                  {
                      VisionServiceClient client = new VisionServiceClient(SubscriptionKey);
                      Stream stream = new MemoryStream(photo.Image);
                      OcrResults result = await client.RecognizeTextAsync(stream, Language, DetectOrientation);
                      photo.LanguageDetectedInPhoto = result.Language;
                      foreach (Region region in result.Regions)
                      {
                          for (int i=0; i< region.Lines.Length; i++)
                          {
                              Line line = region.Lines[i];
                              string lineText = “”;
                              for (int j= 0; j < line.Words.Length; j++)
                              {
                                  lineText += line.Words[j].Text;
                                  if (j < line.Words.Length -1)
                                  {
                                      lineText += ” “;
                                  }
                              }
                              photo.TextInPhoto.Add(lineText);
                          }
                      }


                }
              }
              catch (Exception e)
              {
                  throw;
              }
          }

This method call uses the supplied Computer Vision API SDK to send each image to the OCR service and pulls in the found text.

Step #4: Sending the Results Back to SharePoint

When the Computer Vision API analyzes your image, it returns back text as a series of regions, lines and words.  The API provides not only the text but the bounded rectangle where it was found.

public async Task identifyTextInPhoto(List<Photo> Photos)
       {
           try
           {
               foreach (Photo photo in Photos)
               {
                   VisionServiceClient client = new VisionServiceClient(SubscriptionKey);
                   Stream stream = new MemoryStream(photo.Image);
                   OcrResults result = await client.RecognizeTextAsync(stream, Language, DetectOrientation);
                   photo.LanguageDetectedInPhoto = result.Language;
                   foreach (Region region in result.Regions)
                   {
                       for (int i=0; i< region.Lines.Length; i++)
                       {
                           Line line = region.Lines[i];
                           string lineText = “”;
                           for (int j= 0; j < line.Words.Length; j++)
                           {
                               lineText += line.Words[j].Text;
                               if (j < line.Words.Length -1)
                               {
                                   lineText += ” “;
                               }
                           }
                           photo.TextInPhoto.Add(lineText);
                       }
                   }


             }
           }
           catch (Exception e)
           {
               throw;
           }
       }
   }

For example, this image returns one region with three lines of text composed of words in each line.

Quebec_License_Plate

In this simple example, we treat each line found as a new line and separate each word with a space (if punctuation is found, the API adds it to the word automatically.

Once we have our matched text, we can update our original SharePoint list item with the found text.

public void updateTaggedPhotosWithText(List<Photo> Photos)
          {
              using (ClientContext context = Login(SharePointURL))
              {
                  try
                  {
                      foreach (Photo photo in Photos)
                      {
                          SP.List list = context.Web.GetList(PhotosToTagURL);
                          ListItem item = list.GetItemById(photo.ID);
                         
                          string textInPhoto = “”;


                        string[] lines = photo.TextInPhoto.ToArray();


                        for (int i = 0; i < lines.Length; i++)
                          {
                              textInPhoto += lines[i];
                              if (i < lines.Length – 1)
                                  textInPhoto += “\n”;
                          }
                          item[PhotoTextColumn] = textInPhoto;
                          item.Update();
                          context.ExecuteQuery();
                      }
                  }
                  catch (Exception e)
                  {
                      throw;
                  }
              }


        }

Conclusion

Some of the image processing in the current Computer Vision API worked really well while other images failed to find the right text.   Keep in mind these APIs are still in beta and OCR is a notoriously difficult process to perfect especially with general image analysis.

For example, this license plate (found randomly on Google images) worked:

Quebec_License_Plate

but this one did not find the plate in the middle.

on2010jan

The Computer Vision API seems to work reasonably well with type faces, but doesn’t work at all with hand written text.  These images for example did not return any text.

img_9036

handwriting

This image returned Midnight but not Show.

poster1-o

Read More

Microsoft Now Will Ask For Your Explicit Approval to Access Your Office 365 Content

As further protection of your enterprise content, Microsoft has announced that they will ask for your explicit approval in the rare event that a Microsoft engineer needs to access your content.

For the purpose of maximizing data security and privacy for Office 365 customers, we have engineered the service to require nearly zero interaction with customer content by Microsoft employees.  Nearly all service operations performed by Microsoft are either fully automated so there is no human interaction, or the human involvement is abstracted away from Office 365 customer content. As a result, there are very few activities requiring any direct involvement by a Microsoft engineer. But, we didn’t want to stop there. We are taking the next step by putting the customer in explicit control over access to their content in the very rare instances when a Microsoft engineer does to log into the Office 365 service.

This new capability, Customer Lockbox for Office 365, provides unprecedented customer control over content residing in Office 365, so customers can be assured that their content will not be accessed by Microsoft employees without their explicit approval. It brings customers into the access approval loop, requiring the customer to provide explicit approval of access to their content by a Microsoft employee for service operations. The Customer Lockbox feature will be enabled in Office 365 for Exchange Online by the end of this year, and for SharePoint Online in the first quarter of 2016.

In addition, all these requests will be available to customers via the Office 365 Management Activity Logs.

Read More

Are You Still Using the Yammer App? Swap to Yammer Embed by Sept 2015

The Yammer App is an app part available for free in the SharePoint store that allows you integrate Yammer conversations into SharePoint 2013 on premise or SharePoint Online if you are using Office 365.

Microsoft has announced that the Yammer App will be discontinued and will stop working as of September 2015.  If you are using the Yammer App currently, you need to replace it with new Yammer Embed feature.

The process for replacing the Yammer app for SharePoint Server 2013 and SharePoint Online

Using Yammer Embed, you can provide similar integration between Yammer and SharePoint including display of my feed, group feeds, topic feeds, or specific object feeds.  Instead of Yammer being an App Part, the Yammer Embed is just HTML script that you can embed anywhere in your page.

Paste the script into the Script web part

A Yammer Group feed embedded in a SharePoint page

Read More

Azure ExpressRoute Support for Office 365 Coming Soon

Azure ExpressRoute 1

Microsoft has a service called Azure ExpressRoute which provides organizations with the ability to create private, dedicated network connections to the cloud.  With ExpressRoute, you can extend your on premise data center to the cloud through a high performance, dedicated network connection.

Starting later this year, Microsoft will support connect to Office 365 through an Azure ExpressRoute

ExpressRoute delivers the benefits of public cloud, while surpassing the network reliability and privacy of the Internet. It is a great option for organizations that require premium, managed connectivity to their productivity services. You can define all aspects of your network connectivity provider’s connection from Microsoft to your users, helping ensure predictable network performance and availability. You can also use multiple ExpressRoute providers to establish ExpressRoute circuits in different geographic locations for additional redundancy and geo-resiliency.

For those organizations looking to build out hybrid implementations of Azure and Office 365, this is a welcome addition to the service.

Read More