Friday, 12 April 2013

Automatically extracting GPS data from photos and populating Geolocation fields in SharePoint 2013

This has been a bit of a pet project of mine, ever since my wife spent 6 months working in the highlands of Scotland. She was taking a lot of photos and wanted to track the location easily (for a project). Now most modern mobile phones (and most high end DSLR cameras) can do this quite easily, but the problem has always been getting that location information out again .. so I thought:
"Hey, now SharePoint has built-in Geo-Location support with mapping! Wouldn't it be great if we could extract the GPS data from photos automatically and map it from an asset library?"And this is how I did it ..
SharePoint Geolocation and Bing Maps
Well .. first off I wonder how many of you out there knew that SharePoint could do this out of the box:
Pop-Up maps when you click on a Geolocation field in a SharePoint List View
Adding a Geolocation field enables a new "Map View" which shows you all the "pins" and associated information
That is completely "out of the box" mapping capabilities (not a single line of code). All you need to do is:
  • Create a Geolocation field (you won't be able to do this through the UI. You will need to create a field of type "Geolocation" either programmatically or through PowerShell)
  • Specify a Bing Maps API Key for your farm or site through PowerShell
  • Install the SQL CLR Types package on your Web Front End servers (as this is needed to use the new SQL Server "geo-spacial" data types)
I'm not going to repeat all of the information in this blog post as this is already fairly well documented. You can find full instructions on how to configure this on TechNet here:
http://msdn.microsoft.com/en-us/library/jj163135.aspx 
There is also some pretty good blog content by Rich Ross (@rich_ross) and Tobias Zimmergren (@zimmergren):
http://richross.me/2012/12/22/sharepoint-2013-geolocation/
http://zimmergren.net/technical/sp-2013-getting-started-with-the-new-geolocation-field-in-sharepoint-2013 

Photos, GPS and EXIF Information
Now, if you want to start playing about with GPS and Photos then you need to at least know about EXIF. This is basically the widely adopted standard for storing additional information in photos (such as the date and location it was taken, as well as more photography specific info like the lense aperture, shutter speed and camera make / model which was used). All of this can be found in quite a lot of detail in the EXIF specification (if you are having trouble sleeping).
You can actually see this in action if you look at the properties of an image file which you know has GPS information in it (say, one from your mobile phone).
EXIF and Lat / Long information as seen from a file properties dialog
Now two things should jump out at your here (especially as I've put a big red box around them both!). First is the EXIF version which as used (which shouldn't be of a massive interest to anyone, but at least shows you it has EXIF information).

Secondly is the latitute and longitude values which we need for our GPS coordinates. What might strike you as slightly odd is the format, as they are actually made up of three numbers in the format:
Degrees; Minutes; Seconds
GPS coordinates used by Bing / Google maps (and also in SharePoint Geolocation fields) need to use "decimal-degrees" which you can get quite easily from the formula:
Degrees + (Minutes / 60) + (Seconds / 3600)
In order to actually get these values out and leverage this in code then you will need a library which can extract and parse this information. Serious credit needs to go to the codeplex project: ExifLib library by Scott McKenzie. I used this extensively in my code and it worked a charm!

The usage of this library is pretty straightforward. First you load the image file as a .NET Stream object into the constructor.

ExifLib.ExifReader reader = new ExifLib.ExifReader(stream);

Once you've done that you use a generic method to spit out the EXIF tags using an enum and an out variable:

double[] latitude = new double[3];
double[] longitude = new double[3];
reader.GetTagValue<double[]>(ExifLib.ExifTags.GPSLatitude, out latitude);
reader.GetTagValue<double[]>(ExifLib.ExifTags.GPSLongitude, out longitude);

Once Now the sharp among you may have already spotted that the format is a little odd, that we are pulling out a 3-element array of double values.

This is because the EXIF information stores it in this format (the Degrees, Minutes, Seconds values) so we then need a simple method to convert them to "Decimal Degrees".

static Double ConvertDegreesToDecimalDegrees(Double[] degrees)
{
   if (degrees.Length == 3)  
   {                  
      Double returnValue = degrees[0] + 
         (degrees[1] / 60) + 
         (degrees[2] / 3600);    
      return returnValue;   
   }              
   else  
   {
      throw new ArgumentException("The degrees array must contain 3 different values for Degrees, Minutes and Seconds"); 
   }
} 
Once we have this method, it is pretty easy to convert the values over to a single double.
 
double decimalLatitude = ConvertDegreesToDecimalDegrees(latitude);
double decimalLongitude = ConvertDegreesToDecimalDegrees(longitude);

However, this is not all, because imperial (degrees, minutes, seconds) values also include another nuance:
  • Longitude measures the distance from the GMT vertical line
  • Latitude measures the distance from the Equator
For "normal" metric GPS coordinates to work we need to do the following:
  • Any longitude value which is WEST of the GMT line should be negative
  • Any latitude value which is SOUTH of the equator should be negative
And we can work that out by using two other EXIF values known as "Longitude Ref" (which is either "W" or "E") and "Latitude Ref" (which is either "N" or "S"). This basically gives us our compass points. So we need a final check to make sure our values are correctly either positive or negative.

string latitudeRef = String.Empty;
string longitudeRef = String.Empty;

reader.GetTagValue<string>(ExifLib.ExifTags.GPSLongitudeRef, out longitudeRef);
reader.GetTagValue<string>(ExifLib.ExifTags.GPSLatitudeRef, out latitudeRef);

if (latitudeRef == "S")
{  
  // it is "south" therefore needs to be a negative number
  decimalLatitude = 0 - decimalLatitude;
}

if (longitudeRef == "W")
{
  // it is "West" therefore needs to be a negative number
  decimalLongitude = 0 - decimalLongitude;
} 

Finally, once we have our values we can use the new SPFieldGeolocationValue class to assign it to a list item in SharePoint (in this case assigning it to a Geolocation field I created with an internal name of "Location")

// update the location field
 properties.ListItem["Location"] = 
   new SPFieldGeolocationValue(decimalLatitude, decimalLongitude);

// update the list item without affecting the modified date / editor
 properties.ListItem.SystemUpdate(false);

Bringing this all together in SharePoint
To be honest, for most SharePoint developers out there the rest should be pretty smooth sailing, but I'll show you the event receiver code below.

public class ItemAddedReceiver : SPItemEventReceiver
    {
        public override void ItemUpdated(SPItemEventProperties properties)
        {
            if (properties.ListItem.File.Exists &&
                properties.ListItem.Fields.ContainsField("Location"))
            {
                byte[] fileBytes = properties.ListItem.File.OpenBinary();

                MemoryStream stream = new MemoryStream(fileBytes);

                try
                {
                    ExifLib.ExifReader reader = new ExifLib.ExifReader(stream);

                    // we need 3-value double arrays
                    // the values are Degrees | Minutes | Seconds
                    double[] latitude = new double[3];
                    double[] longitude = new double[3];

                    // The Longitude and Latitude References tell us
                    // whether it is North or South of the Equator (Latitude) or
                    // whether it is West or East of Greenwich (Longitude)
                    // this will be a single character string representing
                    // the compass points ("N", "E", "S", "W")
                    string latitudeRef = String.Empty;
                    string longitudeRef = String.Empty;
                    
                    // try to retrieve values using the ExifLib library
                    // if the image doesn't find one of the values then this boolean 
                    // variable will be false
                    bool gotValue = reader.GetTagValue<double[]>(ExifLib.ExifTags.GPSLatitude, out latitude)
                        && reader.GetTagValue<double[]>(ExifLib.ExifTags.GPSLongitude, out longitude)
                        && reader.GetTagValue<string>(ExifLib.ExifTags.GPSLongitudeRef, out longitudeRef)
                        && reader.GetTagValue<string>(ExifLib.ExifTags.GPSLatitudeRef, out latitudeRef);
                                        

                    if (gotValue)
                    {
                        // convert degrees / minutes / seconds to decimal degrees
                        double decimalLatitude = ConvertDegreesToDecimalDegrees(latitude);
                        if (latitudeRef == "S")
                        {
                            // it is "south" therefore needs to be a negative number
                            decimalLatitude = 0 - decimalLatitude;
                        }
                        
                        double decimalLongitude = ConvertDegreesToDecimalDegrees(longitude);
                        if (longitudeRef == "W")
                        {
                            // it is "West" therefore needs to be a negative number
                            decimalLongitude = 0 - decimalLongitude;
                        }

                        // update the location field
                        properties.ListItem["Location"] = new SPFieldGeolocationValue(decimalLatitude, decimalLongitude);
                        properties.ListItem.SystemUpdate(false);
                    }
                }
                catch { }
            }
        }

        /// <summary>
        /// Converts degrees to a decimal-degree value
        /// Expects a Double array with 3 values (one for each of degrees / minutes / seconds)
        /// </summary>
        /// <param name="degrees">The Double[3] containing the original values</param>
        /// <returns>The new decimal degree value</returns>
        static Double ConvertDegreesToDecimalDegrees(Double[] degrees)
        {
            if (degrees.Length == 3)
            {
                Double returnValue = degrees[0] + (degrees[1] / 60) + (degrees[2] / 3600);
                return returnValue;
            }
            else
            {
                throw new ArgumentException("The degrees array must contain 3 different values for Degrees, Minutes and Seconds");
            }
        }
    }

I have also uploaded a full code sample (including a working version of the ExifLib.dll) which does the following:
  • Creates a Location site column and an Asset Library list instance
  • Event Receiver which fires on ItemAdded to extract the GPS EXIF info and place it into the Geolocation field.
  • Feature Receiver to add the Geolocation field and attach the event receiver to the asset library.


You can download the package here: http://sdrv.ms/122g8Cs

Hope you've enjoyed this post, and equally hope you can make use of the code samples! Enjoy.

Wednesday, 20 February 2013

Customising the Content Search Web Part - Part 1 - What you get in the box

This is the first post in a series I will be writing on the Content by Search Web Part (aka CSWP).
  1. What you get in the box (this post)
  2. Custom Display Templates with JavaScript
  3. Going Old Skool with XSLT
  4. Packaging & Deployment in Visual Studio
Search is quick, Search is vast, Search is better .. Well where do I start? SharePoint 2013 is all about Search. It has a completely rebuilt search engine which incorporates a lot of the awesome power that Microsoft gained from FAST over the years.

I've seen, a lot of SharePoint projects over the years which have been based heavily around Search, typically using custom developed web parts based on the Search Core Results web part. Because the core search web parts used XSLT for their rendering we could totally customise the interface and output. They included an out of the box "paging" capability and through the query syntax you could build quite sophisticated queries.

Search gives you the ability to pull immensely vast amounts of information from your sites (or other sites, public websites, file shares, even Exchange!) and return them in an extremely quick fashion. In terms of querying and returning information it is formidably fast the only real  downside being the time it takes for search to actually index your content (which even on a well optimised farm was only going to be around 15 minutes at best). SharePoint 2013 introduces Continuous Crawls which basically allows content to be indexed almost immediately (with typically around a 30 second delay).

Even without those indexing issues though the main problem with these search based approaches is that they tended to have very unsophisticated editing capabilities for the people building the pages. You needed to have a damned good knowledge of the Search Keyword Query Syntax and this was just yet another hurdle for editors who are just trying to put pages together

Enter the Content Search Web Part!
The SharePoint 2013 solution to this is the Content by Search Web Part (CSWP) which is basically designed to be a replacement for the trusty Content by Query Web Part (CQWP) which we have been used to using in most of our projects in SharePoint 2007 and 2010.

This includes a number of outstanding features:
  1. Very advanced "query editor" which use a separate pop-up dialog. This allows you to define very complex search queries to bring back almost any granularity of information
  2. Query shortcuts are also built into the query editor, so you can easily tell the web part to only return content from the current site, or site collection, or just return documents / pictures, or a whole range of other content.
  3. A range of different Display Templates are provided allowing you to switch between different "styles" (including paging!). These templates are fully extensible and adding your own custom templates will be covered in Part 2 of our series.
  4. The values being shown in the output can be controlled and modified using "Property Mappings" (which is covered later in this post).
  5. User Profile Tokens allow values in the current user's profile to be swapped out "on the fly". This is massive! This alone makes the CSWP worthwhile (e.g. pull back all news articles tagged with the user's department?)
