<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="https://www.w3.org/2005/Atom" xmlns:sy="https://purl.org/rss/1.0/modules/syndication/" xmlns:dc="https://purl.org/dc/elements/1.1/" xmlns:content="https://purl.org/rss/1.0/modules/content/" xmlns:wfw="https://wellformedweb.org/CommentAPI/" xmlns:slash="https://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>JohnShew's Blog</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/johnshews_blog/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/johnshews_blog/feed.xml</link>
    <description />
    <lastBuildDate>Wed, 17 Apr 2019 03:21:46 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>Cloud Foundry and //Build</title>
      <link>https://docs.microsoft.com/archive/blogs/johnshews_blog/cloud-foundry-and-build</link>
      <pubDate>Mon, 04 Apr 2016 17:55:53 GMT</pubDate>
      <dc:creator><![CDATA[John_Shewchuk]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/johnshews_blog/?p=353</guid>
      <description><![CDATA[Last week at Microsoft's annual //Build developer conference, I partnered with Rita Zhang to...]]></description>
      <content:encoded><![CDATA[Last week at Microsoft's annual //Build developer conference, I partnered with Rita Zhang to demonstrate Pivotal Cloud Foundry on Azure. <a href="https://www.cloudfoundry.org/">Cloud Foundry</a> is an open source  platform as a service (PaaS) technology that makes it easier for large companies to move to the cloud by first supporting deployment to the private cloud and then when they are ready transitioning to the public cloud. For large companies like Ford, the ease of use of Cloud Foundry makes it easier to move to Azure. Data sits in a variety of locations, and in a cloud agnostic world it is key that developers can access it without writing vendor-specific code. 

Rita has helped to develop an S3 proxy, that supports getting data from both AWS S3 and Azure Storage from a single code base in Cloud Foundry. The <a href="https://github.com/andrewgaul/s3proxy">S3Proxy</a> solution can be hosted as a standalone Jetty application. In this scenario, the S3Proxy solution is deployed, managed, and scaled as its <a href="https://github.com/ritazh/s3proxydocker">own application in Cloud Foundry </a> so more apps can leverage it. Some users will use Cloud Foundry to adopt the cloud for the first time, and in these cases the developer can bypass the S3Proxy and use the Azure storage SDK directly in their new application.

<a href="https://msdnshared.blob.core.windows.net/media/2016/04/CloudFoundry.png"><img src="https://msdnshared.blob.core.windows.net/media/2016/04/CloudFoundry-300x158.png" alt="CloudFoundry" width="300" height="158" class="alignnone size-medium wp-image-363" /></a>

The S3Proxy allows applications using the S3 API to access other storage back-ends, e.g., local file system, Google Cloud Storage, Microsoft Azure, OpenStack Swift. <a href="https://github.com/ritazh/azure-s3proxy-cf-demo/blob/master/README.md">This</a> application demonstrates how a user can setup S3Proxy in Cloud Foundry to use the same code base to get content from both AWS S3 and Azure Storage.]]></content:encoded>
    </item>
    <item>
      <title>Highspot, Manifold and Vorlon</title>
      <link>https://docs.microsoft.com/archive/blogs/johnshews_blog/highspot-manifold-and-vorlon</link>
      <pubDate>Thu, 31 Mar 2016 11:00:54 GMT</pubDate>
      <dc:creator><![CDATA[John_Shewchuk]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/johnshews_blog/?p=284</guid>
      <description><![CDATA[I just wrapped up the last keynote here at //build/.  It was super fun. There is so much new...]]></description>
      <content:encoded><![CDATA[I just wrapped up the last keynote here at //build/.  It was super fun. There is so much new technology that will help you build great next-generation applications. But there’s just too much to drill into in one blog post. So, like we did last year, we will take a look at each major coding demo in a series of posts – starting with this one. 

We highlight a great partner and startup – <a href="https://www.highspot.com/">Highspot</a>.  Highspot provides a solution for sales and marketing teams to track documents – like PowerPoint - that they send around to customers. As Highspot was getting started, like many startups they built key parts of their application on Amazon Web Services. But a very interesting thing happened recently. They decided that it was critical to meet customers where they are and one of those critical places is in Office. So they became an Office cloud storage provider - you can read more about that in their words<a href="https://www.microsoft.com/developerblog/highspots-bet-on-the-microsoft-platform-pays-huge-dividends/"> here</a>. That started a deeper set of integrations. 

Onstage I showed what they are working on now. In addition to embedding PowerBI into their app to enable self-service and custom reporting, they’re also building a set of Office Add-ins that connect their system with the Office apps that their customers use every day.  One of the channels Highspot uses to expose data to its users is the Office Add-in.  We showed how the latest generation of Office Add-ins are actually web apps that run inside Office.  And Office runs on many different platforms, so your web app needs to as well.  It’s another great opportunity for web developers, Let’s take a quick look at how this works.

Here is The Highspot Web app running in the browser. 
<a href="https://msdnshared.blob.core.windows.net/media/2016/03/Highspot-in-browser-build16.png"><img src="https://msdnshared.blob.core.windows.net/media/2016/03/Highspot-in-browser-build16-300x158.png" alt="Highspot in browser build16" width="300" height="158" class="alignnone size-medium wp-image-343" /></a>

Last year we talked about using <a href="https://manifoldjs.com/">Manifold.js</a> to build cross-platform store apps from your web app, all based off the W3C Manifest for web apps.  If you have used Manifold.js to build web apps for other platforms, you’ll be excited to see that now it builds office add-ins as well.
In the command window simply type: 
<code>manifoldjs https://addin.highspot.com -p office</code>

You will substitute out your URL for “addin.highspot.com” and that builds out the office add-in. Manifold.js produces an app that can be tested and deployed for Office from any platform. And we can test it right away in an Office web app.
 
<a href="https://msdnshared.blob.core.windows.net/media/2016/03/blogPic1.png"><img src="https://msdnshared.blob.core.windows.net/media/2016/03/blogPic1-300x200.png" alt="OfficeAddIn" width="300" height="200" class="alignnone size-medium wp-image-293" /></a>

This works by generating an Office manifold.
Sounds awesome right.  Well it’s very easy to get this all working. However, in practice it can be challenging to deploy and debug these solutions on a bunch of different platforms. So we announced that <a href="https://vorlonjs.com/">Vorlon.js</a> has just added support for debugging Office Add-ins now too. 

In the example I showed onstage, the add-In was connected with my Vorlon server (which can be executed on Azure or locally). Vorlon lets me see this across all the different platforms.  In this case Office desktop and Office for iPad
 <a href="https://msdnshared.blob.core.windows.net/media/2016/03/blogPic2.png"><img src="https://msdnshared.blob.core.windows.net/media/2016/03/blogPic2-300x200.png" alt="Vorlon" width="300" height="200" class="alignnone size-medium wp-image-303" /></a>
We love developing Open Source community-based tools like Manifold.js and Vorlon.js so partners like Highspot, and developers like you have the tools to easily build and debug for Office or add-ins on many platforms.

We’ll continue to drill into other technology scenarios covered in the keynote over the coming days. 
]]></content:encoded>
    </item>
    <item>
      <title>A Minimal MVVM UWP App</title>
      <link>https://docs.microsoft.com/archive/blogs/johnshews_blog/a-minimal-mvvm-uwp-app</link>
      <pubDate>Wed, 09 Sep 2015 14:16:00 GMT</pubDate>
      <dc:creator><![CDATA[John_Shewchuk]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/johnshews_blog/2015/09/09/a-minimal-mvvm-uwp-app/</guid>
      <description><![CDATA[With the introduction of Win 10 and Universal Windows apps I wanted to try out some of the new XAML...]]></description>
      <content:encoded><![CDATA[<p><span style="font-family: Calibri; font-size: small;">With the introduction of Win 10 and Universal Windows apps I wanted to try out some of the new XAML features like compile-time binding with x:Bind. </span></p>
<p><span style="font-family: Calibri; font-size: small;">I started by looking for a very simple Universal Windows Platform (UWP) sample that showed how to build an MVVM app with create, read, update, and delete (CRUD) operations over some data source.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">Surprisingly, I really didn&rsquo;t find anything specific for UWPs.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">Of course there are many samples for WPF but they required a rewrite for UWP and they don&rsquo;t leverage the new XAML capabilities making them more complicated than necessary. Similarly the core UWP XAML samples don&rsquo;t show how to do CRUD and while they covered new capabilities they include a lot of unrelated stuff that makes them less useful as a starting point for your own apps.</span></p>
<p><span style="font-family: Calibri; font-size: small;">So I thought it would be interesting to see how simple we could make an MVVM UWP example and still support full CRUD.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">As you can see below the ViewModel for the resulting app is less than 100 lines of code &ndash; which is pretty reasonable since we need to cover all the corner cases associated with adds, updates, and deletes &ndash; and get those connected to the data layer. </span><span style="font-family: Calibri; font-size: small;">&nbsp;</span><span style="font-family: Calibri; font-size: small;">The XAML View is also simple &ndash; only 25 lines of XAML and no code behind other than initialization.</span></p>
<p><span style="font-family: Calibri; font-size: small;">If you work through this example, you can see how it uses the new x:Bind capability. Creating and debugging bindings in XAML has previously been a little touchy but now with x:Bind you get typesafe code at compile-time which makes it easier to get the bindings right and they run faster. </span><span style="font-family: Calibri; font-size: small;">&nbsp;</span><span style="font-family: Calibri; font-size: small;">In addition the new x:Bind event capability reduces the complexity of implementing operations on the ViewModel.</span></p>
<h1><span style="color: #2e74b5; font-family: Calibri Light;">Why MVVM?</span></h1>
<p><span style="font-family: Calibri; font-size: small;">Before we look at the code, I wanted to touch on whether it is worth the effort to use an approach like MVVM (Model, View, ViewModel).</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">The basics of MVVM are pretty simple&hellip;</span></p>
<p><strong><em><span style="font-family: Calibri; font-size: small;">Model</span></em></strong><span style="font-family: Calibri; font-size: small;">.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">Think of the models as the business objects.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">A Model should know about nothing about the user experience - specifically the View or how it is implemented using a ViewModel.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">The Model only interact with system and data services.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span></p>
<p><strong><em><span style="font-family: Calibri; font-size: small;">ViewModel</span></em></strong><span style="font-family: Calibri; font-size: small;">. </span><span style="font-family: Calibri; font-size: small;">&nbsp;</span><span style="font-family: Calibri; font-size: small;">The ViewModel is where you encapsulate any code or data that your UX or View will need.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">It is important that ViewModel only knows about and encapsulates the Model &ndash; but it shouldn&rsquo;t be responsible for any Business Logic or Business Constraints &ndash; that should all be in the model. And on the other side, the ViewModel should know nothing about the specifics of the Views and UX that use it.</span></p>
<p><strong><em><span style="font-family: Calibri; font-size: small;">View</span></em></strong><span style="font-family: Calibri; font-size: small;">.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">This is where you create the user experience &ndash; in Windows apps you do this declaratively with XAML markup language and design tools.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">The View uses properties and actions on the ViewModel to get the job done.</span></p>
<p><span style="font-family: Calibri; font-size: small;">Since the MVVM approach is so conceptually simple, why do a lot of people get frustrated with it?</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">One challenge was that historically the approach was fairly opinionated requiring base classes like DependencyObject and implementations often required a lot of coding to do simple things like connecting up a command to XAML.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">Another challenge was that a lot of developers felt that execution overhead of runtime bindings &ndash; and challenges debugging runtime bindings &ndash; ultimately&nbsp;led them&nbsp;to abandon binding and simply do imperative code to implement the UX.</span></p>
<p><span style="font-family: Calibri; font-size: small;">With Windows 10 and Visual Studio 2015 many of the challenges have been addressed. As you can see we can now easily build an MVVM app using compile-time bindings that eliminates runtime overhead and reduces the likelihood you will need to debug bindings at runtime. We also show how x:Bind to methods means we don&rsquo;t need to implement Commands and we show how&nbsp;two new C# language features [CallerMemberName] and nameof can help make it easier to implement INotificationPropertyChanged.</span></p>
<p><span style="font-family: Calibri; font-size: small;">MVVM was already a well-proven approach that has been used to build many sophisticated and great performing apps and now with these new capabilities MVVM is more approachable than ever.</span></p>
<h1><span style="color: #2e74b5; font-family: Calibri Light;">An Overview of the App </span></h1>
<p><span style="font-family: Calibri; font-size: small;">One of the key goals was to keep this example as simple as possible. But we also want the example to represent what a developer would actually need to do to build an app using MVVM. And getting all the CRUD operations in place over a real world database or other system isn&rsquo;t trivial. So here is how we approach this.</span></p>
<p><span style="font-family: Calibri; font-size: small;">At the core of the app is a Business Object &ndash; our Model.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">It is called Organization.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">It is just an in-memory &ldquo;database&rdquo; of People objects and an organization Name.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">The People collection is just a list where each Person has a Name and Age. </span></p>
<p><span style="font-family: Calibri; font-size: small;">In terms of implementing the model we leverage some scaffolding code that implements a fake data service that pretends to communicate with a cloud service to manage the&nbsp;data &ndash; but here our stubbed out service runs locally and just prints messages for debugging / logging purposes.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">Again, the only reason to do this is so we have a realistic sense of what would be involved with building this over real world data and business objects.</span></p>
<p><span style="font-family: Calibri; font-size: small;">In terms of the user experience all we need is a View that shows the list of people in the Organization and enables the user to Add or Delete People, or Update their Name and Age properties &ndash; nothing complicated.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">Our View is written entirely in XAML with no code behind other than initializing the ViewModel.</span></p>
<p><span style="font-family: Calibri; font-size: small;">Most of code in the sample is focused on building the ViewModel for the Organization business object. The OrganizationViewModel keeps track of a collection of People that is kept in sync with the model. It also keeps track of a SelectedPersonIndex from the collection of people so the View can perform edit and delete operations on the current selection.</span></p>
<p><span style="font-family: Calibri; font-size: small;">All the code can be found here on </span><span style="font-family: Calibri; font-size: small;"><a title="github" href="https://github.com/johnshew/Minimal-UWP-MVVM-CRUD">GitHub</a></span><span style="font-family: Calibri; font-size: small;">.</span></p>
<h1><span style="color: #2e74b5; font-family: Calibri Light;">Building the App &ndash; A Walkthrough using Visual Studio 15</span></h1>
<p><span style="font-family: Calibri; font-size: small;">Building this app will consist of the following steps:</span></p>
<ol>
<li>
<p>Create the project</p>
</li>
<li>
<p>Set up the Data layer.&nbsp; Here will use an existing FakeService that simulates HTTP operations on a cloud service.</p>
</li>
<li>
<p>Build the Models.&nbsp; This is the Organization class.&nbsp; It will use the FakeService.</p>
</li>
<li>
<p>Build the ViewModels.&nbsp; This is the OrganizationViewModel that will point to an Organization and provide both state and actions to the Views.</p>
</li>
<li>
<p>Build the View.&nbsp; We simply modify the MainPage.xaml file to add a list, a couple of edits fields, and a couple of buttons.&nbsp; Then we will use x:Bind to attach these controls to ViewModel.</p>
</li>
</ol>
<h1><span style="color: #2e74b5; font-family: Calibri Light;">Step 1: Create the Project</span></h1>
<p><span style="font-family: Calibri; font-size: small;">In Visual Studio 15 close any open solutions and then create a new project.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">Select Blank App (Universal Windows) and name your project.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">FWIW, I recommend checking source code management and using GIT as it comes in handy as you make changes to your project and later want to publish it.</span></p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/59/45/0334.Picture1.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-59-45/0334.Picture1.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/59/45/0334.Picture1.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-59-45/0334.Picture1.png" alt="" border="0" /></a></p>
<p>&nbsp;</p>
<h1><span style="color: #2e74b5; font-family: Calibri Light;">Step 2: Create the Data Layer</span></h1>
<p><span style="font-family: Calibri; font-size: small;">Next right mouse click on the solution and Add a New Folder called Data.</span></p>
<p>&nbsp;</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/59/45/7167.Picture2.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-59-45/7167.Picture2.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/59/45/7167.Picture2.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-59-45/7167.Picture2.png" alt="" border="0" /></a></p>
<p><span style="font-family: Calibri; font-size: small;">Now right mouse click on the Data directory and add a new C# Class called FakeService.cs.</span></p>
<p>&nbsp;</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/59/45/3288.Picture3.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-59-45/3288.Picture3.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/59/45/3288.Picture3.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-59-45/3288.Picture3.png" alt="" border="0" /></a></p>
<p>&nbsp;</p>
<p><span style="font-family: Calibri; font-size: small;">Replace the namespace and included class with the following code:</span></p>
<script type="text/javascript" src="https://gist.github.com/johnshew/50f741344d72ea76d46d.js?file=FakeService.cs"></script>
<p>&nbsp;</p>
<p><span style="font-family: Calibri; font-size: small;">As you can see all our FakeService does is simulate GET, INSERT, and DELETE operations against a cloud service.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">When you run the program you can watch the output window to see the simulated operations on the database.</span></p>
<h1><span style="color: #2e74b5; font-family: Calibri Light;">Step 3: Create the Models </span></h1>
<p><span style="font-family: Calibri; font-size: small;">Create another New Folder for Models.</span></p>
<p><span style="font-family: Calibri; font-size: small;">Then go to the Models folder in the Solution explorer and right mouse click to add a class called Organization.cs to this folder.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">&nbsp;</span><span style="font-family: Calibri; font-size: small;">Replace the namespace and class with the following code:</span></p>
<p>&nbsp;</p>
<script type="text/javascript" src="https://gist.github.com/johnshew/50f741344d72ea76d46d.js?file=Organization.cs"></script>
<p>&nbsp;<span style="font-family: Calibri; font-size: small;">As you can see the Model only depends on the Data layer.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">And it simply calls the simulated cloud service to load and update people in the organization.</span></p>
<p><span style="font-family: Calibri; font-size: small;">Your project should look like this now.</span></p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/59/45/5633.Picture4.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-59-45/5633.Picture4.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/59/45/5633.Picture4.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-59-45/5633.Picture4.png" alt="" border="0" /></a></p>
<h1><span style="color: #2e74b5; font-family: Calibri Light;">Step 4: Build the ViewModels</span></h1>
<p><span style="font-family: Calibri; font-size: small;">So far we&rsquo;ve taken care the models - the business logic including connection to the data layer. Now we get to the interesting part of the MVVM work &ndash; building the ViewModel.</span></p>
<p><span style="font-family: Calibri; font-size: small;">For those of you less familiar with the MVVM approach, here is a quick summary a two important constructs:</span></p>
<ul>
<li>
<p>INotificationPropertyChanged.&nbsp; INotificationPropertyChanged (or INPC) is an interface that describes how an object can participate in XAML bindings. The Binding system knows this interface and it uses it observe when properties on your objects have changed. We will wrap the Person object and implement the INPC interface to create the PersonViewModel.&nbsp; And we will do the same for the OrganizationViewModel.&nbsp;</p>
</li>
<li>
<p>ObservableCollection.&nbsp; Normal Lists and other IEnumerables don&rsquo;t support notifications of changes that the View will need. The ObservableCollection class does this so we create one of these within our OrganizationViewModel to keep track of the people in the organization.&nbsp; In order to do this we will need to keep the Organization&rsquo;s collection of people in sync with the ViewModel.</p>
</li>
</ul>
<p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></p>
<p><span style="font-family: Calibri; font-size: small;">Let&rsquo;s go.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">Create a new directory for ViewModels.</span></p>
<p><span style="font-family: Calibri; font-size: small;">And add a Class called PersonViewModel.cs.</span></p>
<p><span style="font-family: Calibri; font-size: small;">Now we could implement our ViewModel and write the straight-forward code for supporting the INotificationPropertyChanged interface.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">But to save some typing we are going leverage a helper class that make it easy to add INotificationPropertyChange to existing classes.</span></p>
<p><span style="font-family: Calibri; font-size: small;">To do this let&rsquo;s add another file to our ViewModels directory called ViewModelHelpers.cs and paste in following code replacing the existing namespace and class.</span></p>
<p>&nbsp;</p>
<script type="text/javascript" src="https://gist.github.com/johnshew/50f741344d72ea76d46d.js?file=ViewModelHelpers.cs"></script>
<p><span style="font-family: Calibri; font-size: small;">Go back to PersonViewModel.cs and add the following code.</span></p>
<p>&nbsp;</p>
<script type="text/javascript" src="https://gist.github.com/johnshew/50f741344d72ea76d46d.js?file=PersonViewModel.cs"></script>
<p>&nbsp;</p>
<p><span style="font-family: Calibri; font-size: small;">As you can see we&rsquo;ve created a ViewModel for a Person that is called PersonViewModel.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">This ViewModel maintains a reference to an underlying Person and we create getters and setters for each of the properties that rely on the underlying Person for the storage and it sends INotifyPropertyChanged events when the property is set.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">Notice how we use the NotificationBase&lt;Person&gt; class to do the default implementation of INotificationPropertyChanged.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">We also use the SetProperty helper functions to implement our getters and setters. </span><span style="font-family: Calibri; font-size: small;">The NotificationBase uses a nice new feature of System.Runtime.CompilerServices called CallerMemberName at compile time so we don&rsquo;t need to manage the String for property names. </span><span style="font-family: Calibri; font-size: small;">Using the NotificationBase&lt;T&gt; is a convenient way to wrap existing business objects that don&rsquo;t already support INPC.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">It is good approach especially when the business objects are large &ndash; as the pass through capability doesn&rsquo;t require duplicating fields. </span><span style="font-family: Calibri; font-size: small;">Now add a new Class for OrganizationViewModel.cs and add the following code replacing the generated namespace and class.</span></p>
<p>&nbsp;</p>
<script type="text/javascript" src="https://gist.github.com/johnshew/50f741344d72ea76d46d.js?file=OrganizationViewModel.cs"></script>
<p>&nbsp;</p>
<p><span style="font-family: Calibri; font-size: small;">This is really the core of the application.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">Let&rsquo;s look at it in some detail. </span><span style="font-family: Calibri; font-size: small;">We create the ViewModel for the Organization class and call it OrganizationViewModel.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">Like the PersonViewModel it also inherits from NotificationBase to provide a default implementation of INotifyPropertyChanged. </span><span style="font-family: Calibri; font-size: small;">Next we add an ObservableCollection&lt;PersonViewModel&gt; property called People to provide a XAML bindable implementation of our List&lt;Person&gt;.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">This ObservableCollection really doesn&rsquo;t do much other than get loaded through to the underlying model.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">We initialize the collection in the constructor and when we make changes to the ObservableCollection we update the model. </span><span style="font-family: Calibri; font-size: small;">Next we add two fields that are interconnected &ndash; a SelectedIndex that we can get and set from XAML and the SelectedPerson that corresponds to the SelectedIndex. Our user interface View will move the SelectedIndex as the user clicks on the list.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">Once a user has selected a Person the View enables the user to update the properties of the SelectedPerson.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">&nbsp;</span><span style="font-family: Calibri; font-size: small;">Notice that when we update the SelectedIndex we also fire a property changed notification on the SelectedPerson.</span></p>
<p>&nbsp;</p>
<p><span style="font-family: Calibri; font-size: small;">We add actions for Add and Delete that are just normal methods on the OrganizationViewModel &ndash; no fancy Commands or anything else required.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">The View will be able to bind to these actions in response to user input.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">As you can see they send the changes to the collection and the underlying model. </span><span style="font-family: Calibri; font-size: small;">One last important part of the model to note: when a property is changed on one of the PersonViewModel objects, they fire an event.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">We catch event this in the OrganizationViewModel and use to send an update to the underlying model and ultimately to the data service.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">To enable this we add person.PropertyChanged += Person_OnNotifyPropertyChanged in the Add operation.</span></p>
<p>&nbsp;</p>
<h1><span style="color: #2e74b5; font-family: Calibri Light;">Step 5: Create the View</span></h1>
<p>&nbsp;</p>
<p><span style="font-family: Calibri; font-size: small;">Okay, we are mostly done with the coding part of our application.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">Now we just need to create the View and we will do that using XAML. </span><span style="font-family: Calibri; font-size: small;">Open the default MainPage.xaml file.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">Paste in the following in place of the existing Grid.</span></p>
<script type="text/javascript" src="https://gist.github.com/johnshew/50f741344d72ea76d46d.js?file=MainPage.xaml"></script>
<p>&nbsp;</p>
<p><span style="font-family: Calibri; font-size: small;">In addition, add the following namespaces to the &lt;Page&gt; tag:</span></p>
<p><span style="font-size: small; background-color: #c0c0c0;"><span style="font-family: Lucida Console;">&nbsp;&nbsp; </span><span style="font-family: Lucida Console;">&nbsp;</span><span style="font-family: Lucida Console;">xmlns</span><span style="font-family: Lucida Console;">:</span><span style="font-family: Lucida Console;">viewModels</span><span style="font-family: Lucida Console;">="using:ViewModels"</span></span></p>
<p>&nbsp;<span style="font-family: Calibri; font-size: small;">Our view is very simple &ndash; it consists of a Grid with two columns.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">On the left is our list of People.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">And on the right is our edit fields.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span></p>
<p><span style="font-family: Calibri; font-size: small;">Inside of each Grid columns we have a vertically oriented StackPanel.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">On the right this StackPanel contains the ListView and the Add button and on the left it consists of the edits fields and the Delete button.</span></p>
<p><span style="font-family: Calibri; font-size: small;">Now let&rsquo;s review the bindings.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span></p>
<p><span style="font-family: Calibri; font-size: small;">In all cases we are using the high performance x:Bind compile time bindings.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">This not only Binding runtime overhead but it generates typesafe code ensure everything is hooked up properly before we even run the app.</span></p>
<p><span style="font-family: Calibri; font-size: small;">Most of the bindings should be fairly obvious.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">On the list view note on the DataTemplate we specific the x:DataType to our ViewModelPerson so that the list can bind to fields in a typesafe manner.</span></p>
<p><span style="font-family: Calibri; font-size: small;">The new x:Bind syntax makes it very easy to simple call the Add and Delete operations on our ViewModel &ndash; we simply x:Bind to these methods.</span></p>
<p><span style="font-family: Calibri; font-size: small;">It is important to note that while x:Bind offers a lot of great benefits from performance to IDE support, it is worth mentioning that it is not suitable everywhere. For instance x:Bind it does not support ElementName binding or UpdateTriggerSource.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span></p>
<p><span style="font-family: Calibri; font-size: small;">Now if you tried to compile this right now it would fail.</span><span style="font-family: Calibri; font-size: small;">&nbsp;&nbsp; </span><span style="font-family: Calibri; font-size: small;">This is great.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">Because it is based on compile time bindings, Visual Studio catches the fact that we don&rsquo;t anything called Organization available to bind against.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span></p>
<p><span style="font-family: Calibri; font-size: small;">So go to&nbsp;the code behind page for the View by opening MainPage.xaml.cs.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">Then add a property called Organization and initialize it.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">Here is the code.</span></p>
<p>&nbsp;</p>
<script type="text/javascript" src="https://gist.github.com/davemen/a7cbbc29819e870e03a4.js"></script>
<p>&nbsp;</p>
<p><span style="font-family: Calibri; font-size: small;">You will also need add a &ldquo;using ViewModels&rdquo; line above.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">Now the app should compile.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">Try it out.</span></p>
<p><span style="font-family: Calibri; font-size: small;">One of the most important things to note is that each of x:Binds to properties explicitly set the Mode.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">It is very easy to forget to set the Mode on an x:Bind in which case it defaults to OneTime.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">So if you see your user interface start to work but not update &ndash; check the Mode.</span></p>
<p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></p>
<p><span style="font-family: Calibri; font-size: small;">If you run the code now you&rsquo;ll note that the edit fields are visible even when there is no SelectedPerson.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">To address we&rsquo;re going to use a little trick.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">We going to add a Converter to the Page.Resources that will let us give us back Visible if there is the SelectedPerson is not null and Collapsed otherwise.</span></p>
<p><span style="font-family: Calibri; font-size: small;">To do this Add a New Folder to the Solution call it Converters.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">Then Add a new Class to the Converters folder called ObjectExistsToVisible.cs.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">Here is the code that you should add replacing the generated namespace and class.</span></p>
<p>&nbsp;</p>
<script type="text/javascript" src="https://gist.github.com/davemen/e0ae5b72f73672c79bd0.js"></script>
<p><span style="font-family: Calibri; font-size: small;">Now go back to the MainPage.xaml file.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span></p>
<p><span style="font-family: Calibri; font-size: small;">Add the following to the Page attributes.</span></p>
<p><span style="font-family: Lucida Console; font-size: x-small;">&nbsp;</span><span style="font-size: small;"><span style="font-family: Lucida Console;">&nbsp; </span><span style="background-color: #c0c0c0;"><span style="font-family: Lucida Console;">&nbsp;</span><span style="font-family: Lucida Console;">xmlns</span><span style="font-family: Lucida Console;">:</span><span style="font-family: Lucida Console;">converters</span><span style="font-family: Lucida Console;">="using:Converters"</span></span></span></p>
<p><span style="font-family: Times New Roman; font-size: small;"><br /></span><span style="font-family: Calibri; font-size: small;"> And then, in order to use the Converter in our XAML we need to load it so add the following right before the Grid.</span></p>
<script type="text/javascript" src="https://gist.github.com/davemen/ed71a79fcef9959d964a.js"></script>
<p><span style="font-family: Calibri; font-size: small;">Now let&rsquo;s use the converter.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">To do this use a x:Bind on Visibility attribute of the right-hand StackPanel &ndash; the one with Grid.Column=&rdquo;2&rdquo;. </span><span style="font-family: Calibri; font-size: small;">The StackPanel should now look like this:</span></p>
<script type="text/javascript" src="https://gist.github.com/davemen/f65c00b33c2547bbe017.js"></script>
<p><span style="font-family: Calibri; font-size: small;">We are done.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">Try it out.</span></p>
<h1><span style="color: #2e74b5; font-family: Calibri Light;">Next Steps</span></h1>
<p><span style="font-family: Calibri; font-size: small;">Hopefully this shows that implementing CRUD on data in an MVVM UWP App can be accomplished fairly easily.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">&nbsp;</span><span style="font-family: Calibri; font-size: small;">We used the new x:Bind approach works over our View and OrganizationViewModel and demonstrated how it helps you find Binding errors at compile-time. We also show using x:Bind to bind events directly to ViewModel methods making it easy to code up actions.</span></p>
<p><span style="font-family: Calibri; font-size: small;">If we wanted to turn this sample into a production application there are a few things you will need to think about:</span></p>
<p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></p>
<ul>
<li>
<p>In terms of improving the solution it is clear we can make the View look a lot better &ndash; here we were trying for the simplest implementation.</p>
</li>
<li>
<p>You would probably want to find and use a MaskedTextBox (or intercept the TextChanged operation and apply Int32.TryParse) on the Age text &ndash; otherwise you will run into cases with an exception being thrown when the user enters something that is not an Int32.&nbsp; Related to this, the current default for TextBox is to update the binding when the focus leaves the TextBox.&nbsp; This can cause problems if you navigate away by selecting the list.&nbsp; As mentioned earlier you can use a regular Binding and set UpdateTriggerSource to fire when the text is changed.</p>
</li>
<li>
<p>When implementing INotifyPropertyChanged we show how to do it manually, but you might want to look into implementing it more automatically through code weaving; e.g. something like Fody Property Changed found at <a href="https://github.com/Fody/PropertyChanged"><span style="color: #0000ff;">https://github.com/Fody/PropertyChanged</span></a>.&nbsp; While the Fody approach is great we didn&rsquo;t use it in this example to keep the number of moving parts to a minimum and also because Fody Property Changed requires some manual steps to get it working with UWP apps.</p>
</li>
<li>
<p>As you start to deal with larger amounts of data you will want to look into UX virtualization and implementing <a href="https://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.data.isupportincrementalloading.aspx"><strong><span style="color: #0000ff;">ISupportIncrementalLoading</span></strong></a>.&nbsp;</p>
</li>
<li>
<p>If you want to add sorting and filtering to the list you probably want to leverage a CollectionViewSource &ndash; a good simple description of how to do that is here <a href="https://www.uicraftsman.com/blog/2010/10/27/filtering-data-using-collectionviewsource/"><span style="color: #0000ff;">Filtering Data Using CollectionViewSource.&nbsp;</span></a>&nbsp;</p>
</li>
</ul>
<p><span style="font-family: Calibri; font-size: small;">In a subsequent blog post I&rsquo;ll also show you can use a typesafe implementation of the data set approach to eliminate some manual work &ndash; we didn&rsquo;t include it here since we wanted to keep everything stock.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">Some of the key benefits of typed data set approach is that you get a data source independent Model and you can use this as a foundation to easily implement sophisticated ViewModels over the data with very little code.</span></p>
<p><span style="font-family: Calibri; font-size: small;">Finally, once you&rsquo;ve got all the basics running, there are many interesting improvements you can make to MVVM apps.</span><span style="font-family: Calibri; font-size: small;">&nbsp; </span><span style="font-family: Calibri; font-size: small;">For example, some organization use dynamic lookup and assembly loading to connect together their MVVM components &ndash; this can be really handy if you want to be able to be able to update a running version of your application.</span></p>
<p><span style="font-family: Lucida Console; font-size: small;"><br /></span></p>
<p><span style="font-family: Lucida Console; font-size: small;"><br /></span></p>]]></content:encoded>
    </item>
    <item>
      <title>Build 2015 and Video Effects</title>
      <link>https://docs.microsoft.com/archive/blogs/johnshews_blog/build-2015-and-video-effects</link>
      <pubDate>Tue, 12 May 2015 10:06:00 GMT</pubDate>
      <dc:creator><![CDATA[John_Shewchuk]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/johnshews_blog/2015/05/12/build-2015-and-video-effects/</guid>
      <description><![CDATA[We’re keeping the coding going with this next post in the series of technical articles following the...]]></description>
      <content:encoded><![CDATA[<p>We’re keeping the coding going with this next post in the series of technical articles following the Build 2015 conference. This post is dedicated to the new video functionality provided in Windows 10. Increasingly, we’re hearing from developers the importance of adding improved user experiences for their apps. Those experiences include not only better design, increasingly the need for improved audio and video functionality has become important. In my last post I showed the audio functionality that we demonstrated in the Build keynote. This post is dedicated to one of the demos that we didn’t have time to show. And it’s pretty cool – focused on video and Windows 10. </p>  <p>So what is so special about the video functionality in Windows 10? I think that’s best seen through a comparison of code. Let’s look at the before and after for doing a relatively simple video effect. In this case we’re simply taking a video effect and adding a greyscale effect to it.</p>  <p><a href="https://github.com/davemen/MSGrayscaleCode/blob/master/Grayscale.cpp" target="_blank">Here</a> is the code in C++ that’s required to do this. As you can see it’s nearly 1500 lines of C++ code to perform this effect. The original version of this app is <a href="https://code.msdn.microsoft.com/windowsapps/Media-extensions-sample-7b466096#content" target="_blank">here</a>. Now if we look at the Windows 10 version of that same code, you can see it’s dramatically simplified and it is easily programmed to in C#.</p>  <pre style="background-color: lightgray"> 
<span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> ProcessFrame(ProcessVideoFrameContext context) {
   <span style="color: #0000ff">using</span> (var inputBitmap = CanvasBitmap.CreateFromDirect3D11Surface<br />(_canvasDevice, context.InputFrame.Direct3DSurface))
   <span style="color: #0000ff">using</span> (var drawingSurface = <br />CanvasRenderTarget.CreateFromDirect3D11Surface<br />(_canvasDevice, context.OutputFrame.Direct3DSurface).CreateDrawingSession())
   {
      <span style="color: #008000">// TODO 1: create a grayscale effect</span>
      #region grayscale

      <span style="color: #008000">// grayscale effect</span>
      var grayscale = <span style="color: #0000ff">new</span> Microsoft.Graphics.Canvas.Effects.SaturationEffect()
      {
         Saturation = 0,
         Source = inputBitmap
      };
      #endregion	 </pre>

<p>As you can see, first we process a frame. Then we create a Direct 3D surface. Next we create a drawing session. Finally, the core code is really as simple as: </p>

<pre style="background-color: lightgray"> <span style="color: #0000ff">new</span> Microsoft.Graphics.Canvas.Effects.SaturationEffect()	
     {	
      Saturation = 0,	
      Source = inputBitmap	
     };	</pre>

<p>It’s the deep engineering work that we did with the Windows team that radically simplifies the creation of video effects like this one. In fact in the sample on Github: <a title="https://github.com/nmetulev/Effective" href="https://github.com/nmetulev/Effective">https://github.com/nmetulev/Effective</a> we’ve added a few other simple effects to show you how to get started.</p>

<p>I’m looking forward to seeing what you do with it.</p>
</script>]]></content:encoded>
    </item>
    <item>
      <title>Build 2015 and Audio Effects</title>
      <link>https://docs.microsoft.com/archive/blogs/johnshews_blog/build-2015-and-audio-effects</link>
      <pubDate>Fri, 08 May 2015 11:34:00 GMT</pubDate>
      <dc:creator><![CDATA[John_Shewchuk]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/johnshews_blog/2015/05/08/build-2015-and-audio-effects/</guid>
      <description><![CDATA[We’re keeping the coding going with this third post in the series of technical articles following...]]></description>
      <content:encoded><![CDATA[<p>We’re keeping the coding going with this third post in the series of technical articles following the Build 2015 conference. This post shows you how it is so much easier now to develop apps that have fantastic, responsive audio. The next one will focus on video. </p>  <p>Having great audio and video is a big deal to many developers who focus on have a cool, highly interactive user experience for their apps.</p>  <p>A great example of this is Muzik Official Bluetooth-connected drum sticks. This is a super cool app where you do some air drumming… those Bluetooth drum sticks, and the related C#/XAML app, were only possible because of the new Bluetooth and new low-latency audio APIs that were introduced in Windows 10.</p>  <p>The Build Drummer sample app that I showed uses this new AudioGraph API and its low-latency audio capabilities to show how a simple C#/XAML app can have great audio performance on Windows 10.&#160; It is available on Github <a href="https://github.com/Psychlist1972/Build-2015-Drummer">here</a> – and we know it works with Win 10 build 10074 and Visual Studio 2015 RC.&#160; Go grab it.</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/59/45/6431.build%20drummer%201.PNG" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-59-45/6431.build-drummer-1.PNG"><img border="0" alt="" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/59/45/6431.build%20drummer%201.PNG" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-59-45/6431.build-drummer-1.PNG" /></a></p>  <p>With a single line of code, we can instruct the audio stack to use the lowest audio latency possible for the devices in the graph.</p>  <pre style="background-color: lightgray">settings.QuantumSizeSelectionMode = QuantumSizeSelectionMode.LowestLatency;</pre>

<p>&#160;</p>

<p>This sample also shows how simple it is to load samples into memory for playback using normal XAML event handlers.</p>

<p>&#160;</p>

<pre style="background-color: lightgray"><span style="color: #0000ff">private</span> async <span style="color: #0000ff">void</span> BuildFileNodes() { <span style="color: #008000">// Init all the file input nodes </span>
  Uri[] uris = <span style="color: #0000ff">new</span> Uri[numSamples]; 
  uris[(<span style="color: #0000ff">int</span>)Samples.Steve] = <span style="color: #0000ff">new</span> Uri<br />(&quot;<span style="color: #8b0000">ms-appx:///Assets/guggs_switch_gears.wav</span>&quot;, UriKind.Absolute);
   … 
  uris[(<span style="color: #0000ff">int</span>)Samples.OpenHighHat] = <span style="color: #0000ff">new</span> Uri<br />(&quot;<span style="color: #8b0000">ms-appx:///Assets/Drum-Open-Hi-Hat.wav</span>&quot;, UriKind.Absolute);
   <span style="color: #008000">// create a node for each uri </span>
  <span style="color: #0000ff">for</span> (<span style="color: #0000ff">int</span> i = 0; i &lt; numSamples; i++) {
    StorageFile f = await StorageFile.GetFileFromApplicationUriAsync(uris[i]);
    var res = await _graph.CreateFileInputNodeAsync(f);
    <span style="color: #0000ff">if</span> (res.Status != AudioFileNodeCreationStatus.Success) {
       <span style="color: #008000">// Give up on this one if the node didn't init properly continue;</span>
    }
    _fileNodes[i] = res.FileInputNode;
    _fileNodes[i].FileCompleted += MainPage_FileCompleted;
    <span style="color: #008000">// By default, nodes are started. </span>
    <span style="color: #008000">// But we want to have the nodes start off in the stop state. </span>
    _fileNodes[i].Stop();
    _fileNodes[i].AddOutgoingConnection(_deviceOutput);
  } 
}</pre>

<p>&#160;</p>

<p>If you saw the keynote, I had a little fun with “<a href="https://twitter.com/StevenGuggs">Guggs</a>”. He likes to say “Let’s switch gears” so we sampled his voice from last year’s keynote and included it here.</p>

<p>Try out the sample. Once you understand the code, swap in some of your own sound samples. If you want to give your coding skills a little stretch, add in some of the in-box effects like echo or reverb, or the ability to record your performance to a file.</p>

<p>&#160;</p>

<p>For more information on AudioGraph: <a href="https://channel9.msdn.com/Events/Build/2015/3-634">https://channel9.msdn.com/Events/Build/2015/3-634</a></p>

<p>And here’s another example of AudioGraph: <a href="https://github.com/Microsoft/Windows-universal-samples/tree/master/audiocreation">https://github.com/Microsoft/Windows-universal-samples/tree/master/audiocreation</a></p>

<p>&#160;</p>

<p>It’s the deep engineering work that the Windows team did that radically simplifies the creation of audio effects like this one.</p>

<p>In our next post, we’ll take a look at video processing and the significant work that went into simplifying it – we didn’t get a chance to show this in the Build keynote but I think you’ll find it pretty amazing.</p>]]></content:encoded>
    </item>
    <item>
      <title>Build 2015 and Vorlon.js</title>
      <link>https://docs.microsoft.com/archive/blogs/johnshews_blog/build-2015-and-vorlon-js</link>
      <pubDate>Mon, 04 May 2015 10:41:00 GMT</pubDate>
      <dc:creator><![CDATA[John_Shewchuk]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/johnshews_blog/2015/05/04/build-2015-and-vorlon-js/</guid>
      <description><![CDATA[As promised, here is the second in the series of technical articles following the Build 2015...]]></description>
      <content:encoded><![CDATA[<p>As promised, here is the second in the series of technical articles following the Build 2015 conference. This post is dedicated to Vorlon.js. So what is Vorlon?&nbsp; It is a new, open source, extensible, browser-agnostic tool for remotely debugging your JavaScript all powered by node.JS and socket.io.</p>
<p>Yep - imagine being able to easily use any browser to debug your web site or web app running anywhere.</p>
<p>What we demonstrated at Build went a little further. In the keynote, I used manifold.js (see my last post for more on that) to turn a responsive web site into mobile applications. In less than a minute, I converted the web site into mobile apps for iOS, Android, Chrome, Firefox, Windows 8, and Windows 10.&nbsp; And on Windows 10 it is a universal Windows app that runs across Windows phone, desktop, tablet and Xbox. &nbsp;&nbsp;Doing that is very easy &ndash; and a pretty cool way to quickly create both a web site and all of the mobile apps for the most widely used platforms.</p>
<p>Now with Vorlon, you can debug the web site and any of these mobile apps &ndash; all remotely.</p>
<p>There are of course other great tools out there that offer full-featured remote web debugging. Google offers such tools for Android and Chrome. Apple and Microsoft offers tools for their browsers and apps as well. We built Vorlon.JS with node.js and socket.io so it can work anywhere &ndash; it works from any browser to any JavaScript execution environment.&nbsp; Right now this also means that Vorlon.js has some significant limitations compared to these other tools &ndash; for example, you can&rsquo;t set breakpoints and step through code &ndash; but members of the open source team are working to add these features in&nbsp;the future.</p>
<p>Getting started is easy. Vorlon.JS is available as a node package, installed easily using NPM.</p>
<p style="padding-left: 30px;"><span style="background-color: #c0c0c0;"><strong><span style="font-family: courier new,courier;">$ npm install &ndash;g vorlon</span></strong></span></p>
<p>Once Vorlon.JS is done installing, you can now run the server:</p>
<p style="padding-left: 30px;"><span style="background-color: #c0c0c0;"><strong><span style="font-family: courier new,courier;">$ vorlon<br />The Vorlon server is running</span></strong></span></p>
<p>With the server running, open <a href="https://localhost:1337"><strong>https://localhost:1337</strong></a> in your browser to see the Vorlon.JS dashboard.</p>
<p><span style="background-color: #ffffff;"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/59/45/0167.vorlon-1.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-59-45/0167.vorlon_2D00_1.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/59/45/0167.vorlon-1.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-59-45/0167.vorlon_2D00_1.png" alt="" border="0" /></a></span></p>
<p>&nbsp;</p>
<p>The last step is to enable Vorlon.JS by adding this script tag to your app / website:</p>
<p><span style="background-color: #c0c0c0;"><strong><span style="font-family: courier new,courier;">&lt;script src="<a href="https://localhost:1337/vorlon.js&quot;></script"><span style="background-color: #c0c0c0;">https://localhost:1337/vorlon.js"&gt;&lt;/script</span></a>&gt;</span></strong></span></p>
<p>&nbsp;</p>
<p>Here we are showing using localhost which is great for development-time debugging.&nbsp; If you want to enable debugging for anyone using your apps on the Internet you will need to setup a public IP address for your Vorlon server.</p>
<p>Once inside the dashboard, you can start remotely debugging your app or your web site. Sometimes you will be debugging more than one app on your machine, and it&rsquo;s easy to see which app is which using the client list feature.</p>
<p><strong><span style="font-family: courier new,courier; background-color: #999999;"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/59/45/1256.vorlon-2.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-59-45/1256.vorlon_2D00_2.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/59/45/1256.vorlon-2.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-59-45/1256.vorlon_2D00_2.png" alt="" border="0" /></a></span></strong></p>
<p>&nbsp;</p>
<p>With the DOM inspector you can quickly navigate the DOM of the remote webpage. You can inspect by clicking on nodes which will highlight them in the host webpage. If you select a node you can also view and modify its CSS properties.</p>
<p>The console lets you run Javascript remotely so you can look at values or take actions within the application.</p>
<p>The Modernizr tab will show you the supported browser features as reported by <a href="https://modernizr.com/">Modernizr</a>. You can use this to determine what features are available by browser and platform. This might be useful on unusual mobile devices or games consoles.</p>
<p>We&rsquo;ve tested Vorlon.JS with 50 JavaScript client debugging sessions at once regardless of the platform or device running the client-side code.</p>
<p>And importantly it is open source and extensible. Vorlon.JS has been designed so that you can extend the dashboard and client application easily by writing or installing additional plugins.</p>
<p>Check out Vorlon here <a href="https://www.vorlonjs.com">https://www.vorlonjs.com</a> and you can get the code from Github at <a href="https://github.com/MicrosoftDX/Vorlonjs">https://github.com/MicrosoftDX/Vorlonjs</a>.</p>
<p>&nbsp;</p>]]></content:encoded>
    </item>
    <item>
      <title>Build 2015 and ManifoldJS</title>
      <link>https://docs.microsoft.com/archive/blogs/johnshews_blog/build-2015-and-manifoldjs</link>
      <pubDate>Thu, 30 Apr 2015 11:00:00 GMT</pubDate>
      <dc:creator><![CDATA[John_Shewchuk]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/johnshews_blog/2015/04/30/build-2015-and-manifoldjs/</guid>
      <description><![CDATA[I just walked offstage after another amazing build keynote. There is so much new technology that can...]]></description>
      <content:encoded><![CDATA[<p>I just walked offstage after another amazing build keynote. There is so much new technology that can help you build great next-generation applications. But there&rsquo;s just too much to drill into in one blog post. So we take a look at each major coding demo in a series of posts &ndash; starting with this one.</p>
<p>Today developers who want to reach a lot of customers are faced with supporting many different devices, with different size screens, input modes and so on.&nbsp; Developers try to tackle these challenges using a lot of different techniques &ndash; and the choice really depends on what code you already have and what kind of app you have created.&nbsp; In the past couple of years at build, Guggs and I have shown using Unity, Xamarin and of course there are a number of solutions that leverage the web including Cordova, React, and the new hosted web apps we just introduced with Windows 10.</p>
<p>As you know, we&rsquo;ve been talking about the value of Hosted Web Apps for <a href="https://blogs.msdn.com/b/johnshews_blog/archive/2014/01/28/websites-to-apps-the-web-app-template-simplifies-windows-app-development.aspx">some time now</a>.&nbsp; Hosted Web Apps allow you to use your web content as the base of your Windows Store app, allowing you to keep the same workflow, content and deployment model that you use today.&nbsp; We&rsquo;ve heard from a lot of developers that use Hosted Apps that, like the web, makes more sense when they are cross platform.&nbsp;</p>
<p>To help developers really accelerate the delivery of apps using web technologies, today I announced <strong>ManifoldJS </strong>- a new open source framework that that can take a website and create an application for Windows, iOS, Android, Chrome, and Firefox &ndash; that really simplifies creating hosted apps across platforms.</p>
<p>Recently, the W3C has worked to standardize a way to describe all the metadata used to create web apps.&nbsp; It&rsquo;s called the <a href="https://w3c.github.io/manifest/">Manifest for Web Apps</a> and it&rsquo;s an effort supported by all the major browser makers.&nbsp; ManifoldJS uses the W3C Manifest for Web Apps to create the apps for a number of platforms: iOS, Android, Windows 8.1, Chrome, FireFox OS, and now Windows 10.&nbsp;When the platform supports hosted apps, we create them natively, when they don&rsquo;t we use Cordova to pollyfill the functionality.&nbsp; What you end up with is a simple experience that allows you to focus on your manifest file, and ManifoldJS handles the heavy lifting of generating files for each platform.&nbsp;</p>
<p>ManifoldJS runs as a command line tool through node.js or you can use the web based tool at <a href="https://www.manifoldJS.com">https://www.manifoldJS.com</a>.</p>
<p>The example we showed today at Build was a fictional demo app called Shiftr which lets developers vote on developer frameworks.</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/59/45/6014.1.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-59-45/6014.1.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/59/45/6014.1.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-59-45/6014.1.png" alt="" border="0" /></a><br /><br />&nbsp;<br />In the demo, I simply typed &ldquo;ManifoldJS http:/www.samplesite.com&rdquo; and ManifoldJS generated projects for each of the individual platforms.</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/59/45/5432.3.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-59-45/5432.3.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/59/45/5432.3.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-59-45/5432.3.png" alt="" border="0" /></a><br /> <br />And now, the finished product in Android Studio:</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/59/45/5148.5.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-59-45/5148.5.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/59/45/5148.5.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-59-45/5148.5.png" alt="" border="0" /></a><br /> <br />With ManifoldJS, developers simply create the standard manifest, and ManifoldJS creates the apps for the different platforms and devices.</p>
<p>I can&rsquo;t wait to see what you do with it.</p>]]></content:encoded>
    </item>
    <item>
      <title>Taking the Web App Template Cross-Platform</title>
      <link>https://docs.microsoft.com/archive/blogs/johnshews_blog/taking-the-web-app-template-cross-platform</link>
      <pubDate>Thu, 15 Jan 2015 09:00:00 GMT</pubDate>
      <dc:creator><![CDATA[John_Shewchuk]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/johnshews_blog/2015/01/15/taking-the-web-app-template-cross-platform/</guid>
      <description><![CDATA[&nbsp;
If you are a Web developer and are thinking about taking the jump to mobile apps, the Web...]]></description>
      <content:encoded><![CDATA[<p>&nbsp;</p>
<p>If you are a Web developer and are thinking about taking the jump to mobile apps, the <a href="https://blogs.msdn.com/b/johnshews_blog/archive/2014/01/28/websites-to-apps-the-web-app-template-simplifies-windows-app-development.aspx">Web App Template</a> (WAT) is an awesome way to get started. Creating mobile apps doesn&rsquo;t get much easier than this, and the approach is lined up with the approach a lot of top companies are taking across Android, iOS and other platforms.</p>
<p>Ever since we released the WAT earlier this year, we&rsquo;ve heard a lot of really great feedback, and developers have started submitting apps to the Windows and Windows Phone stores that they built on top of their existing Web investments.</p>
<p>In the meantime, we&rsquo;ve been busy working on some new tools that expand the capabilities of the WAT and make it even easier to bring your Web investment into a Windows universal app. If you&rsquo;re a Web developer looking to transform your work into Windows apps, look no further.</p>
<p>For example, one of the greatest things about the Web is that it&rsquo;s cross-platform, so we&rsquo;re extending the WAT tool to be cross-platform as well, starting with the release of the Android version of the WAT.</p>
<p>The <a href="https://wat.codeplex.com/releases/view/142501">Android version</a> works just like WAT 1.0 did for Windows. You can take the same config file you built for your Windows WAT app and drop it into the Android version of the tool. This can help your fantastic website reach even more users. iOS hasn&rsquo;t been forgotten &mdash; we&rsquo;re working hard on that and planning to release our iOS version sometime soon.</p>
<p><strong>WAT Roller</strong></p>
<p>It&rsquo;s no secret that some Web developers aren&rsquo;t using Windows as their main machine, but for testing purposes, building a hosted app on Windows has always required that the Web developer have a Windows machine or VM running Visual Studio. To make things easier, we&rsquo;ve built a Windows Store app called WAT Roller.</p>
<p>The WAT Roller allows you to point the app to a WAT config file you have hosted on a website.</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/59/45/3513.Step%201.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-59-45/3513.Step-1.jpg"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/59/45/3513.Step%201.jpg" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-59-45/3513.Step-1.jpg" alt="" border="0" /></a></p>
<p>&nbsp;</p>
<p>The WAT Roller app will then re-launch as your hosted app &hellip;</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/59/45/8117.Step%202.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-59-45/8117.Step-2.jpg"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/59/45/8117.Step%202.jpg" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-59-45/8117.Step-2.jpg" alt="" border="0" /></a></p>
<p>&nbsp;</p>
<p>allowing you to make changes to your config file &hellip;</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/59/45/4667.Step%203.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-59-45/4667.Step-3.jpg"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/59/45/4667.Step%203.jpg" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-59-45/4667.Step-3.jpg" alt="" border="0" /></a></p>
<p>&nbsp;</p>
<p>and see the changes reflected directly in the test app &hellip;</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/59/45/8204.Step%204.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-59-45/8204.Step-4.jpg"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/59/45/8204.Step%204.jpg" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-59-45/8204.Step-4.jpg" alt="" border="0" /></a></p>
<p>&nbsp;</p>
<p>after pointing the app to the new config.</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/59/45/6428.Step%205.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-59-45/6428.Step-5.jpg"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/59/45/6428.Step%205.jpg" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-59-45/6428.Step-5.jpg" alt="" border="0" /></a></p>
<p>&nbsp;</p>
<p>Once the app is installed, it&rsquo;s as easy as:</p>
<p>1. Clicking on Settings and selecting Change Config Host Address</p>
<p>2. Pointing the WAT Roller to your Config file on a Web server and</p>
<blockquote>
<p>a. Refreshing the app to pick up changes you&rsquo;ve made OR</p>
</blockquote>
<blockquote>
<p>b. Resetting the WAT Roller back to its original state.</p>
</blockquote>
<p>Now, getting off the ground is even easier. All a developer needs is a test device or VM and this app, which is free in the store. And Web developers can use their integrated development environment of choice. The WAT Roller is available for Windows, Windows Phone and Android.</p>
<p>&nbsp;</p>
<p><strong>New Features in WAT</strong></p>
<p>As well, we&rsquo;ve added some new features to the WAT based on feedback from Web developers who have used the tool. All of the features are implemented in version 2.2 and later of the Windows tool. Here are some highlights:</p>
<ul>
<li>&nbsp;<strong>W3C Manifest for Web App </strong>- We have added support for the developing spec for the Manifest for Web Apps. You can now build the config file with this standard and render your WAT app. This version of the format is also supported in the Android version. And don&rsquo;t worry, your legacy config files will still be supported.</li>
<li><strong>Hosted App Files </strong>-<strong> </strong>You can now host your config file, app CSS and app JavaScript files on your website and point to them from within your store app. This allows you to easily update these assets without doing a store release. You can also coordinate changes between your website and your store app, as all the changes can now be pushed from the same location.</li>
<li><strong>Faster Page Loads </strong>- We&rsquo;ve worked on the transitions from page to page to make sure the app is as responsive as possible so your performant websites are performant apps as well.</li>
<li><strong>Support for Globalization </strong>- Globalization is now built directly into the WAT tool so that language support is easy. If you&rsquo;re using non-Latin characters or supporting multiple languages in your website, you can replicate that experience with your store app.</li>
<li><strong>SuperCache 2.0 </strong>- We&rsquo;ve revamped the offline caching solution we call SuperCache. This new version supports more use cases and allows you to extend the proxy to support the edge cases.</li>
</ul>
<p>And for app builders who are not as familiar with the code, our app builder tool, <a href="https://appstudio.windows.com/en-us">Windows AppStudio Beta</a>, now constructs Universal WAT apps as well.</p>
<p>We&rsquo;re excited about the new apps we&rsquo;re seeing in the market and the feedback we&rsquo;re getting on the WAT tools. Keep the feedback coming, and we&rsquo;ll continue to make WAT better.</p>]]></content:encoded>
    </item>
    <item>
      <title>Creating scalable web apps with the Service Gateway</title>
      <link>https://docs.microsoft.com/archive/blogs/johnshews_blog/creating-scalable-web-apps-with-the-service-gateway</link>
      <pubDate>Thu, 20 Nov 2014 10:00:00 GMT</pubDate>
      <dc:creator><![CDATA[John_Shewchuk]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/johnshews_blog/2014/11/20/creating-scalable-web-apps-with-the-service-gateway/</guid>
      <description><![CDATA[Earlier this year we released the Service Gateway, a tool that simplifies the process of building...]]></description>
      <content:encoded><![CDATA[<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/59/45/5751.Service%20Gateway%20image.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-59-45/5751.Service-Gateway-image.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/59/45/5751.Service%20Gateway%20image.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-59-45/5751.Service-Gateway-image.png" alt="" border="0" /></a></p>
<p>Earlier this year we released the <a href="https://sg.codeplex.com/">Service Gateway</a>, a tool that simplifies the process of building an internet-ready web site or mobile service.</p>
<p>If this is your first time reading about Service Gateway then check out my <a href="https://blogs.msdn.com/b/johnshews_blog/archive/2014/03/13/creating-the-perfect-front-door-for-web-app-development.aspx">initial post</a> from a few months ago. The nut of it is that with Service Gateway you can have an Internet scale, highly available services up and running in under an hour.</p>
<p>The simplicity that Service Gateway provides has already attracted the attention of companies such as GE Healthcare and Invensys. Now James Baker and the rest of the guys who built the Service Gateway have been working on some updates, including:&nbsp;</p>
<ul>
<li>Automatic updates for both the Gateway and Management Console</li>
<li>Optimization for UrlRewrite RegExp expressions to reduce latency overhead</li>
<li>Additional redirection rules and enhanced configuration for all rules</li>
<li>Added support for completing proxy HTTPS requests with self-signed or untrusted certificates</li>
<li>Support manual rewrite rules</li>
<li>Support for redirection in addition to rewriting</li>
<li>Added support to run in Azure China environment</li>
<li>Fixed a variety of reported bugs</li>
</ul>
<p>As a matter of fact, the Relecloud app that we demonstrated at Build last spring was built using the Service Gateway, and it&rsquo;s currently being used by customers to help simplify the process of building apps for the Web, for mobile and for off-line experiences.</p>]]></content:encoded>
    </item>
    <item>
      <title>STEM Labs: A firsthand look at the life of a software developer</title>
      <link>https://docs.microsoft.com/archive/blogs/johnshews_blog/stem-labs-a-firsthand-look-at-the-life-of-a-software-developer</link>
      <pubDate>Mon, 10 Nov 2014 10:00:00 GMT</pubDate>
      <dc:creator><![CDATA[John_Shewchuk]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/johnshews_blog/2014/11/10/stem-labs-a-firsthand-look-at-the-life-of-a-software-developer/</guid>
      <description><![CDATA[Ever since Microsoft DX started hosting hackfests last this year, we&rsquo;ve seen steady growth in...]]></description>
      <content:encoded><![CDATA[<p>Ever since Microsoft DX started hosting hackfests last this year, we&rsquo;ve seen steady growth in the level of participation. Rarely does a week go by that we don&rsquo;t have at least one hackfest going on in Redmond or elsewhere. Last week there were three going on, and this week I&rsquo;m headed to Berlin to join the Internet of Things (IoT) hackfest on Thursday and Friday &ndash; let me know if you want in.<p>What&rsquo;s been especially gratifying, though, is how the same tools we use to host hackfests for ISVs have also proven to be great for students. This summer, a handful of local students set up camp on the Redmond campus to test their coding skills and get a glimpse of what it&rsquo;s like to write code for a living.</p><p>We worked with a local non-profit called STEM Labs and co-hosted an accelerator. Full disclosure &ndash; my daughter is a founder.</p><p><iframe style="height: 350px; width: 560px;" src="https://channel9.msdn.com/Blogs/JohnShew/STEM-Labs-Shows-Students-What-its-Like-to-Write-Code-for-a-LIving/player?h=350&amp;w=560" frameborder="0" scrolling="no"></iframe></p><p>The students worked together to design and build a sophisticated cloud-based app that included responsive web and mobile clients running on Android, iOS, and Windows.</p><p>It was pretty amazing to watch this team of young developers learn to work together, leverage cloud computing, and in a very short time produce applications that are as good, if not better, than many of the applications created by professional developers.</p><p>Just to give you an idea of how well these students did, we&rsquo;ve shown the app to development managers at some of the top fortune 500 companies and they were blown away by the sophistication and scope of capabilities &ndash; offline data, cross-device, access control, leading one manager to remark, &ldquo;Wow, we spend so much money building our internal applications across mobile platforms and the web &ndash; and the apps aren&rsquo;t as good as what these kids produced.&rdquo; Pretty cool.</p><p>One of the keys to this was that students were able to take advantage of some of the latest advances in app design &ndash; <a href="https://github.com/angular-ui/bootstrap">Angular and Bootstrap</a> for responsive web layouts, HTML app technologies like the <a href="https://wat.codeplex.com/">Web App Template</a>, and synchronized cloud data.</p><p>If you want to see how these young hotshots put together the app, there are some examples on <a href="https://github.com/MSOpenTech/AngularCloudDataConnector">Github</a> as part of the Angular Cloud Data Connector that shows the basics of the framework.</p><p>Plans are already in the works for next summer&rsquo;s STEM Labs event, but if next summer is too long to wait, consider taking part in one of many <a href="https://hourofcode.com/us">Hour of Code</a> events happening December 8- 14 in classrooms around the world.</p><p>Also, consider tuning in to <a href="https://channel9.msdn.com/Events/TechEd/Europe/2014/KEY01">Channel 9</a> at 9 a.m. PDT on December 8 for a live broadcast of an Hour of Code. Whether at home or in the classroom, you can follow along as Sage Franch, a Microsoft Student Partner and Technical Evangelist intern, and Susan Ibach, Technical Evangelist will teach you how to code.</p></p>
]]></content:encoded>
    </item>
  </channel>
</rss>