A recently rolled out feature makes it reasonably simple to create a collection of SharePoint asset libraries whose contents will be served not necessarily from the data center in which your tenant is resident, but from a content distribution network (CDN). In many cases, this will allow fixed assets to be served to users from servers geographically closer to them. If you have a widely distributed user population and a large collection of static content that is frequently served to them, then this feature could well be for you.
First a few caveats, as of this writing there is a limit of 30 total organization asset libraries and they must all live in one site. These do not sound like onerous restrictions. Finally, part of establishing an organization asset library involves enabling the CDN on your tenant. We’ll see requests for confirmation about this later.
In preparation for this I checked the CDN status in my tenant and found, as expected, nothing there.
Great! So how does one start? First, you need a library. A bog standard document library will do nicely. I used the team site that resides as the root site collection in my tenant to house my test library and created a new document library called OrgAssets.
It’s tempting to say that making the document library into an organization asset library couldn’t be simpler, only it could. In the future I imagine we’ll be able to do this from a check box in library settings or from somewhere in the SharePoint on-line administration pages. For now, you’ll have to work with the SharePoint Online Management Shell. Rest assured readers, it’s not that bad.
(If you’re unfamiliar with using the management shell, see the quick intro here.)
Once you’ve launched the shell and connected to the service you have just one cmdlet to run,
Add-SPOOrgAssetsLibrary. The results are shown below.
My first attempt included the trailing ‘/’ in the library name. Woops! Apparently this is bad. The second attempt without the slash worked fine.
Note the request for confirmation for enabling the CDN on the tenant. If you say no, then no organization asset library for you.
That was it? Really? Yes, that’s it. The OrgAssets library is now defined as one of my tenant’s organization assets libraries and content I add to it may be served through the CDN.
Is there a trick to it? Sort of. You must add the content to your pages selecting from the library as an organization content library. For example, I edited a modern site page and added a modern image viewer web part. When the add image action brings up a selection dialog you’ll notice a new category on the left, “Your organization.” Select that category and your organization asset libraries will be shown in tiles. (Note, that if you had thought ahead and come up with a snazzy graphic to represent your library, you could have included the
-ThumbnailUrl argument to the asset library creation cmdlet and your tile wouldn’t look as lame as this one. All is not lost if you didn’t, you can always go back and use
Set-SPOOrganizationAssetsLibrary cmdlet to add or change the thumbnail.)
Once you select the library tile and then an image within it, your work is done. The image will eventually be served not from your SharePoint on-line tenant but from the CDN.
For reasons I have not unwound yet, it may take some time. When I first checked my test page, the img tag’s src still disappointingly pointed to the library in my tenant. A day or two later though, and it looked like the below, specifying the privatecd.sharepointonline.com as the image source. Neat.
So now I’ve got my SharePoint tenant happily pushing content out to a CDN and users consuming it from the CDN and all I did was run a cmdlet. That really is pretty low effort considering the potential returns. One curious thing though. After going through all that, my tenant’s CDN status still looks like…
Odd. Presumably the CDN setup for organization asset libraries uses some other mechanism. Know the details? I’d glad to see them in the comments.
The GetItems action in the SharePoint connector for Flow is of course terribly useful. In response to any number of triggers you might want to comb through items in a list and kick off other actions based on what you find. It’s all good. But…
SharePoint lists can contain a lot of items. Most of the time you’re probably only interested in examining a few or even just one. It seems a waste t drag the whole list into Flow and then pick up and examine each item to see if it’s one you’re interested in at the moment. Luckily, you don’t have to.
I’ll use a calendar in one of my team’s sites as an example. The one in the production environment has been around for years and has thousands of items. (Oh I’ve tried to sneak in and delete all the old ones but somebody always wails that they’re needed for “archival” reasons and they have to stay.)
I want to look for a particular kind of event that should start at noon on Fridays. The events will be multi-day recording when people go on-call. I’m going to be a bit more flexible than that and check every day of the week because odd things can happen when people start trading around on-call times. The upshot is, on any day when the Flow fires, I only need to look at events that start in a 24 hour interval around when the Flow fires, the thousands of other events are irrelevant and don’t need to be pulled into Flow.
The first thing I see when I add a GetItems action is this.
The site address is simple. Then I just drop down the selection of lists and… the calendar is not there. Don’t panic. Calendars just don’t happen to be amongst the list types that Flow offers you in this list. All you need to do is choose “Enter custom value” and then type out the name of the calendar list, in my case “Calendar”.
If I wanted to look through all items, I’d be done, but I don’t. As usual, all the fun is under “Show advanced options”. Click that link and we see more things to play with.
The Filter Query field looks exactly like what I’m looking for. So what do I put in it? The background text in the empty field is a huge clue, it wants an ODATA format query. Fortunately, this is exactly what you would provide if you were using a REST query to gather data from the list, so there’s loads of examples out there.
I’ll want to base my query on the Start Time. Experience SharePoint users will already know that Start Time really goes by its secret name of EventDate, so that’s what you’ll see here. (Experienced users may also recall that calendar item start and end times are notoriously unindexed properties and usually prove to be useless for any extra work you might ask of them. Though fully prepared to be disappointed I found that they work fine in this instance.)
My first guess of what a query might look like is this:
As usual with my first guess, it’s wrong. Run the flow with this and I get a cryptic error. The difficulty is that the utcNow() function is handing back the now in string form. We want it back in date-time form to compare against the EventDate. The secret formula for that is DateTime’<string-form-of-datetime>’. So:
This would be a query against a static datetime. Trying this out works fine. Brilliant. Now I want to start seriously narrowing down my list of results. I plan to run this flow at noon every day. I’ll have it look for all events on the calendar that start from twelve hours ago to twelve hours ahead. Step one looks like:
I’ve typed in “EventDate gt DateTime’” and then used the expression builder to insert addHours(utcNow(),-12). Add the final apostrophe to close the string and the query is ready to try. Piping the results to an HTML table builder and e-mailing myself the output I get the expected result set.
Sooper, almost there. All that’s needed now is to bound the upper end. It should hopefully be obvious by now that the final query looks like the following. Once again, the expression builder is used to create the addHours(utcNow(),12). Running this query gets all the events starting from 12 hours ago to 12 hours in the future, in this case just one. Much easier to process than the thousands of items milling around the calendar list.
The whole query
Now that I have my very small set of events, they’re all ready to be processed. That’s a subject for another post however. All I wanted to do here is to illustrate how to drastically limit how much junk you have to sort through in Flow.
Now for a little side trip into Windows 10 settings. When the sync settings feature first came out, I activated it almost immediately. I have more than a couple devices running Windows 10 and I thought it would be convenient if they all shared most of my settings. Worked great. Until I’m not sure how long ago.
I finally noticed that things weren’t getting synced across my devices, went into the settings app to double-check and found this note: “Sync is not available for your account. Contact your system administrator to resolve this.”
First of all, I adore these little notes. This is on my personal machine and I run all the networks it talks to so, “system administrator” would be me and I’m pretty sure I didn’t do anything to cause this. Wouldn’t it be nice if whenever one of these “see your system administrator” notices cropped up it included a link to a useful article said system administrators could follow to get a glimmer of a clue what the Sam Hill is going on?
Failing that, I asked the web. I found a lot of long threads on this, few to the point. (Hence this post which I hope will provide a public service in this area.) Some contained advice that a reset reinstall be done from recovery. Bad idea. From a couple buried postings and some experiments I figured out that it was my fault, though it was something I did while acting as a user, not as an administrator.
The problem is that I have an Office 365 tenant of my own and I’ve associated my Office 365 ID with my Windows 10 account on this device. You can tell if you’ve done this by looking at your account settings.
Under the access work or school section, you’ll see any linked accounts listed. I have just the one, but that’s enough. As soon as you associate a work or school account with your Windows 10 account, the sync settings toggle is disabled.
If you think about it for a moment, this makes sense. Sync settings is taking a fair amount of potentially sensitive information and tucking it away not in the enterprise managed space, but in your personal Microsoft account’s OneDrive, where the work or school administrators can’t be responsible for it. So yeah, I understand.
But in this case, everything’s mine and I should be allowed, as the Office 365 tenant administrator to change the policy, right? Sort of. (Or in my case, no.)
As I suspected, there is indeed a setting for this, unsurprisingly in the Azure AD admin center. Under devices, device settings, near the bottom we find exactly what we’re looking for (or at least when I did while I was at the office poking through our much bigger, stronger tenant).
Bliss! It’s controllable and all’s right with the world. When I looked at my own version of the Azure AD I found this.
I, with my mere Business Essentials license tier do not rate this one additional control on my Azure AD settings page. Great sadness. But at least now I know that it can be fixed in theory and how I can fix it in practice (disassociate my Office 365 account from my Windows 10 account) if I feel that I really really need to sync settings.
Now you know.
I started playing around with Microsoft’s On-premises Gateway today. (If you somehow got here without knowing what that is, it’s the way that cloud based services like Logic Apps, PowerApps, Flow etc. can make use of data that live in your on-premises servers such as SQL or SharePoint.) As usual I began by looking for some how-to-get-started articles.
Setting up the gateway, it turns out, is one of the simpler bits of service setup you’re ever likely to do. There’s a nice straightforward explanation of the whole process here.
So, with a few minutes effort I have my gateway setup and logged in. It happily shows that PowerApps and Flow are ready to go with it. Oooookay, so how do I get to my data from, say, Flow? That’s where I found the documentation gap. This may be because it’s just not that hard. Here’s what the process looks like.
And now you’re ready to go. To continue with the SharePoint example, you’ll have to provide a site URL. The gateway is not going to pillage your LAN for SharePoint sites, so you have to choose to provide a custom value and type in the full URL of the site you want to work with. Once you’ve done that, the connector will go ahead and fill in the next drop down to available lists etc.
At this point, it’s all very much like working with one of you SharePoint sites in Office 365. Once the connection is in place and the site identified, everything should feel quite familiar.
That’s all I have for today. Enjoy integrating your local resources into Flow.
I’ve got some reading/video watching to catch up on.
More to come…
Office365 has supported multi-factor/two-factor/modern authentication for some time now. Loud cheers all around. It’s my understanding that tenants spun up relatively recently are fully configured for all services to take advantage of this capability. Older ones, mine for instance being some three plus years old, may require a bit of work to get ready.
Once you activate modern authentication for a user, you’ll find that nearly all services are ready from the start. What works?
- All web applications
- Outlook and Office apps from a mobile device
(I was testing from iOS)
- Office desktop apps with ONE BIG EXCEPTION
(I use the up-to-date Office365 versions)
- The modern UI mail app in Windows 10
Sounds great. So what doesn’t work?
- Outlook on the desktop
- Skype for Business desktop client
It’s not Outlook or the Skype for Business client’s fault. The applications themselves don’t need any work. What’s out of whack are some obscure settings in the Office365 tenant configuration. Of old, Exchange and Skype for Business services were not setup to expect multi-factor authentication.
Enable Exchange for Modern Authentication
Ideally there would be a nice little checkbox control in the Exchange online admin console to fix this, but there isn’t. Still, the fundamental work of updating the Exchange service for modern authentication could hardly be simpler. Just connect a PowerShell session (see below) and run the command:
Set-OrganizationConfig -OAuth2ClientProfileEnabled $true
If you’ve never used PowerShell with Exchange online, you’ll first need to install the Exchange online PowerShell Module, which can be found in your Exchange Admin Center. Click on Setup under the Hybrid section and then look for the configure button that will download the PowerShell module.
If you’ve not enabled multifactor authentication on you administration account yet, you can then follow the instructions here to open a PowerShell session with Exchange online.
If, on the other hand, you rushed ahead and required modern authentication for the admin account, you’re still OK, just follow these instructions to open a PowerShell session using MFA.
Enable Modern Authentication on Skype for Business
Once again, there’s no simple box you can tick in the admin center to adjust this setting. It’s back to PowerShell. Now there may be a way to do this once you’ve already turned MFA on, but if so I haven’t found it. I had to either turn MFA off on my tenant admin account, or create another one without it just for the job.
First, make sure you have the required module imported into PowerShell:
Next create a credential using your admin account and open the session.
$cred = Get-Credential
$session = New-CsOnlineSession –Credential $cred
Then, update the setting.
Set-CsOAuthConfiguration –ClientAdalAuthOverride Allowed
And you’re done.
Now Outlook and the Skype for Business client will both be perfectly happy to log you into their respective services on your Office365.
Enjoy! And keep that old tenant going.
You’ve stood up a brand-new Office Online Server, told your SharePoint farm all about it, navigated to your favorite document library and, with great anticipation, clicked on an Office document. It then opens in the desktop app just the same as it ever did.
Undeterred, you create an immaculate new document as yet untouched by SharePoint, and the same thing happens.
With a sinking feeling, you create a shiny new document library, and observe precisely the same behavior. What’s wrong?
If you look in nearly any document library’s settings, click on the “Advanced Settings” link and direct your attention to about the middle of the page, you’ll observe a section entitled “Default open behavior for browser-enabled documents:”. It probably looks a lot like this.
Aha! This is clearly not what you want. You could choose the “Open in the browser” option, but then you’d have to do that for every document library you can find. What you really want is for this section to look more like the below, where the server default is to open in the browser.
So, it’s the server default that needs fixing. Where do you do that?
You might think of wandering over to Central Admin and perusing the general server settings. This would not be terribly productive though. The trap here is in believing the words ‘server default’. This phrase is not entirely accurate. What it should read is ‘site collection default’.
That’s right, it’s a site collection property.
To make the change, first make sure you’re a site collection administrator and then that you are looking at the top-level site for the site collection.
- Click on the gear icon.
- Choose “Site settings”.
- Within the Site Collection Administration section, click on the “Site collection features” link.
- Scroll down until you see the “Open Documents in Client Application by Default” feature. It’s active and needs to not be.
- Click on the “Deactivate” button.
- You may get a warning about dire consequences to dependent settings. You can’t get where you’re going without OKing the change so read any warning carefully and ensure you’re ready to accept the consequences before going on. (I encountered no difficulties by the way.)
And that’s that. The default for your document libraries will now be to open any compatible documents using OOS instead of the desktop applications.
For what it’s worth, I’ve found that the web applications typically come up much faster than the desktop client applications.
On not infrequent occasions a requirement comes up to have one or more form fields’ already set when a user creates a new list item. Out-of-the box, SharePoint handles simple, fixed default values just fine. When you create a new column, you can assign the default value for it and be done with it. It’s not difficult to imagine situations where one or more values for a new record are known before it’s created and we don’t want, or perhaps even trust, the users to have to enter these values themselves.
A Sample List
I created a simple custom list to use as an example case for this post. I’ve added three columns for a total of four: “Title”, “Customer”, “Contact”, and “Reason”. All of these are single lines of text.
Let’s imagine that the most common way we’re going to create new records in our web application is from a list of customers. We’ll plan to bring the customer name across in the query field. Let’s also say that the “Title” field is to be used only as a unique ID. We’ll generate one and pre-fill the field. It’s not the user’s job to come up with one.
Create a Custom Form
Now that we have our list, the first step is to open up SharePoint Designer and use it to generate a custom new item form.
- Open the site containing the list in SharePoint Designer.
- Choose “Lists and Libraries” from the site objects list.
- Click on the list.
- Within the forms pane press the “New…” button and create a custom new item form. We’ll call it NewFromCustomerForm.aspx.
Find the Element IDs
And now we edit the form, right? No. We do not. We first need to know the IDs within the DOM of the two controls we wish to pre-populate. Unfortunately, nothing in the form source code is going to tell you what those will be. We have to bring the form up in IE and see what’s actually generated when the page is served.
- Open IE, or Edge if you’re on Windows 10 or better, and point it at the new form we just generated. In my case this is at https://spsdev/sites/SiteDesign/Lists/Custom%20Forms/NewFromCustomerForm.aspx. At the moment it looks just like the default new item form which I suppose shouldn’t be all that surprising.
- Pres F12 to bring up the developer tools and make sure the “DOM Explorer” tab is selected. You can also find the developer tools from the browsers “Tools” menu. Type Ctrl-B or click on the select element icon at the left of the DOM explorer’s tool bar.
- Click inside the text entry field for the title. The XHTML markup for the field will be highlighted in the developer tools panel.
- Double-click on the value of the id attribute and copy the ID using Ctrl-C.
- Paste this ID with a note specifying that it’s the ID of the title’s entry field in some document on the side. I always have OneNote handy so that’s what I usually use but Notepad, Word or any other text editor will do.
- Repeat this process with the customer entry field and make a note of its ID as well.
Now we’re ready to edit the custom new item form.
Back to SharePoint Designer, select the custom form we just looked at in the browser by clicking on its name.
This will open the form in the code editor. (If prompted, choose to edit the file in advanced mode.) Give SharePoint Designer a moment or two to make sense of the file’s contents. It doesn’t like to be rushed. Once it’s settled down, look for the place in the file where the entry fields we’re interested in are. Searching for one of the column names, “Customer” for example, should get us there.
01: <td width="400px" valign="top" class="ms-formbody">
15: function preSetFieldValues()
17: var field = document.getElementById("ctl00_ctl39_g_83dcf5c9_5a7f_4d93_a423_2bb39a16e74b_ff11_ctl00_ctl00_TextField");
18: field.value = "CONTACT" + (new Date().getTime());
19: field.readOnly = true;
21: field = document.getElementById("ctl00_ctl39_g_83dcf5c9_5a7f_4d93_a423_2bb39a16e74b_ff21_ctl00_ctl00_TextField");
22: var exp = new RegExp("[\\?&]Customer=([^&#]*)");
23: var matches = exp.exec(window.location.href);
24: if ( matches == null )
26: field.value = "";
31: field.value = matches;
32: field.readOnly = true;
34: field = document.getElementById("ctl00_ctl39_g_83dcf5c9_5a7f_4d93_a423_2bb39a16e74b_ff31_ctl00_ctl00_TextField");
Line by line
- Lines 1-13: These are all parts of the original form, the two elements define the label and text entry field for the customer attribute.
- Line 14 is the first of the lines of code we’ve inserted. This opens a script block. You may get a syntax warning about including a script block inside a element. Ignore it. It will work fine.
- In line 15 we begin the definition of the
preSetFieldValues()function. Instead of just doing all this work in-line we’re wrapping it up in a function. You’ll see why in a little bit.
- Line 17 is where we extract the element of the DOM that represents the title text entry field using the ID we found using IE’s developer tools earlier.
- Line 18 sets the title’s value to a value that will be used internally.
- Line 19 makes the title field read-only. It may be that you want to pre-populate merely suggested values for fields in which case you won’t use this step. Me? I’m not going to all this trouble simply to have some user have his way with things so read-only it is.
- Line 20 removes the input focus from the now read-only field.
- In line 21 we’re getting ready to work with the text entry field for the customer attribute. Once again we look it up in the DOM using the ID we found earlier.
- Lines 22 & 23 create a regular expression to match the value following the query parameter ‘Customer=’ and then applies that expression to the page’s URI. If there is a value for the Customer parameter, it will be in
- Line 24 checks to see whether or not we got a match back on the Customer parameter. If not, lines 26 & 27 will ensure that the customer text entry field is blank and that the input focus is on that field.
- If a match was found, lines 31-33 set the value of the entry field to the value provided. [Note, I’m being lazy here. To be really robust the match should be URL decoded but I’m leaving that out of this example to reduce clutter.] The field is then set read-only like before and the focus removed from it should it have somehow ended up with it.
- Lines 34 & 35 ensure that the input focus ends up someplace sensible after all these machinations. We look up the contact text entry field using yet another ID found using IE’s developer tools and then give that field the focus. [What’s that you say? I didn’t mention finding that field’s ID earlier? Well I didn’t mention it but I did it none the less. Deal with it.]
- That wraps up the
preSetFieldValues()function. The question is when does all this code actually run? We don’t want it running before all the entities it operates on are closed parts of the page model. Fortunately there’s a mechanism built-in that will let us fire this code off after the page has finished loading. Line 38 pushes the name of our function onto the
_spBodyOnLoadFunctionNamesstack. The SharePoint framework will ensure that it’s run when everything’s ready.
Give it a Go
We’re all ready to test. Pointing the browser at https://spsdev/sites/SiteDesign/Lists/Custom%20Forms/NewFromCustomerForm.aspx?Customer=ConhugeCo we see our form come up looking like this.
Everything looks good. The first two fields are pre-populated with the expected values and the input focus is on the 3rd field. A quick test shows that we can’t change the values of the title or customer fields. This is all good so far.
If we then strip the query from the page URL and try again we’ll see that the customer field is blank and editable and that the input cursor is already there. We can start typing in the customer name.
So there we have it, a SharePoint form with some intelligent pre-populating of input fields. It’s a bit of a journey but once you’ve done it once or twice it actually takes very little time to perform these sorts of customizations. Go fire up SharePoint Designer (On a test/development site!) and have fun.
So you’ve got a Microsoft account. Maybe you created it when you set up your new Windows 8.1 laptop or perhaps somebody shared a OneNote notebook with you and you set up an ID to access it. Now you’ve realized that you also have 15GB of free storage tied to it that aren’t doing anything and you want to put them to use.
The simplest way is to point your favorite browser at
https://onedrive.live.com/ and use the web interface. Create folders, documents, upload files, view items that others have shared with you; go crazy. But wouldn’t it be handy to be able to look at your OneDrive files like a boring old folder in the Windows Explorer window just like DropBox users can do?
One of Two OneDrives
First let’s clarify that we’re talking about OneDrive as opposed to OneDrive for Business (which by my count makes TwoDrives). This is the more consumer oriented service that’s associated with Microsoft IDs. For this service, if you’re using Windows 8 or better, you’re already all set to go. Just click on the little OneDrive cloud in Windows Explorer, tell it about your Microsoft ID if you haven’t yet and your OneDrive files will be there just like they were right on your laptop. (In fact depending on your choices, the system will probably synchronize local copies of many of them so they actually
will be on your laptop.)
If you’re still using Windows 7, and the strong hints from Microsoft that it’s time to let go and move on are having no impact on you, then you will need to install additional software to make your OneDrive show up in Windows Explorer. Head to
https://onedrive.live.com/about/en-us/download/ and download the Windows 7 & 8 application for OneDrive, it’ll be the one on the left. Once installed, the OneDrive cloud will show up in the explorer window just like it does on Windows 8.1. Just bring it up-to-speed with your Microsoft account credentials and you’ll be in business. Oh wait, business is for the
OneDrive for Business
What most of the great public user community is unaware of, and what the remainder of the same community is frequently confused by, is that there are two OneDrives. (I know right?) The other is qualified with the words “for Business”. This version of OneDrive is the descendant of the old SharePoint MySite document libraries. However, it can be used to synchronize a copy of just about any SharePoint library and make it available through the explorer window just like a local folder.
The OneDrive for Business application is not included in Windows 7, 8, 8.1 out of the box. If you’re a SharePoint/Office 365 user and you want this capability, you’ll have to add the software. Look once again at
https://onedrive.live.com/about/en-us/download/ only glance to the right this time. Download the OneDrive for Business application and install it. You’ll have to provide the URL of your personal site along with your SharePoint credentials. Then you’ll have a 2nd little blue cloud that you can use to work directly with your cloud based files.
(Curiously, while you have two blue clouds in your explorer window now, you’ll have two different colored clouds in the task bar; white for OneDrive and blue for OneDrive for Business.
There’s more fun to be had with OneDrive for Business if you haven’t had too much excitement already. As mentioned, you can use it to synchronize local copies of other SharePoint libraries. Just right-click on its taskbar icon and choose the “Sync a new library” option. Provide the URL for the SharePoint library and it will start bringing down copies. You’ll also get yet another icon in your explorer view; a tiny SharePoint logo instead of a cloud. It gets the idea across.
That’s about all there is to making the cloud look local. Have other useful tips about how these applications can be used to make life easier, do pass them on.
WP Central has out on YouTube a brief, 11 minutes, review of the Surface Pro 3. The overall verdict is positive with the reviewer really liking it but thinking, probably primarily due to the less than budget conscious pricing, that it’s possibly not for everybody.
Due attention given to the high quality of the hardware and construction with the build quality being described as “top notch”. Other physical aspects of the Surface Pro 3 got similar favorable mentions. The low reflective screen, the variable position kickstand, the improved touchpad on the type cover all impressed the reviewer. Only the cameras, at a now low-end 5 megapixels, received faint praise.
The pen looks much improved. It’s a much more substantial item and looks like it would have a much better hand feel than thin plastic stylus that came with my Surface Pro way back when. The only problem mentioned is that the pen’s dimensions, thicker than the tablet, leaves open the question of what to do with it. Microsoft have provided a loop on the side of the type cover which is a slightly awkward looking but workable solution.
One feature he pointed out that I’ve also seen in Microsoft videos is the short cut on the pen that will power on the tablet and open a OneNote quick notes page ready to write on. This look like a cool feature that I’d love to have.
On the subject of performance, the Surface Pro 3 fares well, which won’t surprise anybody familiar with earlier entries in the product line. The model used by the reviewer was i5 based as the i3 and i7 models were not available by the time the review went to press… tape, er… micro-SD? The essential take-away is that the Surface Pro 3 is a professional grade computer that will do most everything you might ask it to.
The subject of will it replace your laptop? (Microsoft’s tag line for the Surface Pro 3) the reviewer compared to his own laptop; a heavy duty quad HD, i7 model with 16GB of RAM, 512GB HDD space, 6 USB ports and a 7-8 hour battery capacity. This is a bit like my asking if my capable but prosaic work laptop can replace my Alienware Aurora desk top (it can’t). Could the Surface Pro 3 replace my laptop? Given that the Surface Pro already can, the Surface Pro 3 could do so, easily.
The reviewer’s summary is the Surface Pro 3 is a well-made, highly capable computer in a tablet format. It’s a premium device and priced accordingly. But, if you can afford it, get one.