I could go on because this web part is immense and in every way an improvement. The performance is lightning quick and if you aren't using it then you really need to consider why not!

The "Build Your Query" wizard
The first thing we will look at is the query editor. This is a fantastic new wizard interface which you can access from the Web Part properties.

Change Query pops up the Build Your Query pop-up
This allows at first a basic mode which allows you to select from various prebuilt result sources. This in itself probably allows you to meet 90% of your search requirements.

In Basic Mode, you can pick from result sources, restrict by site / URL and access basic selections
The basic mode also allows access to an easy "Restrict by app" which effectively means "restrict by URL" but allows you to easily pick "Current Site" and "Current Site Collection".

In Advanced mode you can construct pretty much any query you want using the SharePoint 2013 Keyword Query Language (KQL) Syntax.

Advanced Mode allows extensive custom KQL queries, such as the above which returns people who have a profile picture and their "About Me" section contains the word "SharePoint"

You can even refine this further using the "Refinement" panel which allows you to cherry pick different values in a very similar fashion to the refinement panels you will have seen in SharePoint search results pages.

You can cherry pick refiners to trim down the results, much as you would if you were viewing a Search results page.
You also have an ever-present "Test Results" panel on the right hand side which allows you to view what you might get in your results given the current settings...

One other new addition is a new user token which allows you to include properties from the current user in your search queries dynamically (clearly great minds think alike... ).

Adding the current user puts {User.Name} in the query
Using the "Name of the user who runs the query" token places a construct of {User.Name} which will basically replace that with the name of the current user each time the page is accessed. I have found however that you can swap this out with other user profile properties as well (such as {User.Department} or {User.JobTitle} .. however not all of them seem to work, some experimentation is required!).

This provides an amazing opportunity to create truly personalised feeds of information where the results are relevant to the current user, based on whatever they have selected in their profile.

.. All in all, this is a fantastic improvement over any of the previous query editing interfaces in SharePoint, and allows you to configure in some cases extremely complex queries.

Switching Display Templates and Configuring Property Mappings

Note - in Part 2 of this series we will look at building our own custom Templates, but for now we will be looking at how we can customise the look using the out of the box templates.

Now this should be familiar to anyone who is used to working with the Content by Query Web Part.

First up lets talk about the display templates. A bunch of these come out of the box and basically control the look and feel of the contents of the web part. There are two types which you can select:
  • Control Templates - These determine the rendering container or wrapper of the contents
  • Item Templates - These determine the rendering of each item which is returned in the results

Display Templates are picked from the Web Part Properties
These are all JavaScript based, so you might see some delays before it renders, but they are in my experience both fast and adaptable.

The specific templates you get are:

Control Templates
  • List
  • List with Paging
  • Slideshow
Item Templates
  • Diagnostic
  • Large Picture
  • Picture on Left, 3 Lines on right
  • Picture on Left, 3 Lines on bottom
  • Recommended Items: Picture on Left, 3 Lines on right
  • Two Lines
  • Video
Most of these should be pretty self-explanatory but some of them deserve special mention.

The List with paging control template adds next/previous paging controls (implemented using Async JavaScript) while the Slideshow control template provides a javascript based fade-in / fade-out animation.

The Video item template actually adds an HTML5 video object but probably the most useful one is "Diagnostic". When picked this displays detailed information about your Property Mappings which is what allows you to really understand what information your Content by Search Web Part is displaying ..

Property Mappings
So .. what are these property mappings and what do they do?

Well .. you remember some of the difficulty in trying to map fields to a Content by Query web part (and passing them back to the back-end XSLT)... well the Content by Search Web Part uses Property Mappings which map to Display Templates (which are JavaScript powered) .. and it works incredibly well!

Basically the Item display template you pick will have a number of properties which need to be mapped, so in the example below I have picked the Item Template "Picture on Left, 3 Lines on right".

As a result there are 5 properties which need mapping:
  • Picture URL (i.e. the image to be displayed)
  • Link URL (i.e. where you should go when you click on the item)
  • Line 1 - I have chosen Title
  • Line 2 - I have chosen Description
  • Line 3 - I have chosen LastModifiedTime

Property Mappings allow you to control what appears in what parts of the chosen template
The templates are generally intelligent enough to know if the property doesn't have any values, or if you haven't actually mapped it to anything.

So this is yet another level of customisation you can apply, and the drop-down menu on each mapping allows you to cherry pick from the properties which have been indexed and mapped in the current search service.

The really great thing here is that the mappings will change depending on the template (and when you get to building your own, you can specify your own mappings). This is where the Diagnostic item template really comes into its own, as it allows you to pull in 9 fields of your choice and it displays detailed information from the results, showing you what the value is and what the mapping is for each item.

...

Well that is all for now so hope you realise like I do how powerful the Content by Search Web Part can truly be.

Next in the Series : Custom Display Templates with JavaScript (Coming Soon)

Monday, 18 February 2013

Why I'm loving having my head in the Microsoft cloud

Microsoft Disclaimer - Yes I am a Microsoft evangelist. I have been working with Microsoft tech for the entire of my working career. I know there are competing technologies out there, some of them perhaps more feature rich, or cheaper, or whatever .. but this is merely a conversational piece about my experience which I still believe is the ONLY supplier you can go to in order to get the complete service across all scenarios from the same supplier ... please don't troll, we don't feed them here!

I have to admit up front .. I have never really been what you might call an "early adopter". I didn't get my first mobile phone until 2001.. Everyone I knew was using laptops for years while I got my first one for myself in 2010, and until recently all of my backups have been to portable disk drives sat in the drawer of my office at home.

Things have changed though .. life is different and a whole lot easier .. I'm moved all of my stuff to "the cloud" just over a year back, and my cloud has a Microsoft logo!
Terminology Disclaimer - Yes, I know .. "The Cloud" .. we used to just call these things Data Centres or 3rd Party Hosting. But you gotta keep with the times eh!
Cloud Services
So .. when I'm talking about "moving to the cloud" what exactly am I referring to? Well .. I've split this into two sections; Personal Use and Business Use.

  • Personal Use
    • Email (Hotmail)
    • Personal file storage (SkyDrive)
    • Sync between phone and desktop (Windows Phone)

  • Business Use
    • Email (Office 365 - Exchange Online)
    • Document Storage (Office 365 - SharePoint Online)
    • Collaborative workspaces (can't believe I'm actually using this phrase.. sorry!) (Office 365 - SharePoint Online)
    • Instant Messaging / Video Conferencing / Desktop Sharing (Office 365 - Lync Online)
    • Development Source Control (Team Foundation Service)
... and I could get all of this for £107 per year ...


Personal Use - Email (free)
I guess with this I've been a "cloud" user for quite some time. I've actually had my Hotmail account for over 16 years (1997 .. shortly after it was purchased by Microsoft). Ok .. so back in my youth I needed an email address and this was going through school as being the "cool new thing" so I signed up (didn't really use it much for the first couple of years though).

That effectively took care of my personal email needs, and 16 years later I'm still using the same email address (and thanks to the pretty damned awesome junk mail filtering Microsoft have in place, I get very little spam at all, if any!).

Personal Use - File Storage (£32 per year)
So the next thing I was going to look for was personal file storage.. fast forward about a decade and my email account also led me to, of course, SkyDrive. Now this service has been around since 2007 and I got it "for free" because of my Hotmail account. Things really started to get interesting when LiveMesh was launched (the beta coming out in 2008) which allowed you to start syncing files on your workstation with your SkyDrive account.

However .. LiveMesh was quite limited as it would only sync a maximum of 5GB of files to the cloud (regardless of how much free space you had .. I had 25GB of space in my SkyDrive account). I dabbled with this starting off by syncing My Documents and My Pictures using LiveMesh .. but the whole experience was a little bit clunky and to be honest .. with a 5GB maximum on there it was never going to be the most useful service to me. I still had tonnes of files sat on my workstation which I needed physical backups for and only having 1 computer I didn't really get any value out of a "access my files elsewhere" service either which is also what LiveMesh offered.

Then came the game-changer! SkyDrive for Windows launched. This was huge (for me at least) as Microsoft had effectively opened up the floodgates. The new application  had very simple functionality which I tested for all of about 2 hours before removing LiveMesh as quickly as possible .. a worthy replacement had been found!

The new capabilities of SkyDrive allowed me to sync ANYTHING I wanted with my SkyDrive account online, and I could sync up to my maximum file allowance (25GB .. but now options to increase this in increments up as high as 125GB if needed).

I paid for the full 100GB extra storage (which cost me about £30 per year) and this basically takes care of all my backups. It runs seamlessly in the background, and it backs up all my documents, all my music, my pictures, videos and downloads..

The best part is I can access them through the web, so I go to my parents and want to show them some photos or pull up something from one note I can hop on their machine and all my files are "just there" ..

Personal Use - Phone to Desktop file sync (free?)
The final piece to the jigsaw came together about 3 years ago when Windows Phone 7 was launched. I definitely jumped on this with both feet (my previous smartphones being a Nokia N95 and an HTC HD2). This also had SkyDrive integrated right from the get-go .. I could upload photos (automatically as I took them if needed) .. I could read my office files and documents from the built-in office hub straight off SkyDrive .. and it even used SkyDrive for the Twitter and Facebook storage for uploading images if I wanted to share them ..

I've kind of marked this as "free" as I was going to buy a phone anyway. It didn't cost me any extra to get myself a Windows Phone 7 (in many cases cheaper than leading Android and Apple iOS devices) .. so yes, my phone contract cost me money .. but the cloud file sync bit was "free".

Business Use - Office 365 (£75 per year)
Well, this was mostly a recent requirement as I was formerly full-time worker and let my employer worry about things like hosting email and storing documents .. but in 2010 I joined the increasingly popular contractor route and set myself up with my own company ..

Luckily Microsoft had also recently launched its own Office 365 services .. probably the best bang-for-your-buck online service you can get with fantastic quality, Enterprise level cover and small-business prices.

For £6.25 per month (I went for the E1 plan) I could get:

  • Exchange Online - 25GB email mailbox with the latest Outlook web access
  • SharePoint Online - My own private SharePoint tenant, with all the standard bells and whistles to play with, and ability to invite external "Microsoft Account" users for free to join in!
  • Lync Online - federated with the MSN Messenger / Live Messenger network and all of the other federated Lync users (i.e. Microsoft / other Office 365 users / most Microsoft partner companies).
This to be honest was a no brainer .. I am a SharePoint professional by trade, lets be honest, I was never going to choose anything else (not to mention for the price and featurset Office 365 is simply the best offering out there).

The best bit is I could create "collaborative workspaces" (sorry again!) where I can spin up SharePoint sites (or site collections) to work on stuff with other people.

The typical use case for me is sharing my finance files with my accountant .. and it felt a lot more professional when I can do this on my own branded site and (using my knowledge and experience of SharePoint) offer customised experience specifically for that need.

Business Use - Team Foundation Service (free)
The final piece to the puzzle was Source Control

I do quite a lot of personal projects, typically working on code samples for when I'm speaking at community events (or writing up code for blog articles).

I really struggled to work out how I could get easy backup for my source control... again this stemmed from my experience point .. I have spent almost my entire development career using Team Foundation Server (with a few painful years on Visual SourceSafe) .. the problem is that TFS hosting is typically damned expensive!

Then the miracle came .. Microsoft was offering a preview service called "Team Foundation Service" (http://tfs.visualstudio.com/).

This allowed me to create my own TFS projects and use full source control and even access to build agents!! This eventually went live and Microsoft announced that for small usage (up to 5 TFS projects) it was completely free!

...

Well .. I made the big leap a while ago, and I am absolutely loving it! I have had to re-install my laptop twice in the past 12 months and I have never had a less painful experience!

The process for getting all of my local files back ended up being:
  • Install Windows
  • Install SkyDrive for Windows
    • Start folder sync
  • Install Office 2013
    • Configure Outlook, start mailbox sync
    • Start SkyDrive Pro sync
  • Leave running overnight
That was it .. next morning all of my files were back. I have never had to run a "backup schedule" or worry about losing my files ... stress free and painless computing. It has been so successful, I've even gotten my parents running on SkyDrive!


SkyDrive and SkyDrive Pro Explained (Office 2013 and SharePoint 2013)


Ok lets get something straight right off the bat ...
 

SkyDrive Pro is not limited to Office 365. I've heard this stated now several times (from both laypersons and SharePoint professionals both) and it is simply not true. If you have a User Profile Service in SharePoint 2013 with My Sites enabled then you get the same SkyDrive Pro features to someone running Office 365 tenants!


SkyDrive
Ok, so first off this (https://skydrive.live.com) has absolutely NOTHING to do with "SkyDrive Pro" or SharePoint ...

SkyDrive is a free cloud-based storage service that Microsoft have been offering for many many years now. It is part of the Outlook.com family (aka “Hotmail” | “Windows Live" | "Microsoft Account") and is basically a competing service for the likes of DropBox / iCloud / Google Drive.  By default you get a shared folder allowing you to share files with “the public” but you can also modify the permissions of any folder to either make it available for specific people or for “everyone” if you choose.

It offers a web based interface (as well as apps for Windows 8, Windows Phone, iOS and Android) which allows you to store your documents and files, as well as free lightweight browser versions of Word / Excel / PowerPoint / OneNote.
 
There is also a desktop application (SkyDrive for Windows, which is the successor to the popular "Live Mesh") which allows you to synchronise chosen SkyDrive folders to any folder on your computer (Drop-Box style) and this allows two-way synchronisation with that folder to “the cloud” where you files will be backed up and securely stored. The default location for this folder is in your main profile folder (e.g. "C:\Users\martin.hatch\SkyDrive") but you can select any folder location when the application first runs.
 
The SkyDrive folder when you have SkyDrive for Windows installed
 
SkyDrive is also one of the default save locations for Microsoft Office 2013 and also has close integration points with Windows 8 (with baked-in SkyDrive apps) and Windows Phone (auto-upload photos to SkyDrive, and it creates a SkyDrive folder to store twitter / facebook photos when you "share" them).

The default flavour gives you 7GB of storage (the largest amount for any of the leading “free” packages) and allows you to expand this through paid-for storage adding up to 100GB extra content (for a total of 107 GB).
 
Early adopters of SkyDrive were also rewarded with a “free” storage allowance of 25GB instead of 7GB.
 

SkyDrive and SkyDrive Pro in SharePoint 2013 (aka “My Site Documents”)
In the eternal fail which is Microsoft marketing naming conventions, there is also a “SkyDrive” link in the “suite links” bar at the top of each page in SharePoint 2013 (this is identical for both Office 365 and On Premise).

SkyDrive appears as a link in the "Suite Bar Links" in SharePoint 2013
This is actually just a link to the “Documents" library in what we used to call your “My Site”. By default this is an empty document library with a folder called “Shared with Everyone”.

To add confusion to this, the top level title and descriptive text when you navigate to this library clearly calls it "Sky Drive Pro" ..

The "SkyDrive Pro" library.. which you get to by clicking the "SkyDrive" link

Why they called the link “SkyDrive” I don’t really know … perhaps “SkyDrive Pro” would have been a better name (keep reading to find out why !)
 
SkyDrive Pro 2013 - the Windows Application
Now this is where things get really confusing .. if you install Office 2013 Professional Plus then you also get a new application on your computer called “SkyDrive Pro 2013”

The SkyDrive Pro 2013 tile on my Windows 8 Start Screen
This is an application that runs in the desktop system tray and allows you basic access to “sync a library” with your computer. This can be ANY SharePoint 2013 document library (and I have also used it quite successfully with a number of SharePoint 2010 document libraries as well).
SkyDrive Pro is an application that runs in the System Tray


You can do this in one of two ways:

  • Run the “Sync a new Library” from the system tray, and type in the URL of the document library (you can also type in the URL of a site, and it will list the document libraries for you to select)
  • From the SharePoint 2013 interface click the “Sync” button when viewing a library
The "SYNC" link in SharePoint 2013 will launch the SkyDrive Pro 2013 application
Once you sync a library you get a new "SharePoint" folder which appears in your main profile folder alongside My Documents, My Pictures, etc .. (e.g. "C:\Users\martin.hatch\SharePoint").

If you have synced some libraries using SkyDrive Pro 2013, you get this folder on your PC

For each library that you sync it will create a new subfolder and will basically keep a two-way sync between the two of them (you add, edit or delete a file here and it gets replicated in SharePoint, and vice versa).

Each new folder will get the name "<Site Title> - <Library Title>" although it seems to trim the library title if it is too long.

The contents of my "SharePoint" folder .. having synced a bunch of libraries from SharePoint


The SkyDrive Pro Folder – (also using the Office 2013 Desktop Application)
Just to confuse things even further, there is also another “special” extra that they threw into the mix.

If you sync the "SkyDrive Pro" library in your My Site (i.e. the one you get to if you click the “SkyDrive" link in the page header) then it doesn’t sync to the SharePoint Folder!

Instead it creates a special folder called “SkyDrive Pro” which has the same icon as the main “SkyDrive” icon (if you have SkyDrive for Windows installed as well!). This is also installed in your profile folder (e.g. "C:\Users\martin.hatch\SkyDrive Pro").
 
You can of course run both SkyDrive and SkyDrive Pro side-by-side, which is what I have shown below.
 
SkyDrive Pro folder uses the same icon as the SkyDrive folder ..
 
This then contains the contents of that actually library, but other than that it works the same way as other synchronised folders.

One thing to note is that if you sync multiple SkyDrive Pro libraryes (say from different My Sites or different Office 365 tenants) then it will create multiple SkyDrive Pro folders.

Syncing more than one SkyDrive Pro folder creates awesome folder names ..
 
I have read elsewhere that you can rename these folders but when I tried to do this I started getting sync errors!

Trying to "Sync" a SharePoint 2013 folder without "SkyDrive Pro 2013" installed
This is another one which I have heard said before which is that trying to "Sync" a SharePoint 2013 library when you don't have Office 2013 installed (more specifically the SkyDrive Pro 2013 bit) will automatically install it on the fly... ?? ... erm ... no it doesn't.

I tried this on my development VM (which doesn't have office installed) and I got two weird prompts in a row ..

First I got a weird IE10 "do you want to allow this website to open an app on your computer?" question .. which immediately got alarm bells ringing ..

This could be installing an app on the fly .. couldn't it?
But then you get a generic "No apps are installed to open this type of link (grvopen)" error .. So basically it was trying to open a file which I don't have apps supported for.

So it would seem that, no, you can't sync libraries without SkyDrive Pro 2013 installed.

Fail and Error .. although interesting "Groove" reference
My final parting shot on this is the interesting app type (grvopen) which is clearly a reference to "Groove Open" .. for those who don't know way back the old SharePoint synchronisation tool was an application called "Groove". This eventually got replaced with "SharePoint Workspace" which has now been replaced in the latest build with "SkyDrive Pro 2013".

I honestly don't know if you can "Sync" with SharePoint Workspace or not, would love to hear if you can!

 ....
 
So, that outlines the rough difference between Sky Drive and SkyDrive Pro J
 
Recap
 
  • SkyDrive is a free service from Microsoft, and has nothing to do with Office or SharePoint
  • SkyDrive for Windows is a free desktop application which you can use to sync your SkyDrive folders with your computer
 
  • SkyDrive Pro is the personal library in your My Site, and you get to it from a "SkyDrive" link in the SharePoint 2013 header
  • SkyDrive Pro 2013 is an Office 2013 desktop application which you can use to sync SharePoint libraries to your computer (including your personal "SkyDrive Pro" library)


Friday, 8 February 2013

Conditional Query String Panel - CSS which is only used in a dialog

This is something I initially knocked up so that I could add CSS to a page conditional on the query string present. I basically wanted to change the CSS if the page was showing a dialog.

It is a very simple control which extends the ASP.Net "Panel" class (which basically outputs a DIV). I added some Pre-Render logic to check for a query string value and only show the contents if that Query String is present.

Code
public class ConditionalQueryStringPanel : Panel
{     public String QueryString
   { get; set; }

   protected override void OnPreRender(EventArgs e)
   {       base.OnPreRender(e);
       this.Visible = Page.ClientQueryString.Contains(QueryString);
   }

}

In the example usage below I am using this panel to conditionally change the margin of one of my containers when the page is showing in a pop-up dialog

Usage
<MJH:ConditionalQueryStringPanel runat="server" QueryString="IsDlg=1">
    <style type="text/css">
      #contentBox
         margin-left: 0px;
      }    </style>
</MJH:ConditionalQueryStringPanel>

Something quite simple but hopefully you should be able to make use of it.

Wednesday, 7 November 2012

New laptop ordered .. and something I didn't realise about CPU performance

Well, I've finally taken the plunge and ordered myself a new laptop. SharePoint 2013 has finally gone RTM and the hardware requirements are eye watering to say the least.

My Current Laptop

Now .. I always thought that my existing laptop was no slouch. It was pretty high spec (as older laptops go) and even thought it was primarily a gaming machine it certainly tackled most development requirements with a pretty good rate of knots.

Intel i7-740QM
16GB DDR3-1333 RAM
512GB Crucial M4 SSD (SATA II)
1GB ATi Radeon HD 5850

 But with SharePoint 2013 there are quite a few things lacking. 16GB really isn't enough to run a proper SharePoint 2013 environment and I also like to play around with features even in SharePoint 2010 that could do with more juice (I have given presentations on Performance Testing and Kerberos which really require 5-6 separate VMs with a fair amount of RAM each).

Wish list for a new laptop

For my new laptop I had 3 core requirements:
  1. Increased RAM (32GB at a minimum) to run multiple SharePoint VMs
  2. Native USB 3.0 and SATA III support for faster drive speeds (my current SSD drives support this, and I have a load of USB 3.0 devices, so this was a must)
  3. Improved Battery Life - my current machine only gets 2 hours tops and I ideally wanted an "all day" device for those coffee shop / conference moments
But before I dive into that I wanted to share a discussion I had on twitter and a small revelation I found from checking up the statistics and information about CPU performance, in particular the Intel i7 CPUs.

All of the laptops I looked at satisfied criteria 1 and 2 so it was initially only battery life that was going to swing anything .. or was it .. ?

Does CPU speed matter?

Well this was first brought to attention by @tristanwatkins through his blog article on i5 versus i7 performance speeds and this was also joined in discussion from @benjaminathawes.

Now .. this is something that I never really considered, especially when you look at the model numbers of CPUs these days:
  • First Generation : i7-740QM
  • Second Generation (Sandy Bridge) : i7-2720QM
  • Third Generation (Ivy Bridge): i7-3740QM
I always glanced and didn't really notice much of a difference .. until you dig into the specifications:
  • i7-740QM - 1.7Ghz, Turbo Boost to 2.9Ghz
  • i7-2720QM - 2.2Ghz, Turbo Boost to 3.3 Ghz
  • i7-3740QM - 2.7Ghz, Turbo Boost to 3.7Ghz
This is quite a staggering ramp up in CPU speed (especially as each generation ALSO offers enhanced battery life).

At this point in time I was also working on a SharePoint 2010 project and logging into a friend's development machine remotely. I couldn't help noticing that with an identical VM clone of mine his was deploying and refreshing the pages vastly quicker than mine (so much faster I had to double check the Visual Studio settings to make sure it WAS actually deploying the files). IISRESET and Application Pool recycle were SO much faster I could barely believe it. To top this off, his VM copy was only running on 6GB RAM (and mine was running on 10GB)!

I checked his system settings and he was running a new 2nd generation i7 (actually a i7-3930) but was running a much higher clock speed than mine

So that was kind of conclusive, a new item on my wish list therefore became:
  • Faster CPU
To be honest this didn't actually have much of an impact on the decision of which laptop to buy (because ALL of the 2nd Gen / 3rd Gen i7 CPUs are vastly quicker than the 1st Gen i7 CPUs). But it did have an impact on the "I need a new laptop" decision beyond just battery life and RAM.

All of the laptop models I was looking at came with exactly the same spread of Intel i7 and i5 chipsets so it didn't really have any impact, but this analysis was very interesting nonetheless.

Battery Life and the final decision ..

The final stretch was looking for battery life and rounding it down to a few final models .. I did consider a number of different candidates, and in particular there were two models I was looking closely at:
  • Dell Precision M4700
  • Lenovo W530
The Dell Precision range came quite highly recommended and the Dell Precision M6700 looked like a beast of a machine but with a 17.3" screen it wasn't very "portable" and I do tend to carry mine around London quite a lot. The alternative model was the Dell Precision M4700 (15.6") which also looked very nice (with very similar options to the Lenovo W530, also a 15.6") and the build quality and spec of both machines was very similar (both of them with a large number of ports).

Both the Lenovo W-series and Dell Precision machines come highly recommended to me from friends on Twitter and everyone seems to be very happy with their machine (regardless of which one they have). They both have a pretty damned similar range of "internal" specs and the same kind of generic options:
  • Latest 3rd Generation Intel i7 chips
  • 15.6" 1080p screens
  • Wide number of ports (USB 3.0 / HDMI / etc)
  • Ability to remove the optical drive for a second disk drive
  • Ability to clip on a "battery slice" to the docking port on the bottom of the laptop - which can extend (even double!) the battery life of the machine
At the end of the day the settling factor was the battery life, and this was the only real stand-out feature which made the Lenovo W530 jump out of the crowd.

The W530 comes with an additional Intel HD 4000 Integrated Graphics chip. This combined with their apparently excellent power management software, basically allows the laptop to switch over to a low-power graphics chip which makes an enormous difference to battery life!

The Dell Precision workstations both come with NVIDIA Quadro graphics chips, which although very good (especially for CAD / Photoshop) do chew through the battery on high-performance modes. The W530 also has the same graphics chipset, but at least it can turn it off when not needed.

The results of this are (from several internet sources, the blogs of which I seem to have misplaced):
Disclaimer - I can't verify the accuracy of these numbers, but from various conversations and anecdotal evidence I believe them to be accurate
  • Dell Precision M4700 (with 9-cell battery)
    • Light Usage: ~6 hours
    • Heavy Usage: ~2 hours
  • Lenovo W530 (with 9-cell battery)
    • Light Usage: ~12 hours
    • Heavy Usage: ~6 hours
This was a staggering difference .. and when you add another 9-cell battery slice this takes the W530 up to over 16 hours for light usage (i.e. conferences / flights) and even on heavy usage can easily last "all day" on battery alone!

My new laptop - Lennovo W530

So my decision was finally made, and I ordered myself a Lenovo W530. I really can't wait for this to arrive, and I'm definitely going to be doing some performance test comparisons to my current laptop (running identical VMs) just to see what the difference is!

I am also presenting at SharePoint Saturday UK in December on Performance Testing with Visual Studio 2012 so I hope to have the new laptop fully up and running by then!

Full Spec:
(well .. the important bits)
  • 3rd Gen i7-3840QM (2.7Ghz, Turbo Boost up to 3.7Ghz, 8MB Cache)
  • 32 GB DDR3 1600Mhz RAM
  • NVIDIA Quadro K2000M with 2GB DDR3 and Intel HD 4000 Integrated Graphics
  • 2x 512 GB Crucial M4 SSD (SATA III / 550MB/s)*
(* note - to get two hard drives in this I will remove the optical drive and use a drive bay adapter. I don't really need / use optical drives these days anyway, and I install Windows off a memory stick)

Watch this space and once it arrives I'll be giving a summary of any noticeable changes!

Wednesday, 10 October 2012

How many apps do you really need for a phone?

I must have had this conversation a dozen times, and seen it from various trolling on the internet ... the Windows Phone Store doesn't have very many apps, and therefore iPhone / Android phones are better.

Honestly .. I can't say I've noticed ..

The stores of course differ wildly in size, back in March 2011 the "app store" sizes for each of the major handsets was (apparently)

  • Apple - 330,000+
  • Android - 206,000+
  • Windows Phone 7 - 11,000+

So .. only 10k apps (I believe the number is a lot higher this year, especially with Windows 8, Windows Phone 8 and Office 2013 all making their moves towards an "app" model) but the premise is the same .. there are a LOT more apps for iPhone / Android than there are for Windows, but does that actually make a difference to your phone?

I thought I would share what apps I have installed and use regularly, just to see how much I am "missing out" by not getting myself the latest shiny tech device from competing providers.

So here they come, in no particular order..

Twitter

Take your pick, there are a whole bunch of them out there in the Windows Phone marketplace. There is the official twitter app plus the popular rowi and Seesmic variants.

For 99% of what I need I actually use the built-in "People Hub" which allows me to read the latest tweets and also post some of my own updates too. However it doesn't include direct messaging, search or (un)follow capabilities so a dedicated app is still sometimes useful.

Facebook (only just!)

Same story here to be honest. The "People Hub" does pretty much all I need and I can't say I have logged into the web interface of Facebook for almost 2 years. I still use a dedicated app (in my case the "official" Facebook app, published by Microsoft) but this is only to check direct messages and occasionally change the odd setting or check something .. but I only tend to fire it up once every 3-4 months.

Honestly I could survive with just the people hub which is built into the phone (as I can always use a computer for those hard-to-reach places if I am desperate) .. but there are dozens of Facebook apps in the marketplace anyway so I tend to have one to hand anyway.

Weather

Probably the first one I install to be honest. I used to use AccuWeather but now Microsoft have released their very own Weather app (which I have been using for the past few months). Its useful to have it pinned to the home page so I get live-tile updates (in case I can't be bothered to look out of the window), but its nice to know if I should expect rain in London before leaving for work so I can grab a rain-coat or umbrella.

Adobe Reader

This is just for simple PDF support. I occasionally receive PDF files as email attachments and sometimes download them (usually terms and conditions) from websites so having some kind of PDF app is a must. Luckily the integration is solid and it launches "on demand" when a PDF file is opened.

YouTube

Now I'm not even sure if you would need this in Windows Phone 8 due to the HTML5 and Native Flash support in the IE10 browser but on my WP7.5 device I still need an external app to view YouTube videos.

Again, the integration is seamless, if you click to view a video the app launches automatically then plays the video in the native phone video player.

Flashlight

Simple this one .. I have dual LED bulbs on the back of my phone (for the camera) but why not use it as a flashlight (or a "torch" as we say in the UK).

I live in a very dark part of the countryside so having a handy flashlight when I need to navigate my garden at night, or getting from the car to the house without tripping over things is really useful.

Tube Map

Ok .. I admit it .. the London Underground is a bloody rabbit warren. If you haven't lived there for 30 years, don't like jellied eels or don't understand what "dog and bone" or "apples and pairs" means then you will need a tube map!

I specifically use one which allows me to have offline maps because (surprise!) there is no signal on underground trains :)

..

And .. that's it ..

As I have a Nokia phone it comes with world leading Voice Turn-by-Turn SatNav courtesy of "Nokia Drive" with full (free!) offline maps worldwide and offline searching too, as well as a whole bunch of camera functions, public transport apps and streaming music.

All Windows Phones have Office built in which gives you excellent Word / Excel / PowerPoint / OneNote integration (the OneNote is especially awesome and I use it all the time!)

Social integration is baked in with LinkedIn, Facebook and Twitter (which are the 3 social networks which I tend to use on a daily basis .. probably like most people in the SharePoint industry).

The "cloud storage" story is an interesting one as SkyDrive is baked in across the product (you can auto-upload your photos, as well as opening documents from the office apps and browse photos using both the People Hub and the Pictures Hub) but arguably you might get a bit of legs from installing a custom app (there is for example dedicated DropBox and SkyDrive apps in the marketplace)

Wireless HotSpot capability is built in so I can use my phone as a roaming wireless router for my laptop / tablet of choice (along with the usually Bluetooth / hands free functions).

And the email client supports a whole range of email accounts from Hotmail, Gmail and Yahoo through to Exchange and Nokia Mail .. or even just a custom POP / IMAP email account.

The only thing that really stands out is more the "one off" apps that crop up from time to time. You are watching TV and they say there is a companion app .. or one for online banking .. or an app which goes with your latest cook book .. these all seem to be Android and iPhone .. but I survived without having apps for absolutely everything so I think I'll continue to survive with a Windows Phone.

What is your story?? Any apps which you really can't live without? (that you can't find in the Windows Phone marketplace?)