WEBVTT

00:00:00.246 --> 00:00:05.532
>> Ladies and gentlemen, please welcome
Steve Guggenheimer and John Shewchuk.

00:00:07.814 --> 00:00:12.019
>> All right.
Good morning, everybody.

00:00:12.492 --> 00:00:14.781
Welcome to day two of Build.
My name is Steve Guggenheimer.

00:00:15.008 --> 00:00:18.025
My colleague is John Shewchuk.
They often call me Guggs and Shew.

00:00:18.278 --> 00:00:20.277
Bad joke there.
We'll let that one go.

00:00:20.851 --> 00:00:24.072
We hope you guys had an outstanding day
one, and our goal is just to keep the

00:00:24.201 --> 00:00:26.822
momentum going on day two.
The first thing I want to do is thank our

00:00:27.014 --> 00:00:29.495
deejay, Alan Smithson.
I thought he did a great job.

00:00:33.839 --> 00:00:37.449
The Emulator board that he had here,
there's only 25 in existence.

00:00:37.555 --> 00:00:39.977
He helped co-create that.
He'll be at the party tonight, so if you

00:00:40.086 --> 00:00:43.315
want to make your own mixes and use the
board, you're welcome to come out and see him.

00:00:43.686 --> 00:00:45.604
Put it to the test and have a
little bit of fun with that.

00:00:45.958 --> 00:00:50.588
Now, what John and I wanted to do is sort
of take some of the conversations we have

00:00:50.718 --> 00:00:52.406
on a regular basis and bring those to life.

00:00:52.753 --> 00:00:56.306
As I hope you got a sense from the video,
we basically spend all of our time talking

00:00:56.559 --> 00:01:01.918
to developers, from students to startups
to large and small ISVs, to folks who work

00:01:02.160 --> 00:01:06.081
in large and small commercial enterprises,
people who build software for a living.

00:01:06.323 --> 00:01:09.716
And the trick here is to take those many
conversations and to bring them to life.

00:01:09.951 --> 00:01:14.508
They range from types of apps to technology
areas to business models to

00:01:14.643 --> 00:01:16.954
tool chains and more.
John, what do you think about that as

00:01:17.050 --> 00:01:19.620
a starting point? >> Yes, when
Guggs and I are out there

00:01:19.756 --> 00:01:23.472
talking to developers, one of the things
that's extremely exciting for folks

00:01:23.590 --> 00:01:26.475
is just the vast array of capabilities
that are out there.

00:01:26.602 --> 00:01:29.871
Different kinds of devices you can
target, different cloud platforms with

00:01:30.273 --> 00:01:36.273
PaaS, with IaaS, and then these new
emerging platforms, software as a service,

00:01:36.551 --> 00:01:38.592
like Salesforce or what we're doing with Office.

00:01:39.001 --> 00:01:42.430
So when they come, and we have
those conversations, it's almost never about

00:01:42.669 --> 00:01:45.955
this Microsoft technology or
this particular product.

00:01:46.195 --> 00:01:49.460
It's about how do we put all this stuff
together to build great applications

00:01:49.807 --> 00:01:52.811
and make applications that's help
us make money and be successful?

00:01:53.036 --> 00:01:56.710
So we thought we'd share a little bit about
how those conversations are going,

00:01:56.970 --> 00:02:00.687
how we're putting these pieces together to
build world-class next-generation apps.

00:02:01.561 --> 00:02:04.413
>> So that will be our framework for today.
You see behind me a set of the

00:02:04.674 --> 00:02:06.907
conversations we're going to bring forward.
We're going to have some of our

00:02:07.033 --> 00:02:08.912
colleagues come out and help
us throughout the morning.

00:02:09.159 --> 00:02:12.013
We're going to try to bring these to life
through two things -- as much as possible

00:02:12.232 --> 00:02:15.371
use code that partners or others have
built, ISVs that we've worked with,

00:02:15.625 --> 00:02:18.806
second, do as many demos as possible.
We always try and get as many in as short

00:02:19.012 --> 00:02:21.254
timeframe as possible.
And third, show code.

00:02:21.625 --> 00:02:24.428
I saw a little meme yesterday that said
there was a lot of code, maybe too much.

00:02:24.923 --> 00:02:27.084
I don't know how other folks run their
dev conferences, but if you didn't like

00:02:27.236 --> 00:02:30.114
the coding yesterday, you're not going to
like today, because we'll probably show more.

00:02:30.610 --> 00:02:31.911
And with that, I think we ought to dive in.

00:02:36.879 --> 00:02:39.563
I wanted to start out with fun
in the media and music space.

00:02:40.210 --> 00:02:44.357
One of the cool things that's going on is
the mixture of IoT, predictive analytics,

00:02:44.761 --> 00:02:49.666
Bluetooth, and it's enabling some crazy ideas.
This is one our friends at Muzik showed us.

00:02:49.917 --> 00:02:51.610
When I got a chance to work with it,

00:02:52.807 --> 00:02:57.222
you see the drum kit on the Surface,
you see the virtual drums?

00:02:57.753 --> 00:03:02.019
It's  like things possible I
would have never thought of.

00:03:02.200 --> 00:03:04.731
The cool thing here is obviously I'm not
a drummer, but the folks at Muzik,

00:03:05.000 --> 00:03:08.113
they're working with folks who do this for a living.
Let me show you a little bit about what

00:03:08.253 --> 00:03:09.064
they're talking about.

00:03:10.757 --> 00:03:13.351
>> Thanks, Guggs.
This is Questlove of The Roots and

00:03:13.661 --> 00:03:14.971
a member of the Muzik team.

00:03:15.144 --> 00:03:19.090
I just wanted to say, I'm really excited
we're working with Microsoft on our motion

00:03:19.350 --> 00:03:20.661
instruments and our accessories.

00:03:21.035 --> 00:03:26.295
Personally, I can't wait to see all the
things that you guys create using Xbox

00:03:26.557 --> 00:03:29.697
and your mobile devices with our game-changing technology.

00:03:30.438 --> 00:03:33.901
Let's work together on the future.
The future of Muzik, the future of

00:03:34.188 --> 00:03:37.193
gaming, and the future of technology.
Let's go.

00:04:04.595 --> 00:04:07.463
>> So pretty cool stuff.
Jason Hardy and the guys at Muzik,

00:04:07.810 --> 00:04:09.183
a little thumbs up for Questlove.

00:04:09.792 --> 00:04:12.379
This is something we couldn't have
contemplated a few years ago.

00:04:12.653 --> 00:04:14.489
So there must be some work going on between
what they're doing and what we're

00:04:14.605 --> 00:04:17.858
doing to make this possible.
>> Think about this particular application.

00:04:18.214 --> 00:04:21.893
You've got professional musicians, you're
using these devices with accelerometers,

00:04:22.302 --> 00:04:27.053
they're doing predictive analytics and
a whole bunch of other pretty complicated

00:04:27.339 --> 00:04:30.652
stuff, but at the end of the process,
what they've got to do is they've got to play

00:04:30.795 --> 00:04:32.460
a sample, and they've got to do it quickly.

00:04:32.855 --> 00:04:37.477
Now, what I've got on the screen here is
some code that we would have had to write

00:04:37.597 --> 00:04:41.978
back in Windows 8.
This is some pretty complicated C++ code,

00:04:42.393 --> 00:04:48.214
page upon page of it, all of this to go
take that event and play that sample.

00:04:48.689 --> 00:04:51.481
And even when you were done with this,
you would have had a problem.

00:04:51.734 --> 00:04:54.731
The latency would have been a little high.
So the engineers in Windows have been

00:04:54.857 --> 00:04:55.612
hard at work.

00:04:56.419 --> 00:05:01.208
They've been optimizing the video,
display channels, the audio channels, and they've

00:05:01.543 --> 00:05:05.760
actually made it incredibly easy to program.
So here are some new APIs that we're introducing.

00:05:06.059 --> 00:05:09.521
Here's the new Audio Graph API.
This will do audio processing.

00:05:09.692 --> 00:05:12.650
Notice we can create a device output.

00:05:12.859 --> 00:05:15.610
Here's where some of the magic
happens right here.

00:05:15.955 --> 00:05:19.480
Notice we set the quantum size selection
to the lowest latency.

00:05:19.603 --> 00:05:22.754
This is what lets the thing play.
We connect it to an output device,

00:05:23.243 --> 00:05:26.128
and then we go load the samples
here and build the file nodes.

00:05:26.269 --> 00:05:31.048
And that's the core of one of these applications.
Obviously, more stuff going on with the

00:05:31.159 --> 00:05:34.043
Bluetooth stack and so on.
Let me actually just show you this thing.

00:05:34.388 --> 00:05:36.243
Here's a quick example.

00:05:36.654 --> 00:05:41.900
I'm just going to use touch,
and I can now play on this.

00:05:42.183 --> 00:05:46.186
Hey, Steve, you appeared on the screen.
Now, remember, last year when we were

00:05:46.298 --> 00:05:48.725
doing this, I remember you wanted
to switch gears a lot.

00:05:48.929 --> 00:05:49.645
>> Let's switch gears.

00:05:49.828 --> 00:05:53.728
Let's, let's, let's switch gears.
>> Super-helpful, John.

00:05:53.906 --> 00:05:55.730
This is why we don't let him
play with the music side.

00:05:56.101 --> 00:05:57.978
Maybe we'll give that to Alan
later on for tonight.

00:05:58.330 --> 00:06:01.928
So let's switch gears.
Sorry, it just was there.

00:06:02.774 --> 00:06:06.374
The client side is one area of innovation.
The other is obviously on the cloud side

00:06:06.532 --> 00:06:08.012
and with streaming media overall.

00:06:08.377 --> 00:06:13.167
Yesterday, we streamed out over Channel 9
the video from this presentation and all

00:06:13.308 --> 00:06:16.163
the rest of them.
We hit about 300,000-plus users and about

00:06:16.290 --> 00:06:17.404
75,000 concurrently.

00:06:17.780 --> 00:06:20.260
For us, that's big scale.
We're pretty excited about that.

00:06:20.500 --> 00:06:23.125
This year, working with NBC, we did the
Super Bowl, and it was over 1.2 billion

00:06:23.415 --> 00:06:25.727
concurrent users.
When you think about over the top

00:06:25.994 --> 00:06:30.197
transmission, when you think about streaming
media, music, video, all of it,

00:06:30.603 --> 00:06:33.181
it's coming together now, and a lot of work
is going on the cloud side for that.

00:06:33.529 --> 00:06:37.985
>> Now, what you can see here is once
you've created great video, great audio,

00:06:38.147 --> 00:06:42.210
the ability to get it out across all
the different platforms is very important,

00:06:42.457 --> 00:06:46.601
and we're looking at the actual streaming
that's coming through the Azure Media

00:06:46.736 --> 00:06:51.101
Services, the Channel 9 discussion.
So there it is, doing cloud encoding

00:06:51.440 --> 00:06:53.637
and a whole bunch of other stuff.
What I really wanted to do, though,

00:06:53.974 --> 00:06:58.039
was just spend one second.
Here's a very simple player where we can

00:06:58.189 --> 00:06:59.313
see what's happening.

00:06:59.685 --> 00:07:01.313
I just want to show you the code behind this.

00:07:01.612 --> 00:07:06.467
This is what it takes to go build
one of these cloud-distributed,

00:07:06.586 --> 00:07:11.657
high-scale DVR-based systems.
All of this code we're making available,

00:07:11.991 --> 00:07:16.221
it's incredibly easy to use and again, at
the core of some of these huge projects

00:07:16.331 --> 00:07:17.052
like the Olympics.

00:07:17.773 --> 00:07:21.130
>> And the nice thing with all these pieces
is, we're starting to see a set of

00:07:21.422 --> 00:07:23.928
ISVs building them and giving us
feedback and helping us along.

00:07:24.323 --> 00:07:26.783
Let me run a video from a partner or
an ISV that's running on top of this

00:07:27.111 --> 00:07:28.095
and helping us learn more.

00:07:29.355 --> 00:07:30.740
[Video Plays].

00:07:36.300 --> 00:07:40.449
>> Propellerhead is a leading developer of
software for music making, both on desktop

00:07:40.785 --> 00:07:44.107
and mobile, allowing musicians of any
skill level anywhere in the world to make

00:07:44.303 --> 00:07:47.125
music together.
In a cloud-first and mobile-first world,

00:07:47.623 --> 00:07:49.727
our customers expect us to be cross platform.

00:07:49.957 --> 00:07:55.164
Microsoft allows us to develop on one device
and rapidly deploy across other devices.

00:07:55.784 --> 00:07:57.970
We started Propellerhead 20 years ago,

00:07:58.383 --> 00:08:02.531
and our aim was to democratize music making,
to make it available to anybody,

00:08:02.799 --> 00:08:07.165
regardless of their income or skill level.
In a way, deploying on mobile brings us

00:08:07.316 --> 00:08:11.680
back to those roots, and we're able
to deliver for free incredibly powerful music

00:08:11.995 --> 00:08:17.962
making tools.
As music brings people together, so does technology.

00:08:18.773 --> 00:08:23.072
With these technologies, we'll be able to
help people make their musical dreams come

00:08:23.187 --> 00:08:25.868
true anywhere in the world,
on any device, at any time.

00:08:26.336 --> 00:08:29.891
We're really excited about what all this
technology can do for people going forward.

00:08:30.533 --> 00:08:32.190
[End Video].

00:08:40.504 --> 00:08:44.397
>> So my thanks to the folks from Propellerhead.
Look, we're getting feedback from networks.

00:08:44.676 --> 00:08:50.122
You see TSN, CTV up here, Rdio and Tunein
and iHeartRadio are giving us help on the

00:08:50.280 --> 00:08:52.314
client side, so we're getting a lot
of feedback on how to make all of the

00:08:52.432 --> 00:08:56.014
underlying and underpinnings for what
we're doing better and better and better.

00:08:56.586 --> 00:09:00.286
So I'm going to move off of media now,
and given our audience, we know a lot of

00:09:00.386 --> 00:09:03.009
you work in the commercial space for
a living, we just thought before we get into

00:09:03.230 --> 00:09:06.306
some of the deeper details, we'd
do a couple commercial pieces.

00:09:06.539 --> 00:09:09.484
So first off, let me just say, hey, we've
got great partners here who are also

00:09:09.617 --> 00:09:11.673
giving us feedback.
We heard about some of them yesterday

00:09:11.787 --> 00:09:15.676
with SAP, and you saw DocuSign onstage.
GE has been doing some great work with us.

00:09:15.834 --> 00:09:18.066
Salesforce.
Salesforce, yesterday, we saw the

00:09:18.238 --> 00:09:20.795
integration with Office.
They're also building a Windows 10

00:09:20.931 --> 00:09:24.933
application, working with us not just
on the application but on the SDK.

00:09:25.182 --> 00:09:26.495
There's also infrastructure.

00:09:26.718 --> 00:09:29.746
We saw Docker yesterday.
We're doing some work with Mesosphere.

00:09:30.103 --> 00:09:31.464
I wanted to talk a little bit about

00:09:31.723 --> 00:09:35.205
Autodesk at this point, because
one conversation that is bridging, I think,

00:09:35.468 --> 00:09:38.536
from consumer to commercial,
is the area of 3D printing.

00:09:38.635 --> 00:09:41.381
This is an area where we have a lot
of discussions, and this is one of those

00:09:41.496 --> 00:09:46.036
areas where today we do a lot with
3D printing for prototyping or modeling,

00:09:46.291 --> 00:09:49.782
and folks want to move to the area of manufacturing.
So really make that step into

00:09:50.077 --> 00:09:52.763
a commercial space.
Now, to do this, we have to get all the

00:09:53.002 --> 00:09:55.114
systems to work together.
You have to get the software to work with

00:09:55.358 --> 00:09:58.370
the hardware, the printers themselves,
as well as the materials.

00:09:58.725 --> 00:10:00.722
And today, it's not quite as
smooth as we'd all like.

00:10:00.968 --> 00:10:04.100
So we've done some work working with Autodesk.
Autodesk has been building an engine they

00:10:04.221 --> 00:10:07.883
call Spark, and Spark allows us to have
a platform across the software, the hardware

00:10:07.989 --> 00:10:11.565
and the materials, with a set of APIs in
an open way that we can all work on

00:10:12.030 --> 00:10:15.096
and use and what I'm happy to announce today
is we're going to integrate that Spark

00:10:15.267 --> 00:10:18.010
engine into Windows 10.
So now we have a common platform we can

00:10:18.137 --> 00:10:21.568
all work from and build on as we want
to go out and do 3D modeling.

00:10:21.788 --> 00:10:24.361
And the cool thing here is they're starting
to build sort of a line of 3D

00:10:24.493 --> 00:10:28.174
printers that take advantage of the Spark engine.
This is the first time anyone's seen one

00:10:28.308 --> 00:10:30.977
of these new Ember printers.
I love the fact that on the Autodesk

00:10:31.237 --> 00:10:33.964
side, they do nice design.
And when you think about manufacturing,

00:10:34.344 --> 00:10:37.061
you can think about lots of scenarios.
Up here, you see an earbud.

00:10:37.306 --> 00:10:41.138
The professional musicians, the racecar
drivers, they have these custom-made ear

00:10:41.295 --> 00:10:45.063
inserts, and the notion of moving from
doing this as sort of a project through

00:10:45.294 --> 00:10:48.870
multiple phases to basically having
a manufacturing ability to do this is the

00:10:49.159 --> 00:10:51.657
direction we're headed in.
So I'm pleased with the work we're doing

00:10:51.782 --> 00:10:54.039
with Autodesk, and I wanted to highlight
that today, because that's an area where I

00:10:54.185 --> 00:10:56.977
get lots of questions, we have lots of fun,
but we're going to move from modeling

00:10:57.379 --> 00:10:58.564
I think to manufacturing in the near future.

00:10:59.013 --> 00:11:03.764
Now, one other one that when I think about
commercial, then, is true line-of-business applications.

00:11:04.137 --> 00:11:07.165
And here, you can take a vertical scenario
by industry or horizontal.

00:11:07.539 --> 00:11:11.032
You can think ERP, CRM, supply
chain management, SCM, etc.

00:11:11.265 --> 00:11:14.157
And so I thought we'd take a horizontal
solution, in this case, ERP.

00:11:14.411 --> 00:11:18.708
Our friends, ISVs in the Northwest called
Acumatica, who built a cloud-based ERP --

00:11:19.114 --> 00:11:23.060
why don't you show us what we have here, John?
>> So many of these vertical systems at

00:11:23.306 --> 00:11:28.295
the core have reporting, and here what we
see is a typical sales order summary,

00:11:28.714 --> 00:11:32.750
and it's got a lot of information, but  --
>> As usual, it's close, John, but I need

00:11:32.860 --> 00:11:36.509
a couple of changes.
>> And normally, as a developer, often,

00:11:36.635 --> 00:11:40.708
those changes are things that I would have
to go in and do relatively manually,

00:11:41.115 --> 00:11:44.761
code it up, add it into the list of reports
that these folks can do, and that means

00:11:45.026 --> 00:11:48.858
that I'm not necessarily working on
the broader aspects of the project.

00:11:49.413 --> 00:11:52.781
Reporting can take a lot of effort.
So we were having that conversation with Acumatica.

00:11:53.210 --> 00:11:57.564
How could we leverage what's happening in
the cloud, this new distributed world,

00:11:58.030 --> 00:12:00.665
to take what they've already
got and make it much better?

00:12:00.909 --> 00:12:02.162
And so we did this pretty cool thing,

00:12:02.709 --> 00:12:05.241
which is we added to their query system

00:12:05.441 --> 00:12:10.778
the ability to expose all their data out
to the world through the Internet,

00:12:11.163 --> 00:12:12.464
through REST interfaces.

00:12:13.014 --> 00:12:16.712
It's called OData, and the way we did that
is actually pretty straightforward.

00:12:18.084 --> 00:12:22.662
What you're seeing here is the actual
code inside of Acumatica.

00:12:22.911 --> 00:12:26.759
They have an object-relational model.
They hooked up a simple model that

00:12:27.066 --> 00:12:31.513
exposed that ORM through OData, and
let me show you how cool that is.

00:12:31.910 --> 00:12:37.029
Here's the Power BI Builder, which is one
of the tools that can consume OData.

00:12:37.514 --> 00:12:39.912
Lots of other things, Excel and
other stuff can do that.

00:12:40.210 --> 00:12:43.183
All I need to do is I just click on this,

00:12:43.433 --> 00:12:50.366
and I go add an OData feed, and I connect
to it, type that URL into the Acumatica

00:12:50.576 --> 00:12:54.786
data, and off we go with now
the new Power BI tools.

00:12:55.042 --> 00:12:57.207
In fact, I think we've got it running
over here, so you can --

00:12:57.365 --> 00:12:59.666
>> So we might as well have some fun, since
we have all this great new hardware

00:12:59.800 --> 00:13:00.628
to play with.

00:13:00.908 --> 00:13:03.984
Now, as the end user, I really
don't care what John's doing.

00:13:04.265 --> 00:13:06.510
I just want to be able to get access to
the information, and so I've got Surface

00:13:06.675 --> 00:13:07.434
Hub here.

00:13:07.715 --> 00:13:09.711
Sorry, let me reboot it.

00:13:10.915 --> 00:13:14.113
So I've got my Surface Hub here.
I have smooth inking on this, so I could

00:13:14.280 --> 00:13:17.069
choose to type in, but you know what?
I'm just going to go up here.

00:13:17.558 --> 00:13:19.863
I'm actually just going to ask for sales

00:13:21.688 --> 00:13:26.061
by city, let that come up.
And you know what?

00:13:26.210 --> 00:13:29.161
I'm curious.
I'd like to see that as a map, so I'm

00:13:29.308 --> 00:13:33.385
going to say as map, and you'll notice,
it just automatically goes.

00:13:33.482 --> 00:13:35.961
So for me as the end user, I can
sort of pick the reports I want.

00:13:36.311 --> 00:13:39.097
I can zoom in if I want.
It's a pretty cool way to take what

00:13:39.366 --> 00:13:42.512
John's working on and not have to go back
and ask him over and over again for reports.

00:13:42.912 --> 00:13:46.063
Now, John, this is pretty cool.
What I saw yesterday in Satya's section

00:13:46.314 --> 00:13:50.034
is he also hooked into the Office Graph,
so what I'd really like to do is see this by user.

00:13:50.358 --> 00:13:51.768
In fact, I'd like to see this by your team.

00:13:52.113 --> 00:13:57.070
>> So really what we're talking about
is doing dynamic joins across different data

00:13:57.247 --> 00:14:00.066
sets using the OData protocol
underneath the hood.

00:14:00.435 --> 00:14:04.872
What I've got here on the screen is
a very simple, single-page web app.

00:14:05.510 --> 00:14:09.368
This is the kind of thing you would do
if you were talking to a Facebook API,

00:14:09.587 --> 00:14:11.907
anything, and it's pretty straightforward.

00:14:12.114 --> 00:14:14.185
You do a redirection to a login page.

00:14:14.413 --> 00:14:17.700
You get back a token.
You use that token to access information,

00:14:18.163 --> 00:14:19.905
but here's where the real work occurs.

00:14:20.324 --> 00:14:23.460
We're going out to that new Office Graph.

00:14:23.714 --> 00:14:27.837
We're going to graph.windows.net, we're
taking our me token, and notice I'm

00:14:28.161 --> 00:14:32.765
looking at the direct reports.
So let's actually just run that, and what

00:14:32.887 --> 00:14:36.765
we can see here is we want to
go retrieve these things.

00:14:37.233 --> 00:14:40.261
It reaches out, it gets the data.
We've printed out the data, and as you

00:14:40.467 --> 00:14:44.033
can see, here's the JSON that comes back.
This is pretty clean,

00:14:44.159 --> 00:14:47.239
pretty easy-to-parse stuff.
Anybody in almost any language can take

00:14:47.472 --> 00:14:52.913
advantage of this, but again, this has been
put out in a way that's consumable by

00:14:53.283 --> 00:14:55.759
a lot of products.
It's got this OData characteristic.

00:14:56.234 --> 00:15:00.785
In fact, we've also linked that one up to
the same Power BI, so now we can do those queries.

00:15:01.276 --> 00:15:04.012
>> Yes, so you see the Microsoft Graph API.
We've hooked it up, as well.

00:15:04.240 --> 00:15:11.784
So here I can now go orders by manager.

00:15:12.162 --> 00:15:16.785
And you'll notice, this is the
true magic of software.

00:15:17.165 --> 00:15:20.314
John is selling more than anyone else, and
all of us know in this room that John

00:15:20.455 --> 00:15:22.581
is not selling anything to do
with software right now.

00:15:22.731 --> 00:15:25.516
He's completely doing the coding.
So I like the fact the magic of software

00:15:25.644 --> 00:15:28.674
allows him to sell more, and really, that
works out as a nice connection between the

00:15:28.788 --> 00:15:31.784
end user and John on the back end of this piece.

00:15:32.213 --> 00:15:35.185
So this is a good spot.
I think we've done a little bit to get

00:15:35.331 --> 00:15:38.184
going on the consumer, commercial,
two conversations we have on a regular basis.

00:15:38.670 --> 00:15:41.165
One thing we heard a lot of feedback on
yesterday that people want to talk about

00:15:41.298 --> 00:15:44.771
is Windows and building for Windows 10,
in particular, taking advantage of the

00:15:44.918 --> 00:15:48.111
Universal Windows Platform, as well as
some of the bridges, so with that,

00:15:48.237 --> 00:15:51.233
I'm going to introduce our good friend
David Treadwell to come on out.

00:15:51.510 --> 00:15:54.563
David's coming from that way, and help us
out, take us on a journey through Windows 10.

00:15:54.818 --> 00:15:57.966
David, it's nice to see you.
You're up, man.

00:16:00.519 --> 00:16:02.078
>> Good morning, Build.

00:16:04.765 --> 00:16:09.182
So at Build, we've been talking a lot about
our conversations with developers.

00:16:10.411 --> 00:16:14.579
I'd like to tell you about a conversation
that Terry and Kevin Gallo and I had last

00:16:14.712 --> 00:16:16.516
summer with one well-known developer,

00:16:17.814 --> 00:16:19.593
a guy named Bill Gates.

00:16:20.327 --> 00:16:25.226
We were reviewing with Bill our plan
for making Windows 10 great for developers

00:16:25.325 --> 00:16:28.269
like you.
As you might imagine, review with Bill

00:16:28.427 --> 00:16:32.215
is always a big deal, so we were well
prepared, but we were also nervous.

00:16:33.637 --> 00:16:37.116
One of the points that I made is that we've
been getting lots of feedback from

00:16:37.368 --> 00:16:41.560
people like yourselves that they didn't
like one thing about the modern platform

00:16:41.830 --> 00:16:46.670
in Windows 8, and that's that it really
only supported full-screen applications,

00:16:47.165 --> 00:16:48.586
no windowing.

00:16:49.281 --> 00:16:53.718
Full screen is great on a smaller screen
like a tablet, but many people like large

00:16:53.835 --> 00:16:55.973
screens, multi-monitor setups.

00:16:56.212 --> 00:16:57.988
I love the three-monitor setup that I have.

00:16:59.567 --> 00:17:04.515
So I told Bill one of the things that
we're doing in Windows 10 is we're

00:17:04.767 --> 00:17:07.384
bringing back this fine feature from 1986,

00:17:08.958 --> 00:17:11.514
resizable, overlapping Windows for apps.

00:17:18.724 --> 00:17:23.277
And Bill paused, and he looked at me kind
of intently for a second, and then he

00:17:23.509 --> 00:17:27.919
said, wow, that's a really great idea.

00:17:28.847 --> 00:17:30.280
You know what we should do?

00:17:30.845 --> 00:17:32.913
We should name the product after that feature.

00:17:36.092 --> 00:17:38.404
So I told him that the joke in the engineering
team is that we really should

00:17:38.587 --> 00:17:40.522
have called it Window 8.

00:17:48.920 --> 00:17:50.965
True story.
Happened just like that.

00:17:51.210 --> 00:17:52.933
And that story does show something important.

00:17:53.890 --> 00:17:56.277
While it is valuable to have experiences

00:17:56.921 --> 00:18:02.570
that span multiple devices, we as developers
must put the user at the center

00:18:02.798 --> 00:18:04.466
of these experiences.

00:18:05.964 --> 00:18:10.113
What works great on a tablet may not work
great on a huge modern desktop monitor.

00:18:11.561 --> 00:18:15.115
This important idea from our conversation
with Bill carries through both of the

00:18:15.441 --> 00:18:19.364
developer conversations that Kevin and I
are excited to talk with you about today.

00:18:20.560 --> 00:18:26.317
First, how can Windows 10 enable you to
provide a continuum of experiences across

00:18:26.491 --> 00:18:29.387
device types that put the user at the center?

00:18:30.962 --> 00:18:35.873
And second, how can Windows 10 help you
take the code that you have today

00:18:36.361 --> 00:18:38.789
and reach over 1 billion Windows users with

00:18:39.089 --> 00:18:41.517
more personal computing experiences only

00:18:41.697 --> 00:18:43.513
possible on Windows?

00:18:45.291 --> 00:18:47.112
Let's start by discussing the first one.

00:18:48.215 --> 00:18:52.518
With Windows 10, the Universal Windows
Platform now lets you reach the entire

00:18:52.704 --> 00:18:59.315
family of Windows devices, from laptops
and desktops to tablets, phones, HoloLens,

00:18:59.664 --> 00:19:02.388
Surface Hub, Xbox, and even Raspberry Pi,

00:19:03.364 --> 00:19:05.769
all with one amazingly flexible platform.

00:19:07.148 --> 00:19:10.763
Whether a device has a large screen or
a small screen or even no screen at all,

00:19:11.120 --> 00:19:15.316
a mouse, keyboard, touch, a game controller,
pen, camera, sensors, you name it,

00:19:16.566 --> 00:19:21.595
the Universal Windows platform gives you
a way to exploit the abilities of the device

00:19:22.219 --> 00:19:26.169
and create more personal computing
experiences for your customers.

00:19:28.568 --> 00:19:31.104
We've made improvements across
the board for developers.

00:19:31.519 --> 00:19:34.040
It's now easier to design, debug,

00:19:34.214 --> 00:19:36.873
develop, and distribute your app.

00:19:38.327 --> 00:19:42.910
Last year here at Build, I told you about
how Universal Windows apps could adapt one

00:19:43.272 --> 00:19:49.170
app across all devices or tailor
the design to each device.

00:19:50.361 --> 00:19:53.721
Universal Windows Platform on Windows
10 makes this even easier.

00:19:54.727 --> 00:19:58.364
There's now one design language and
one control set across the platform.

00:20:00.046 --> 00:20:04.190
This gives you a predictable, consistent
toolkit for creating your user experiences

00:20:04.667 --> 00:20:06.270
across all Windows devices.

00:20:07.301 --> 00:20:09.195
For example, the pivot control,

00:20:09.416 --> 00:20:14.480
which originated on phone, is now available
across devices in a way that works great

00:20:14.712 --> 00:20:15.853
on each one.

00:20:17.321 --> 00:20:21.874
Universal Windows Platform on Windows
10 includes brand-new controls too, like

00:20:22.164 --> 00:20:24.162
a fully featured calendar control.

00:20:25.020 --> 00:20:26.917
Controls work across screen sizes,

00:20:27.249 --> 00:20:32.479
with mouse, touch, keyboard, pen, and now
even game controller right out of the box.

00:20:33.566 --> 00:20:37.314
And all the controls are accessible to
all users.

00:20:39.927 --> 00:20:44.768
The one design language and one control
set make it easy to adopt your app for

00:20:44.993 --> 00:20:45.999
common scenarios.

00:20:46.417 --> 00:20:50.172
Things that every app designer needs to
handle, like window size and input type

00:20:50.424 --> 00:20:54.094
are often handled automatically
by the platform for you.

00:20:54.305 --> 00:20:56.153
For example, menus appear with

00:20:56.398 --> 00:21:00.433
mouse-optimized or touch-optimized
presentation, depending how they're

00:21:00.689 --> 00:21:04.591
invoked by the user, but you can
write the code just once.

00:21:05.995 --> 00:21:09.852
Universal Windows Platform on Windows
10 gives you more power to tailor each

00:21:10.177 --> 00:21:12.639
individual device as well.

00:21:13.594 --> 00:21:18.178
The new adaptive triggers feature lets
you respond to changes such as window size

00:21:18.544 --> 00:21:21.948
and automatically adjust your
layout, all in markup.

00:21:23.792 --> 00:21:28.739
Beyond just size, you can tailor based
on input, orientation, availability of

00:21:28.971 --> 00:21:33.420
sensors, app services, or pretty much
any other change you can detect.

00:21:35.295 --> 00:21:40.572
You can even create a totally custom XAML
view for each device, all sharing common code.

00:21:42.903 --> 00:21:45.922
And last year, I also told you about how
you could share common code for your

00:21:46.293 --> 00:21:48.569
Universal Windows app across phone and PC.

00:21:49.890 --> 00:21:53.691
With the Universal Windows Platform
on Windows 10, you can now literally write to

00:21:54.144 --> 00:21:56.640
one universal API and produce one package

00:21:56.894 --> 00:21:58.345
to reach every device.

00:21:59.238 --> 00:22:02.189
It's incredibly straightforward
as well as flexible.

00:22:03.544 --> 00:22:07.888
Using feature detection and API contracts,
you can take advantage of any

00:22:08.190 --> 00:22:12.464
device-specific APIs while still writing
the overall app to the one universal API.

00:22:14.445 --> 00:22:18.593
Universal Windows Platform is really just
v10 of the same modern platform you've

00:22:18.746 --> 00:22:20.456
been using on phones since Phone 8.1

00:22:20.799 --> 00:22:22.946
and on PCs since Windows 8.

00:22:23.513 --> 00:22:24.992
Your code still works.

00:22:25.498 --> 00:22:27.626
Your concepts still hold true.

00:22:29.239 --> 00:22:32.594
You can continue writing apps to the
Universal Windows Platform in your

00:22:32.737 --> 00:22:38.595
language of choice, whether that's C,
C++, C#, Visual Basic, or JavaScript.

00:22:39.714 --> 00:22:45.170
The Universal Windows Platform brings together
the best of Windows, Phone, and Xbox.

00:22:46.246 --> 00:22:49.374
Now you can access Cortana and
Action Center on the PC.

00:22:50.147 --> 00:22:51.496
You can print on the phone.

00:22:52.041 --> 00:22:55.990
You can use Xbox Live services
on every Windows device.

00:22:57.287 --> 00:23:00.541
And there are tons of new things in
the Universal Windows Platform as well.

00:23:01.037 --> 00:23:05.438
DirectX 12, Holographic, Active
Pen, Windows Hello.

00:23:06.285 --> 00:23:12.347
Over 2,500 platform features, over 8,000
new functions unlock new capabilities for

00:23:12.636 --> 00:23:14.461
your apps.

00:23:15.632 --> 00:23:19.229
Now, I'd like to ask Kevin Gallo to show
you how to use the Universal Windows

00:23:19.347 --> 00:23:23.343
Platform to build an app that reaches
every Windows device family.

00:23:25.511 --> 00:23:29.321
Go get 'em.
>> Thanks, David.

00:23:30.085 --> 00:23:33.422
I'm excited, because today I'm going to
be able to give you a lap around the

00:23:33.544 --> 00:23:34.744
Universal Windows Platform.

00:23:35.394 --> 00:23:39.074
What I've done is written a single application
that runs across a plethora of

00:23:39.254 --> 00:23:40.584
devices that I'm going to show you today.

00:23:40.836 --> 00:23:44.091
I decided to focus on a home remodeling application.

00:23:44.342 --> 00:23:47.795
I was inspired because my wife and I started
a project in our home, and as we

00:23:48.068 --> 00:23:51.469
were working with a firm to go through the
process, I kept thinking about how I could

00:23:51.788 --> 00:23:56.479
streamline and improve the experience that
they had between the firm and with us,

00:23:56.710 --> 00:24:00.254
the customer, and really also with the
device family that we have with Windows.

00:24:00.522 --> 00:24:03.143
There's a bunch of things they could do
that would be unique, and they could

00:24:03.262 --> 00:24:04.467
differentiate from their competitors.

00:24:05.114 --> 00:24:08.321
So let me just dive right in here
and talk about this application.

00:24:08.517 --> 00:24:10.586
So it has five phases.

00:24:10.836 --> 00:24:16.690
It has a design phase, a planning phase
and a capturing phase, then an

00:24:16.821 --> 00:24:19.862
organizational phase, and then kind of
this last phase, which is they present the

00:24:20.056 --> 00:24:23.256
final product.
We'll ultimately try to enclose that.

00:24:23.693 --> 00:24:27.266
For this design phase, I think the best
device that I could think of is kind of

00:24:27.385 --> 00:24:30.264
a creative sketching device,
which is a Surface Pro 3.

00:24:30.636 --> 00:24:31.831
So here I have that running.

00:24:32.340 --> 00:24:35.346
You can see on the left hand side, I have
a split view UI here at the top.

00:24:35.744 --> 00:24:39.693
I have the five phases that I talked about.
On the right hand side is a canvas for me

00:24:39.797 --> 00:24:42.697
to draw on.
So I'll just start drawing, and you'll

00:24:42.837 --> 00:24:47.468
notice the beautiful ink support that we
have with the universal platform, and I

00:24:47.602 --> 00:24:48.945
can go draw my room here.

00:24:49.592 --> 00:24:53.346
I'm actually not very good at sketching,
but it all is beautiful with this ink,

00:24:53.635 --> 00:24:57.836
low latency and you can see it's very fluid.
This is all built on the new Direct Ink

00:24:57.976 --> 00:25:01.690
APIs that we support on the Universal Platform
and this is all hosted inside of

00:25:01.882 --> 00:25:05.703
an ink canvas.
But I wouldn't be the one who really was

00:25:05.837 --> 00:25:09.262
doing the initial design.
Instead, I would have gotten that from a designer.

00:25:09.749 --> 00:25:15.183
So we can also save and load ink.
When it loads the ink, this is real ink.

00:25:15.659 --> 00:25:19.060
This is not some image that can't be
modified because we want to collaborate on it.

00:25:19.233 --> 00:25:24.239
So here, I'm going to move my pen
into selection mode, and I'm going to draw

00:25:24.345 --> 00:25:27.093
a lasso around that, and then
I'm going to use my finger.

00:25:27.206 --> 00:25:30.438
This app is aware and knows that, when
I'm using my finger, I'm in editing,

00:25:30.893 --> 00:25:33.122
I'm not drawing.
I can also draw with my finger, but here

00:25:33.386 --> 00:25:36.301
I'm going to differentiate between pen
and touch., and then I can go and say,

00:25:36.444 --> 00:25:38.462
you know what? I really want
my entryway to be a little

00:25:38.661 --> 00:25:41.782
bit bigger.
And so I can add my creative -- whatever

00:25:41.968 --> 00:25:44.645
creative I have to this application for us.

00:25:44.915 --> 00:25:48.586
So let me go show you the code that
we wrote to create that lasso.

00:25:49.718 --> 00:25:53.587
So I'm going to hop one over here to
Visual Studio, and what you'll see here

00:25:53.947 --> 00:25:59.788
is this is my XAML for my design pane, and
so all I had to do is add this ink canvas

00:26:00.066 --> 00:26:02.496
control that's new in the Universal Platform.

00:26:02.910 --> 00:26:06.615
So once I have this in here, then I can
wire up some code to create that lasso.

00:26:06.937 --> 00:26:11.342
So let's go look at how to write that code.
There are really three parts that I have,

00:26:11.584 --> 00:26:14.348
three event handlers that I need to do.
My first press, when I want the

00:26:14.639 --> 00:26:18.238
selection, and then as I move the pen, I
get another set of events, and then when I

00:26:18.342 --> 00:26:20.586
release it, I need to go perform the operation.

00:26:20.940 --> 00:26:24.101
So let's start with the code for
creating the lasso on my press.

00:26:24.486 --> 00:26:26.946
So when I press, I'm going
to create a poly line.

00:26:27.063 --> 00:26:28.153
This is the line that I'm drawing for the lasso.

00:26:28.393 --> 00:26:30.440
I go set some attributes on the line itself.

00:26:30.636 --> 00:26:35.142
I add the first point, and then I go and
I say, for the canvas, I want this to be

00:26:35.547 --> 00:26:38.891
a selection versus the actual
part of the canvas drawing.

00:26:39.388 --> 00:26:41.902
The ink canvas is smart enough to know
the difference between selection

00:26:42.187 --> 00:26:43.441
and drawing on the canvas itself.

00:26:43.996 --> 00:26:48.444
Then I'm going to go here to where I move
it, and all I do is add another point

00:26:48.782 --> 00:26:52.381
every time I move, and that's nice and simple,
and then when I release it, I need

00:26:52.638 --> 00:26:55.586
to process it.
And so of course, never forget to add the

00:26:55.832 --> 00:26:59.371
last point so it looks right, and
then create a bounding rec here.

00:26:59.498 --> 00:27:04.299
What I do is I get the poly line that I
drew around it, and I ask the ink canvas

00:27:04.698 --> 00:27:08.984
to give me all of the points that are within
that poly line, and that creates

00:27:09.150 --> 00:27:13.639
this bounding rec, and then right around
it, I draw that bounding rec, and that's

00:27:13.816 --> 00:27:16.951
all I had to go do.
So very straightforward, a little bit of

00:27:17.180 --> 00:27:20.839
code here, and I have a great selection
and a great experience on this device.

00:27:21.314 --> 00:27:24.694
Now, this is not the only
device that supports pen.

00:27:24.995 --> 00:27:29.350
And we know that Universal applications
run across many devices, and any one that

00:27:29.590 --> 00:27:33.047
supports pen will support it.
So here, we have the largest of our

00:27:33.262 --> 00:27:37.907
pen-enabled devices.
This is an 84-inch 4K Surface Hub.

00:27:38.380 --> 00:27:41.297
So let me go load the same application.

00:27:42.397 --> 00:27:45.790
This literally is the same binary
running here on the Surface Hub.

00:27:46.265 --> 00:27:50.268
And I can go and draw, beautiful fluid ink.

00:27:54.093 --> 00:27:59.501
Build -- I shouldn't have done that, oh, well.
Made an error there.

00:27:59.917 --> 00:28:03.245
You know, can't spell, but I can
load the same exact thing here.

00:28:03.469 --> 00:28:06.268
All very fluid, beautiful ink,
all with the same application.

00:28:06.884 --> 00:28:11.237
But this is not just for drawing.
It really is a phenomenal collaboration

00:28:11.471 --> 00:28:14.989
device, and having this in the showroom
would be a great place to interact with

00:28:15.231 --> 00:28:19.758
their customers and kind of not just draw
the sketch, but also begin to plan the trip.

00:28:20.120 --> 00:28:23.745
The next phase is going in and out, going
to different stores and looking at

00:28:23.986 --> 00:28:28.466
different materials and carpeting and flooring
and countertops and deciding what

00:28:28.709 --> 00:28:31.590
you want to do.
Here in this phase, we're looking at a map.

00:28:32.203 --> 00:28:35.066
And this is a built-in map control.
If you remember from yesterday,

00:28:35.353 --> 00:28:40.068
Joe showed you our Map app, and our Map app
is using the same exact map control that

00:28:40.238 --> 00:28:44.080
is available to every developer
using the Universal Platform.

00:28:44.558 --> 00:28:47.550
Now, this is a very rich control.
I can go move it around.

00:28:47.714 --> 00:28:51.238
I can stretch it.
I can actually do a tilt view.

00:28:52.010 --> 00:28:53.564
All this works offline.

00:28:54.320 --> 00:28:57.307
I also have a 3D aerial view built in.

00:28:57.559 --> 00:29:01.313
All you have to do is change the mode and
say you want an aerial view, but I'm going

00:29:01.440 --> 00:29:04.239
to move back here.
So the map's not very useful if you can't

00:29:04.356 --> 00:29:09.264
put anything on the map, so we also have
the ability to pin points of interest,

00:29:09.555 --> 00:29:10.935
or in this case, stores.

00:29:11.158 --> 00:29:15.457
So I've set up a little filter here where
I can go choose what type of stores I want.

00:29:15.709 --> 00:29:19.914
They have a list that they work with
and partner with, and I typically like more

00:29:20.039 --> 00:29:22.353
modern stores.
My wife likes traditional, but since

00:29:22.519 --> 00:29:25.287
she's not here, I win this time.
I'm going to go look at modern stores.

00:29:26.157 --> 00:29:30.108
Your mileage may vary.
And you'll see that I also have a list

00:29:30.359 --> 00:29:32.755
here, because I want to actually see what
they are, and then the points of interest

00:29:32.987 --> 00:29:35.702
just show up on the map.
All I had to do was data bind that list

00:29:36.189 --> 00:29:39.185
to both of these, and they show up.
So now I'm going to hope over here

00:29:39.440 --> 00:29:43.041
and show you the code that I wrote
to create those points on the map.

00:29:44.340 --> 00:29:46.491
So here I am, back in my Visual Studio,

00:29:47.025 --> 00:29:50.636
and I'm going to go to my plan
trip XAML right here.

00:29:50.890 --> 00:29:52.970
So all I had to do was add a map control,

00:29:53.583 --> 00:29:58.961
set some basic zoom levels on it and then
create a list box, data binding the stores

00:29:59.214 --> 00:30:03.933
that I was going to have here in this list
box, and then that's all I need to do in

00:30:04.182 --> 00:30:06.132
my XAML.
Then, every single time I do the

00:30:06.299 --> 00:30:10.781
dropdown, and I optimize which ones I
want, whether I select all of them, I get

00:30:10.893 --> 00:30:15.168
an event handler here on my click, and
let me just pop in the code here.

00:30:15.596 --> 00:30:18.593
So I do some simple processing
right here, go through.

00:30:18.718 --> 00:30:22.758
This is pretty simple, just see which things
are checkboxed, create some queries

00:30:22.878 --> 00:30:26.115
for which of the stores we wanted.
And then I just go and I update my

00:30:26.312 --> 00:30:28.519
observable collection.
That's data bound.

00:30:28.913 --> 00:30:31.920
And then I update that and it
will automatically will go show the points of

00:30:32.065 --> 00:30:32.998
interest and new list.

00:30:34.036 --> 00:30:37.078
Very straightforward.
Easy to add, easy to optimize.

00:30:37.554 --> 00:30:42.501
But now once I've gone and I sort of planned
my trip, I want to go take photos

00:30:42.917 --> 00:30:48.153
and see the different furniture and carpets
in a nice, optimized fashion.

00:30:48.389 --> 00:30:51.175
You just kind of walk around and go, and
it's kind of heavy to go lug one of these

00:30:51.279 --> 00:30:54.282
big things around.
So let's go from our largest device to our

00:30:54.620 --> 00:30:57.870
smallest device, which is our phone, and
it's the most portable, so I can bring it

00:30:57.986 --> 00:30:58.823
with me.

00:30:59.067 --> 00:31:03.115
So here, I'm going to launch
the same exact application.

00:31:03.395 --> 00:31:07.624
And what you'll notice is, it
has automatically adapted its user experience

00:31:07.995 --> 00:31:11.520
to run on the smaller form factor and
look appropriate on this device.

00:31:12.118 --> 00:31:15.872
And basically, the map is now at the
top and the list at the bottom.

00:31:16.196 --> 00:31:18.020
The menu is now in overlay mode.

00:31:18.446 --> 00:31:21.605
All of that very straightforward,
so let's go see here.

00:31:22.103 --> 00:31:27.604
Go into capture, and you'll see here we
have a new camera API that allows you to

00:31:27.822 --> 00:31:31.870
go into a preview mode and take a picture.
And this conveniently located end table

00:31:32.105 --> 00:31:35.735
over here is a perfect one that I think
I'll put maybe in my living room.

00:31:36.002 --> 00:31:37.499
So I'll just go, I'll take a picture of that.

00:31:38.347 --> 00:31:42.330
And I'm able to go say, hey, tell my wife,
I think this would be great for maybe

00:31:42.468 --> 00:31:44.003
a bedroom or a living room or something like that.

00:31:44.546 --> 00:31:49.406
So let me now show you the code that
we wrote to build that adaptive user

00:31:49.621 --> 00:31:52.397
experience that we've been talking
so much about at this conference.

00:31:53.768 --> 00:31:58.647
So I'm going to pop back here to the XAML
that I have in that planning page.

00:31:59.132 --> 00:32:04.683
So what I didn't show you above this is
right here, right above the map and the

00:32:04.914 --> 00:32:07.653
list, they're inside of a relative panel.

00:32:07.932 --> 00:32:12.045
Relative panel is a new layout container
that we've created that really provides

00:32:12.322 --> 00:32:17.722
a lot of the magic behind the adaptive user experience.
It allows you as developers to either

00:32:18.197 --> 00:32:23.409
dock items -- items inside of it to each
other or to the side, to the top, bottom,

00:32:23.650 --> 00:32:26.522
and give you a lot of flexibility
in setting attributes.

00:32:26.972 --> 00:32:31.858
Above this, I have set up a few visual
state groups with adaptive triggers that

00:32:32.117 --> 00:32:34.452
David talked about.
And so I have two states.

00:32:34.717 --> 00:32:37.423
One, when it's between 0 and 599 pixels,

00:32:37.649 --> 00:32:42.253
and then when it's 600 pixels and above.
So my narrow state is that smaller one,

00:32:42.602 --> 00:32:46.384
and so basically, my adaptive trigger says,
hey, when it's zero, then we'll go

00:32:46.596 --> 00:32:50.599
less than the other one.
It will go and do a bunch of setters.

00:32:50.970 --> 00:32:55.652
What these setters do is it makes the map
go above and the list below and then take

00:32:55.807 --> 00:33:01.653
the full width of the screen.
When it's 600 pixels, this adaptive

00:33:01.757 --> 00:33:06.714
trigger will fire and apply these setters.
And these setters do what you see on the

00:33:06.854 --> 00:33:11.730
screen over here, the map on the left-hand
side and the list on the right-hand side,

00:33:11.904 --> 00:33:13.727
and then they take up the full height.

00:33:13.911 --> 00:33:18.193
So here you can set up a bunch of adaptive
triggers based on the size or any other

00:33:18.325 --> 00:33:21.572
attributes and adapt the user experience
very straightforwardly.

00:33:21.924 --> 00:33:25.374
Here's where it provides all the magic,
relative panel plus adaptive triggers,

00:33:25.661 --> 00:33:27.194
plus the Visual State Manager.

00:33:27.413 --> 00:33:30.456
And that gives you all that richness that
you've seen in all these different user

00:33:30.620 --> 00:33:31.995
experiences over the last few days.

00:33:32.622 --> 00:33:37.760
So now that we've taken the photos, and
we have a bunch of those that we've

00:33:38.002 --> 00:33:41.963
collected, it's really about arranging
those photos and deciding you want to

00:33:42.080 --> 00:33:43.738
create storyboards for different rooms.

00:33:43.982 --> 00:33:47.811
Now, when I think about going and
creating a storyboard and kind of

00:33:48.181 --> 00:33:52.390
manipulating lots of different pictures
and photos, I think a desktop is a much

00:33:52.688 --> 00:33:57.286
better device for doing that, use a mouse,
my keyboard, maybe to type things.

00:33:57.449 --> 00:33:58.858
So I'm going to move over to my desktop

00:34:00.710 --> 00:34:03.972
and show you the same exact
application running here.

00:34:04.812 --> 00:34:08.666
And what you'll notice in this organized
phase, first of all, is we're using a pivot.

00:34:09.111 --> 00:34:11.998
This is, as David said, we've added
pivot now to the desktop.

00:34:12.108 --> 00:34:15.832
This is a great user control to be able
to view the rooms and then be able to

00:34:16.078 --> 00:34:18.228
assign different things to different rooms,
so I can pivot between each of the

00:34:18.365 --> 00:34:21.710
rooms, and I start to create storyboards
for each of these, and it works very

00:34:21.825 --> 00:34:22.988
nicely with touch, as well.

00:34:23.292 --> 00:34:27.410
And then I think the right way to do this
is really to use a drag-and-drop metaphor,

00:34:27.850 --> 00:34:29.764
where I'll go to my living room,
and I'll say, you know what?

00:34:30.056 --> 00:34:32.564
I don't really like this, I'm going to
remove that, so I use right-click.

00:34:32.805 --> 00:34:35.476
That works natural.
Then I'll just drag in another one

00:34:35.722 --> 00:34:38.368
and say, you know, I want this instead.
So here are the floors that I think would

00:34:38.557 --> 00:34:43.477
be great for it.
I'll go to my master bedroom, say I think fireplace.

00:34:43.727 --> 00:34:46.370
Don't you think I should have a
fireplace in my master bedroom?

00:34:46.734 --> 00:34:49.166
I think it would be great to have
a fireplace in my master bedroom.

00:34:49.327 --> 00:34:50.879
So I drag that in there, as well.

00:34:51.133 --> 00:34:56.192
So now I have -- able to basically add
a few things here, but on the desktop,

00:34:56.523 --> 00:34:58.361
it's not just about the single application.

00:34:58.521 --> 00:35:02.728
It's about using multiple applications
and really multiple windows, like David said.

00:35:03.175 --> 00:35:08.078
So I'm also able to support drag and drop
between applications, so here we have the

00:35:08.193 --> 00:35:12.288
photo application that's built in, but
you could also use the File Explorer.

00:35:12.559 --> 00:35:17.680
So if you had something on an SD card, or
if you had a WPF or Win32 application,

00:35:17.958 --> 00:35:22.071
all of those would work as well.
So we can now drag in, and this will go

00:35:22.367 --> 00:35:26.482
take this bitmap that I had, or this JPEG
I think it is, and it will go and import

00:35:26.482 --> 00:35:28.594
it in here and add it to the
filmstrip at the bottom.

00:35:28.850 --> 00:35:31.761
It allows me to do some of the palate
that I'm choosing from for my rooms.

00:35:32.098 --> 00:35:35.456
So now I'm going to go back to Visual Studio
and show you how I implemented all

00:35:35.878 --> 00:35:37.338
of that drag-and-drop functionality.

00:35:41.456 --> 00:35:45.158
So I'm going to move over to my organize
page, and this is the code behind that

00:35:45.405 --> 00:35:49.399
I've got, so I have a handler called grid
drop, so whenever I drop it onto that

00:35:49.536 --> 00:35:51.210
grid, this fires.

00:35:51.450 --> 00:35:54.206
It's the same exact function that fires
whether or not I've dragged it from with

00:35:54.532 --> 00:35:57.202
inside the app or from outside,
from a different application.

00:35:57.685 --> 00:36:00.206
But I get different content.
When I dragged it from outside the

00:36:00.538 --> 00:36:05.046
application, I got a bitmap or I got
a JPEG or some sort of image format.

00:36:05.374 --> 00:36:09.011
But when I dragged it from inside, I had
already a furniture that I had defined in

00:36:09.256 --> 00:36:10.532
my collection there.

00:36:10.937 --> 00:36:12.689
So I detect those in two different ways.

00:36:12.854 --> 00:36:16.463
So when it comes in here, it's one
of the -- it's a storage item.

00:36:16.618 --> 00:36:20.969
Then I'm going to know it came from outside.
So let me drop in the code here and show

00:36:21.123 --> 00:36:25.859
you how I add it to the list of furnitures.
So I go and find if there are any items,

00:36:26.252 --> 00:36:29.283
and then I go and I get the bitmap.
I import it.

00:36:29.411 --> 00:36:32.010
So whatever format.
We have a bunch of decoders built into

00:36:32.290 --> 00:36:35.053
the platform, and they will
automatically decode it.

00:36:35.285 --> 00:36:38.965
Then I have three different attributes
on every furniture item, which is a name,

00:36:39.254 --> 00:36:41.323
a description, and then I have this ID that

00:36:41.576 --> 00:36:44.528
I have, and it gives it a unique identifier
for every piece of furniture,

00:36:44.734 --> 00:36:48.100
and I actually use that later on so that
I don't have more than one copy,

00:36:48.452 --> 00:36:50.260
because nobody wants more than one copy of everything.

00:36:50.503 --> 00:36:53.858
And then I set the image, and then all I
do is add it to the list of captured images.

00:36:54.624 --> 00:36:58.888
If I actually am dragging it from within
the application -- I have some code here

00:36:59.050 --> 00:37:03.091
I've written.
Here, I pass -- the way I do that is I

00:37:03.323 --> 00:37:07.456
reference just the unique identifier of
the furniture, and then I want to assign

00:37:07.655 --> 00:37:09.593
it to a specific room in the pivot.

00:37:09.976 --> 00:37:13.377
So I get that ID.
It was passed in during the drop operation.

00:37:13.724 --> 00:37:18.927
Then I go, ask which of the pivot tabs --
and those are the three rooms that I was

00:37:19.057 --> 00:37:22.409
having remodeled -- it was in.
And then I just add it to the list of

00:37:22.505 --> 00:37:24.811
captured images for that room.

00:37:25.055 --> 00:37:28.578
So very straightforward.
I was able to use drag and drop between

00:37:28.689 --> 00:37:32.326
applications or within my applications as
a great way to build an experience that

00:37:32.686 --> 00:37:34.530
felt natural for someone using a mouse.

00:37:35.656 --> 00:37:40.474
So now, once we kind of get through this
phase of we've kind of assigned painted

00:37:40.605 --> 00:37:45.253
storyboards for each room, what we also
like to do is kind of do a slideshow.

00:37:45.519 --> 00:37:48.812
How do I get a feeling for what that
room's going to feel like and the

00:37:48.915 --> 00:37:52.259
characteristics of that room? So here,
I'm going to go back and get

00:37:52.445 --> 00:37:54.606
this side.
We have a slideshow mode, where if I hit

00:37:54.868 --> 00:37:56.975
this, it will cycle through all the photos

00:37:57.262 --> 00:38:01.606
of the captured images for that room, so I
can get a feel for the aesthetic and say,

00:38:01.759 --> 00:38:03.256
yes, do they all match or do they not match?

00:38:03.578 --> 00:38:08.492
While this is great to do for my room,
I think it's great also for this customer.

00:38:08.643 --> 00:38:11.126
I was thinking, well, if they could build
some kiosks and have some of these

00:38:11.405 --> 00:38:15.654
pre-done, some area of their showroom
that says, okay, here's the kitchens,

00:38:15.932 --> 00:38:19.276
over here, here's the living room, or
here's a different type of aesthetic,

00:38:19.400 --> 00:38:22.490
like traditional, they can have these dedicated kiosks.

00:38:22.781 --> 00:38:25.977
That would kind of advertise some of
the ways that their aesthetics works

00:38:26.254 --> 00:38:29.811
and attract more of their customers and
excite them and give them maybe some ideas.

00:38:30.182 --> 00:38:33.606
And I think the best way to do that
is with some dedicated devices.

00:38:34.090 --> 00:38:37.656
So I suggested we use a Raspberry Pi 2

00:38:38.141 --> 00:38:42.534
with Windows IoT Core running on it, because
I can run the exact same application.

00:38:42.828 --> 00:38:48.366
What you see here is a Raspberry Pi, and I
have a proximity sensor hooked up to it,

00:38:48.794 --> 00:38:51.049
so it can tell if someone
walks over to the room.

00:38:51.201 --> 00:38:53.462
I can give them a custom experience
as they do that.

00:38:53.601 --> 00:38:56.249
So let me show you here running,
because I have one running here.

00:38:56.379 --> 00:39:00.394
So when I walk in front of it, you'll
see that it will detect me.

00:39:00.569 --> 00:39:02.629
I'm here.
And it will start the slideshow, and it

00:39:02.852 --> 00:39:06.524
will start rotating through several of the images.
And then as I move closer, it'll say,

00:39:06.682 --> 00:39:09.404
well, I know they're closer, so I'll get
denser, and even closer, it will get even

00:39:09.580 --> 00:39:12.825
more dense.
When I move away -- good, I'm glad it worked.

00:39:13.778 --> 00:39:19.653
Those things are -- it's always
nice when they do.

00:39:20.141 --> 00:39:22.302
And it will just turn off when I'm
not in front of it anymore.

00:39:22.533 --> 00:39:24.647
So that would be great.
And the nice thing about it is,

00:39:24.901 --> 00:39:28.225
since it's the Universal Windows Platform,
it runs on those devices, as well.

00:39:28.604 --> 00:39:32.337
So let me hop over and show you the code
that I wrote to talk to that sensor.

00:39:34.673 --> 00:39:37.978
So let me move over to my sensor code here.

00:39:38.453 --> 00:39:42.597
And so that's a little bit of special
code there that, in the past, if you were

00:39:43.025 --> 00:39:46.344
running on anything other than Windows 10,
you would have had to go write a driver

00:39:46.697 --> 00:39:49.702
and you'd have to talk to this special
bus and add a bunch of support.

00:39:49.933 --> 00:39:54.021
It was a fairly complex amount of code.
But with Windows 10, we now directly

00:39:54.299 --> 00:39:56.727
support talking to these various different buses.

00:39:57.098 --> 00:40:02.401
And so here, I'm talking to an I2C bus.
And so what I need to do is in my

00:40:02.626 --> 00:40:05.226
function here, the first thing I'm going
to do is enumerate the devices that are on

00:40:05.454 --> 00:40:07.896
the bus.
And then I will establish a connection,

00:40:08.131 --> 00:40:10.052
and a lot of this information
comes from the device.

00:40:10.344 --> 00:40:11.297
Got to read the manual.

00:40:11.666 --> 00:40:14.535
You can try and guess the parameters here,
but typically, read the manual and get the

00:40:14.654 --> 00:40:17.905
SDK for it.
And then set up a timer that will go

00:40:18.137 --> 00:40:20.853
and sample that periodically.
Now, once I have all of those samples,

00:40:21.104 --> 00:40:25.103
then I can go hook up how close
I was and how fast it changed.

00:40:25.337 --> 00:40:29.500
And then I can recreate that behavior.
Very straightforward, easy code now that

00:40:29.670 --> 00:40:31.453
we have support for all these buses in the

00:40:31.648 --> 00:40:35.249
Universal Windows Platform.

00:40:36.271 --> 00:40:40.646
Now, once we've kind of set up all these
things in the showroom, the most important

00:40:40.901 --> 00:40:44.500
thing is the presentation.
They will go off, they'll finalize it,

00:40:44.755 --> 00:40:48.103
they'll do some sketches, and they'll come
back with a design, and they've got to

00:40:48.216 --> 00:40:50.455
close the deal.
They want the best presentation that they

00:40:50.794 --> 00:40:54.569
can possibly set up.
So we think the best way to present that

00:40:54.753 --> 00:40:59.850
is on a large-screen TV, because we all
watch our home remodeling shows, don't we, right?

00:40:59.968 --> 00:41:02.206
Everybody watch those? And they're
always on our TV, so that's

00:41:02.344 --> 00:41:03.910
kind of the best way to go present it.

00:41:04.096 --> 00:41:09.847
So here, I've chosen to show this on an
Xbox One running on the TV here that you

00:41:10.102 --> 00:41:12.406
can show on a TV.
And so I'm going to run the application,

00:41:12.653 --> 00:41:16.704
and again, because it's part of the
Universal Windows family, it can run any

00:41:17.055 --> 00:41:18.995
app that was built to Universal Windows Platform.

00:41:19.353 --> 00:41:22.698
And so I'm going to go into presentation
mode here, and here we've got a sketch of

00:41:22.830 --> 00:41:25.345
a 3D model.
That's the room, and so you can go present

00:41:25.452 --> 00:41:29.550
that, and they can look around and see the
different rooms and whether they like them

00:41:29.736 --> 00:41:32.951
or not, and sure it's a little void right
now, because I'm really not very good at

00:41:33.204 --> 00:41:35.819
designing, but a nice, great experience.

00:41:36.071 --> 00:41:39.650
But I was thinking, if you want to be the
best one out there, you want the best

00:41:39.812 --> 00:41:43.401
experience for your customers, there's
another device in the Windows family that

00:41:43.747 --> 00:41:47.807
will provide an even better experience?
Can you join me in welcoming Felicia from the

00:41:48.226 --> 00:41:53.938
HoloLens team out here to show you this
same exact app running on the HoloLens?

00:41:59.011 --> 00:42:04.503
And so what you'll see here is the same
app that we wrote runs on the HoloLens,

00:42:04.911 --> 00:42:07.602
because Windows Holographic is Windows 10.

00:42:07.753 --> 00:42:11.990
And so here we have the same exact model,
and she is able to look at it, walk around

00:42:12.227 --> 00:42:16.626
it, look at the flooring.

00:42:17.356 --> 00:42:21.631
See, it looks a lot nicer than it did on
the Xbox, and kind of just look around

00:42:21.863 --> 00:42:25.414
this and get just a great experience
using the same exact application.

00:42:25.918 --> 00:42:29.394
Now, of course, we probably would have
gone and built a more customized

00:42:29.641 --> 00:42:33.301
experience, something that she could be
immersed in and walk through it, and that

00:42:33.549 --> 00:42:36.462
would be all great, but I wanted to show
this exact same app running to show you

00:42:36.742 --> 00:42:40.841
that a very simple app can be moved over
to the HoloLens just as easy as any app

00:42:41.027 --> 00:42:43.306
can move among any of the device families.
Thank you, Felicia.

00:42:43.502 --> 00:42:44.277
I appreciate it.

00:42:47.838 --> 00:42:50.815
So what I'm going to show you is the actual
code that we wrote to make that

00:42:51.036 --> 00:42:54.633
work on the HoloLens versus
what we had on the Xbox.

00:42:54.865 --> 00:42:57.862
So before I jump into that, I want to explain
a little bit about how the camera works.

00:42:58.358 --> 00:43:03.550
In HoloLens, the camera moves all the time.
Whenever the person's head moves or tilts

00:43:04.037 --> 00:43:07.959
or they move around, you must keep up the
camera, or the object will not look correct.

00:43:08.356 --> 00:43:11.431
In the past, the camera has been controlled
by the developer or the

00:43:11.558 --> 00:43:14.499
programmer in most cases.
But here, it's controlled by the end

00:43:14.636 --> 00:43:19.503
user, and so it's also a stereoscopic camera.
You have left and right eye, whereas on

00:43:19.757 --> 00:43:23.104
the Xbox, the flat 2D.
So the camera on the Xbox, the 3D model

00:43:23.356 --> 00:43:27.558
is the same -- it's the same exact 3D model.
But the camera was a fixed 2D camera that

00:43:27.956 --> 00:43:32.143
would take it, create an image from
the three-dimensional object and then show

00:43:32.261 --> 00:43:35.073
that on the screen.
On here, we're going to have to keep

00:43:35.352 --> 00:43:39.353
updating it with the left and right
eye and update the parameters.

00:43:39.587 --> 00:43:43.182
So simply on each update -- this update
gets called whenever she moved or looked

00:43:43.324 --> 00:43:45.727
around or tilted.
And I need to go update the left and the

00:43:45.849 --> 00:43:49.731
right eye, so I'll read those from
the HoloLens, and I'll update those parameters

00:43:50.041 --> 00:43:52.589
in my rendering loop.
And then I need to go update the rendering

00:43:52.716 --> 00:43:56.583
resources and the shaders based
on those new camera positions.

00:43:56.733 --> 00:43:59.598
So this goes and now creates an interactive
experience where she can walk

00:43:59.868 --> 00:44:03.132
around and see and interact with that model.
So fairly straightforward for a very

00:44:03.265 --> 00:44:05.835
simple application.
Obviously, for some of the more advanced

00:44:05.943 --> 00:44:08.993
stuff we saw yesterday, it's a little bit
more of an investment in code, but then

00:44:09.145 --> 00:44:10.585
you get a lot more benefit for the customer.

00:44:10.931 --> 00:44:14.961
So I've kind of gone through a lot of devices
and shown you the same exact app

00:44:15.194 --> 00:44:19.960
running on all of them, but the goal really
being that it was centered around

00:44:20.094 --> 00:44:22.566
the user.
They were able to use that app with the

00:44:22.712 --> 00:44:26.129
right device that made sense for the task
and the part of the operation that they

00:44:26.237 --> 00:44:28.591
were doing.
And they can provide -- this company can

00:44:28.882 --> 00:44:30.332
provide -- a great experience for their

00:44:30.642 --> 00:44:34.731
customers and really could differentiate
versus the competition.

00:44:35.083 --> 00:44:36.033
Thanks.  Back to you, Dave.

00:44:43.095 --> 00:44:46.343
>> Great job, Kevin.
One app across all the devices.

00:44:46.586 --> 00:44:47.656
It's really pretty remarkable.

00:44:49.291 --> 00:44:54.588
Visual Studio 2015 makes it easier not
just to develop your apps but to debug

00:44:54.791 --> 00:44:55.647
them, as well.

00:44:56.582 --> 00:45:02.482
The improved XAML Designer makes it easy
to review and adapt your UI for each device.

00:45:03.330 --> 00:45:08.846
You can jump between phone, desktop and
other views of your same XAML layout in line.

00:45:10.409 --> 00:45:13.443
The new live visual tree lets you select,

00:45:13.813 --> 00:45:17.987
inspect and edit elements in real
time in your running app.

00:45:18.782 --> 00:45:22.990
It's like browser F12 tools for app development.
It's so cool.

00:45:24.090 --> 00:45:27.730
Visual Studio pushes the state of the art
at diagnosing performance issues by

00:45:28.038 --> 00:45:31.790
allowing you to identify performance
issues without even leaving the debugger.

00:45:32.891 --> 00:45:36.134
You can see how long code takes
to execute through perf tips.

00:45:36.526 --> 00:45:40.254
You can visualize your app's CPU and
memory utilization through the CPU

00:45:40.408 --> 00:45:41.553
and memory graphs.

00:45:42.039 --> 00:45:45.641
All this without having to switch and
run a separate profiling tool.

00:45:46.614 --> 00:45:51.482
Windows 10 makes it simple to distribute
a Universal Windows app and offers more

00:45:51.590 --> 00:45:56.837
powerful insights into your app's usage.
There's one submission process for all devices.

00:45:57.302 --> 00:46:00.392
There's one set of certification
policies to go through.

00:46:00.872 --> 00:46:03.327
No other platform makes it this easy to

00:46:03.574 --> 00:46:07.462
distribute your app to such
a broad range of devices.

00:46:09.032 --> 00:46:13.274
New features from the store let you analyze
your usage and monetize your apps.

00:46:14.236 --> 00:46:18.785
App insights are integrated right into
your apps and dev account, enabling you to

00:46:19.030 --> 00:46:23.117
answer questions like, how many users
are getting stuck in a level of a game?

00:46:23.974 --> 00:46:26.553
How is a specific feature actually being used?

00:46:27.890 --> 00:46:32.587
Campaign attribution lets you compare the
success of your app marketing strategies

00:46:32.833 --> 00:46:37.442
and get your data within a few hours, so
you can adjust your strategy in real time.

00:46:40.122 --> 00:46:43.983
So that's how the Universal Windows Platform
on Windows 10 helps you design,

00:46:44.466 --> 00:46:47.524
debug, develop and distribute your app.

00:46:48.773 --> 00:46:52.274
Those of you that have already bet on
the Universal Windows Platform can benefit

00:46:52.545 --> 00:46:54.232
from all of that in Windows 10.

00:46:55.572 --> 00:46:59.317
For those of you who don't yet have
Universal Windows apps, let's talk about

00:46:59.548 --> 00:47:01.231
how we're going to help you get your code

00:47:01.602 --> 00:47:03.273
to the Universal Windows Platform.

00:47:04.885 --> 00:47:08.783
We all know the best apps are the
ones developers have poured their blood,

00:47:08.899 --> 00:47:10.126
sweat and code into.

00:47:11.433 --> 00:47:15.730
The whiteboard sessions working through
your app's design, the late nights,

00:47:15.986 --> 00:47:18.435
hunting down and fixing that gnarly bug,

00:47:19.573 --> 00:47:23.828
the excitement and anticipation of pushing
out each flight -- it's not just your

00:47:24.033 --> 00:47:29.350
code, but all that has gone into your code,
that ultimately makes your app what

00:47:29.582 --> 00:47:30.525
it is.

00:47:31.773 --> 00:47:35.667
At Microsoft, we live and breathe developers.

00:47:36.177 --> 00:47:37.956
We recognize this fundamental truth --

00:47:38.326 --> 00:47:41.526
your code is the soul of your app,

00:47:42.631 --> 00:47:44.100
and that's why we're so passionate about

00:47:44.486 --> 00:47:49.559
building Universal Windows Platform bridges
that let you start with your code,

00:47:50.285 --> 00:47:54.960
no matter where it was born, and bring it
to the Universal Windows Platform and store.

00:47:57.004 --> 00:48:00.179
The first bridge that we're going to talk
about today is how you can bring your web

00:48:00.433 --> 00:48:01.635
code to Windows 10.

00:48:02.284 --> 00:48:04.129
There's a new web rendering engine,

00:48:04.368 --> 00:48:07.992
Microsoft EdgeHTML, that's
built for the modern web.

00:48:08.838 --> 00:48:13.242
It powers both the new Microsoft Edge Browser
that Joe showed yesterday, as well

00:48:13.552 --> 00:48:15.526
as web content in Universal Windows apps.

00:48:16.977 --> 00:48:21.671
Microsoft Edge leaves behind all of the
Internet Explorer behaviors -- all of the

00:48:22.120 --> 00:48:25.391
behaviors specific to Internet Explorer
that have been built up in the last 20 years.

00:48:26.726 --> 00:48:29.123
And it has over 4,200 interoperability

00:48:29.376 --> 00:48:34.126
improvements to ensure that the web just works.

00:48:35.320 --> 00:48:37.247
For developers, this means less time

00:48:37.638 --> 00:48:40.267
fixing up your web apps to work across browsers.

00:48:43.203 --> 00:48:49.242
Microsoft EdgeHTML also features over 45
new web standards, including HTTP2,

00:48:49.695 --> 00:48:52.354
Web Audio and a bunch more that you can see here.

00:48:53.135 --> 00:48:54.613
This is just a snapshot.

00:48:54.937 --> 00:48:58.361
We've been doing our Microsoft EdgeHTML
planning in the open, with new features

00:48:58.617 --> 00:49:01.284
coming into Windows Insider builds each month.

00:49:03.096 --> 00:49:04.527
While improving interoperability

00:49:04.788 --> 00:49:10.331
and adding new features to EdgeHTML, we didn't
forget to pay attention to performance.

00:49:11.688 --> 00:49:15.439
On the JetStream benchmark created by
Apple, which simulates complex web

00:49:15.684 --> 00:49:20.443
applications, Edge HTML is over
1.5 times faster than IE 11.

00:49:21.695 --> 00:49:24.929
Beyond that, it's also ahead of
the latest 64-bit browsers.

00:49:27.013 --> 00:49:31.844
Next, on Google's Octane benchmark, created
by Google, Microsoft Edge is over

00:49:31.962 --> 00:49:33.759
twice as fast as IE 11.

00:49:34.695 --> 00:49:39.814
And again, Microsoft Edge leapfrogs into
the lead ahead of the other 64-bit browsers.

00:49:41.466 --> 00:49:45.564
Rest assured that great web performance
will continue to be a priority for us.

00:49:47.378 --> 00:49:51.726
Beyond making the web run great on the
browser itself, Windows 10 provides

00:49:51.865 --> 00:49:55.040
a powerful new path for sites to become apps.

00:49:56.292 --> 00:50:00.880
With Windows 10, you can reuse your
existing website code and create an app

00:50:01.297 --> 00:50:03.816
that points directly to your URL.

00:50:04.863 --> 00:50:08.262
You don't need to rewrite your server
code into packaged client code.

00:50:08.736 --> 00:50:12.815
You can access Universal Windows Platform
APIs directly from the web code that came

00:50:13.082 --> 00:50:16.460
down from your server, and you can distribute
the app you've made in the

00:50:16.689 --> 00:50:17.866
Windows Store.

00:50:18.630 --> 00:50:22.954
This new path is fully integrated
into your existing web workflow.

00:50:23.480 --> 00:50:28.176
You can continue to use the same tools,
libraries and services that you use today.

00:50:29.275 --> 00:50:33.376
You can continue to deploy to
your servers to make updates.

00:50:33.873 --> 00:50:36.747
Kevin, show us how to make
a website into an app.

00:50:37.023 --> 00:50:38.463
>> Great.
Thanks, Dave.

00:50:38.867 --> 00:50:41.028
I have here a website that I've built,

00:50:41.317 --> 00:50:45.035
and I'm going to show you how I've made
it into that hosted web app here.

00:50:45.497 --> 00:50:47.945
First, I'm going to show you the
site running in Microsoft Edge.

00:50:48.350 --> 00:50:50.951
It's a Flight Arcade app, flight simulation,
kind of cool to play.

00:50:51.521 --> 00:50:53.427
And so here I'll just go start,

00:50:53.915 --> 00:50:59.022
and you'll notice here that it's
a beautiful-looking app, great graphics.

00:50:59.467 --> 00:51:02.237
It's also got great audio, because audio's
got to be there in every game to

00:51:02.498 --> 00:51:06.262
be cool, but this audio here is actually
using that Web Audio, and as you hear me

00:51:06.522 --> 00:51:10.424
throttle up and down, it's actually a
single audio file that we have that we're

00:51:10.532 --> 00:51:12.097
using Web Audio to modulate.

00:51:12.280 --> 00:51:16.500
But I'm really not very good.
My team told me not to fly, but I've got

00:51:17.144 --> 00:51:21.232
a game controller here, and we've hooked
this up to the new game pad support that

00:51:21.470 --> 00:51:28.508
we have in Microsoft EdgeHTML, and so I'm
able here to try -- I like to fly fast and loose.

00:51:28.741 --> 00:51:32.751
And not very good.
So we'll kill that before I go crashing

00:51:32.867 --> 00:51:33.832
into the Earth.

00:51:34.547 --> 00:51:37.866
Now, there's a couple other features that
I wanted to add that really weren't

00:51:38.070 --> 00:51:41.900
available on the web platform.
One is integration with Xbox Live, and so

00:51:42.065 --> 00:51:47.498
here, I'm going to launch the same app,
the same site, but hosted inside of an application.

00:51:47.748 --> 00:51:51.985
So I've already deployed the application
here, and when I run it, it logged me into

00:51:52.143 --> 00:51:54.552
Xbox Live.
I had my cached credentials from the

00:51:54.668 --> 00:51:57.152
machine, and it automatically
just logged me right in.

00:51:57.374 --> 00:52:02.227
The second feature that I wanted to go add
is Cortana integration, the ability to

00:52:02.470 --> 00:52:04.144
launch this application using Cortana.

00:52:04.431 --> 00:52:10.308
So I use Sublime to edit, and I
also use Git as my repository.

00:52:10.598 --> 00:52:14.548
So what I'm going to do here is edit the code.
I'm going to submit it to Git.

00:52:14.826 --> 00:52:18.752
It will publish it back up to Git, and now
I have it automatically deployed to my

00:52:18.888 --> 00:52:21.662
web server.
I'm not going to reinstall the application.

00:52:21.807 --> 00:52:24.832
I'm just going to rerurn it,
and automatically, it's got all that

00:52:24.950 --> 00:52:28.185
functionality with no update, no ingestion
process or anything like that.

00:52:28.675 --> 00:52:34.099
So here, let me uncomment the code. Save.

00:52:41.915 --> 00:52:44.341
Adding Cortana support.

00:52:52.442 --> 00:52:53.989
Wait for that to go work.

00:52:54.881 --> 00:52:59.911
There we go.
And now, I can go to Cortana and say,

00:53:00.082 --> 00:53:03.881
Flight Arcade, go to waypoint alpha, bravo.

00:53:08.732 --> 00:53:11.438
>> Okay, going to alpha, bravo in Flight Arcade.

00:53:12.530 --> 00:53:17.869
>> And so you can see here that I was able
to launch the application using Cortana,

00:53:18.192 --> 00:53:22.076
go to a certain point that it deep linked inside.
I had set that up automatically, and it

00:53:22.191 --> 00:53:26.105
did also that integration with Xbox Live,
and of course, my team set it up so that

00:53:26.336 --> 00:53:28.393
by doing nothing, I can get an achievement.

00:53:29.994 --> 00:53:32.733
Everybody want that? Everybody gets
an achievement doing nothing.

00:53:34.090 --> 00:53:37.841
So there you go, very simple, able to go
do that and continue in the developer

00:53:37.985 --> 00:53:40.347
workflow that web developers
are typically used to.

00:53:40.444 --> 00:53:42.112
Back to you, Dave.
>> Thanks, Kevin.

00:53:43.787 --> 00:53:45.632
Let's shift gears, to use a Guggs-ism.

00:53:46.592 --> 00:53:50.138
Was everyone here at PDC in 2003
when we introduced WPF?

00:53:52.191 --> 00:53:55.384
How about 2000, when we introduced
Windows Forms?

00:53:56.185 --> 00:54:00.504
Still a few hands.
Let's go way back, 1992, Win32?

00:54:01.525 --> 00:54:02.729
All right.

00:54:03.370 --> 00:54:08.540
Later this year, Windows 10 will provide
a bridge for you to the Universal Windows

00:54:08.680 --> 00:54:09.734
Platform in store.

00:54:10.637 --> 00:54:14.771
Apps written to these classic platform
technologies will be able to be packaged

00:54:15.189 --> 00:54:17.456
and deployed with APPX.

00:54:17.835 --> 00:54:22.142
You'll get the same fast, safe, trusted
deployment as apps written to the

00:54:22.283 --> 00:54:23.495
Universal Windows Platform.

00:54:24.391 --> 00:54:25.941
You'll be able to distribute these apps

00:54:26.241 --> 00:54:27.789
via the Windows Store.

00:54:28.331 --> 00:54:29.878
You'll be able to call even more of the

00:54:30.134 --> 00:54:35.718
Universal Windows Platform APIs directly
from your existing code -- Live Tiles,

00:54:36.073 --> 00:54:38.480
notifications, Cortana, and more.

00:54:39.679 --> 00:54:42.521
Now, I'm going to turn it back over to Kevin
to show you how to use the Universal

00:54:42.745 --> 00:54:46.945
Windows Platform APIs from your existing code.

00:54:47.676 --> 00:54:49.942
>> Thanks, Dave.
So, of course, since I've written nearly

00:54:50.194 --> 00:54:53.227
all these platforms -- I've shown you web,
I've shown you Universal Platform, now,

00:54:53.354 --> 00:54:54.540
I'm going to show you a WPF.

00:54:55.033 --> 00:54:59.138
So let me just run it here, just to
give you kind of a look at it.

00:54:59.517 --> 00:55:02.792
It's a very simple application that I've
written, but basically, it's a personal

00:55:03.032 --> 00:55:06.984
trainer application that allows me to
track information about things that I eat

00:55:07.342 --> 00:55:10.945
and my workouts, my health information,
a bunch of different things.

00:55:11.557 --> 00:55:14.338
And what I want to do here is
add two specific features.

00:55:14.623 --> 00:55:19.078
One is a very simple feature, the ability
to just pop a toast, and I want to show

00:55:19.238 --> 00:55:22.122
you just how simple it is, to show it's
not a lot of complex work, just to call

00:55:22.345 --> 00:55:27.996
one of the new Universal APIs from a WPF application.
The second is one of our more complex ones.

00:55:28.369 --> 00:55:31.830
We've added a feature called App Services.
This is the ability for Universal

00:55:31.988 --> 00:55:35.881
applications to provide services to
other applications so they can call them,

00:55:36.346 --> 00:55:40.374
and they can basically work together
on different data and different services.

00:55:41.128 --> 00:55:42.546
So the first thing here is when I click

00:55:43.193 --> 00:55:45.595
the launch button, I just want to pop a toast.

00:55:45.877 --> 00:55:48.082
So it's very simple code.
It's three lines here.

00:55:48.315 --> 00:55:50.743
First, you'll notice that I had
added some namespaces up here.

00:55:50.881 --> 00:55:53.520
Otherwise, it wouldn't compile.
These are just the Universal API

00:55:53.738 --> 00:55:58.032
namespaces that I use.
Then, for the toast, I go, I get the XML

00:55:58.032 --> 00:56:00.138
for it.
I create a new toast, and then I just

00:56:00.275 --> 00:56:02.521
say, show a toast.
So let me run this code.

00:56:06.877 --> 00:56:09.230
And so when I click launch, this will pop

00:56:09.400 --> 00:56:11.148
what we call an interactive toast.

00:56:11.327 --> 00:56:15.924
This toast actually allows me to open an
application from it, so what I did is I

00:56:16.028 --> 00:56:19.155
popped this here, and the XML said open
the Microsoft Health application.

00:56:19.457 --> 00:56:22.123
So I'm going to click on that, and
it actually opens this app here.

00:56:22.854 --> 00:56:28.036
This is a sample app that allows you
to gather information from the Microsoft

00:56:28.277 --> 00:56:31.516
Band, and I've been wearing that for
a while, so it's tracked my heart rate

00:56:31.878 --> 00:56:38.017
and different things that it tracks, and so it
has also an app service that we've implemented.

00:56:38.573 --> 00:56:41.397
And so what I want to do is be able to
call that app service to get all that

00:56:41.502 --> 00:56:43.078
information from the last week.

00:56:43.277 --> 00:56:47.647
The nice thing about App Services is I don't
need this app running to be able to talk to it.

00:56:47.885 --> 00:56:51.573
So I'm going to close the application,
and then when this calls it, it will just

00:56:52.060 --> 00:56:53.742
directly connect to the application in the background.

00:56:54.227 --> 00:56:58.179
So here is I'm going to get my click handler
for that start button that I had

00:56:58.422 --> 00:57:02.576
in there, and I'm going to pop the service
here, talk to the code here, talk to that service.

00:57:02.949 --> 00:57:06.474
So the first thing I do is I establish a connection.
I do a strong connection here.

00:57:06.746 --> 00:57:09.555
I want to know that I'm talking specifically
to that application.

00:57:09.878 --> 00:57:13.666
So I have a GUID here and an App Service
name, and then I just establish the connection.

00:57:14.277 --> 00:57:18.458
The next thing I want to do is send it
a message, so I want to send it a message to

00:57:18.578 --> 00:57:23.550
get the past week's data, so I send it
this message here, I do an await here,

00:57:23.779 --> 00:57:24.975
I send it asynchronously.

00:57:25.148 --> 00:57:29.770
And then when it's done, it comes back,
I update my user interface with the data

00:57:30.026 --> 00:57:34.437
that I got from it, so again,
very straightforward and not a huge amount of code.

00:57:36.269 --> 00:57:40.777
So here, I'm going to hit start, it
will take a few seconds, not even.

00:57:41.028 --> 00:57:44.032
And then it goes, it talks to that app service
in the background, and it's pulled

00:57:44.144 --> 00:57:47.868
that data and integrated it in directly
into my WPF application.

00:57:48.124 --> 00:57:50.906
So I've showed that you're able to do
very simple things with a few lines of

00:57:51.027 --> 00:57:54.086
code, or you can do one of the more
complex things, integrating with these App

00:57:54.288 --> 00:57:57.881
Services a brand-new feature with the
platform coming in Windows 10.

00:57:58.149 --> 00:57:59.759
Back to you, Dave.
>> Thanks, Kevin.

00:58:05.914 --> 00:58:09.863
Now, let's talk about the bridge we're
building to help you take your Android

00:58:10.108 --> 00:58:11.906
code and get it to Windows.

00:58:12.555 --> 00:58:16.530
You can reuse existing Java or C++ code
you've written for your Android app.

00:58:16.864 --> 00:58:20.756
You can continue to work in your existing
tools, even using Android Studio to

00:58:21.031 --> 00:58:22.262
produce the app for Windows.

00:58:24.551 --> 00:58:28.150
When you make the app for Windows, function
calls and even services route to

00:58:28.322 --> 00:58:30.611
deliver the correct Windows experience.

00:58:31.432 --> 00:58:36.301
You can update your code to take advantage
of key features of the Universal Windows

00:58:36.557 --> 00:58:37.983
Platform, like Live Tiles.

00:58:38.236 --> 00:58:42.184
You can distribute your app through the
Windows Store to phones running Windows 10.

00:58:42.438 --> 00:58:43.615
Let's take a look.

00:58:46.284 --> 00:58:51.544
Yesterday, you saw how you can start with
code you wrote for Android to create an

00:58:51.672 --> 00:58:55.945
app for Windows that integrates with Windows
shell features like keyboard,

00:58:56.176 --> 00:58:57.779
touch, and navigation.

00:58:58.401 --> 00:59:01.557
Today, I'd like to show you how starting
with your Android code you can integrate

00:59:01.830 --> 00:59:04.025
with some more advanced Windows capabilities.

00:59:05.277 --> 00:59:11.373
This app, Lose It, empowers people to
live healthier lives and achieve their

00:59:11.670 --> 00:59:14.630
goals through rich experiences and
insights about their lifestyle.

00:59:15.077 --> 00:59:18.635
This version of Lose It running on a Windows
10 Phone was built starting with

00:59:18.866 --> 00:59:20.430
the original Android code base.

00:59:21.482 --> 00:59:24.349
All this talk up on stage,
it's like exercise for me.

00:59:24.470 --> 00:59:26.223
I'm sweating a lot.
It's kind of fun.

00:59:26.582 --> 00:59:27.668
Let me log this exercise.

00:59:33.477 --> 00:59:36.125
You can see I have stage talk as a
regular exercise in addition to running

00:59:36.427 --> 00:59:39.179
and bicycling.
We're supposed to be up here about 45 minutes.

00:59:39.424 --> 00:59:41.380
We're going to be about that
by the time we're done.

00:59:42.824 --> 00:59:46.477
We'll go ahead and save.
Now we've got stage talk logged as an exercise.

00:59:47.322 --> 00:59:49.953
Terry and I, sometimes we're in
competition with our exercise.

00:59:50.118 --> 00:59:54.554
So I'm going to share this stage talk
workout that I did with Terry.

00:59:54.924 --> 00:59:58.615
This app is using the Windows share
contract instead of the default Android experience.

01:00:00.227 --> 01:00:02.726
If I were to click into messaging -- I'll
not actually send it to him, but you can

01:00:02.980 --> 01:00:05.262
see how it brings up the Windows
experience for sharing.

01:00:05.883 --> 01:00:10.598
This is just one example of how Windows
code to reuse -- Windows apps that reuse

01:00:10.766 --> 01:00:14.326
Android code and can interact
with other Windows apps.

01:00:15.982 --> 01:00:20.642
These apps can also use key Universal
Platform APIs like Live Tiles.

01:00:21.778 --> 01:00:24.905
If you look in the upper right on the screen,
you can see my start screen is

01:00:25.183 --> 01:00:30.004
a Live Tile for the sample app, Timber.
That's Timber with a B as in bravo.

01:00:30.984 --> 01:00:32.660
It occasionally changes state.

01:00:34.782 --> 01:00:38.679
Timber was another Windows app that was
also built starting with an Android code base.

01:00:39.208 --> 01:00:42.554
With just a few lines of code, it was
able to integrate a Live Tile.

01:00:46.276 --> 01:00:50.145
Apps can also integrate with Microsoft
Cloud Services with minimal effort.

01:00:51.129 --> 01:00:54.446
Here, Timber is showing me a map
of my favorite national park.

01:00:55.996 --> 01:01:00.672
Maps are one example of cloud services
that modern apps want to use.

01:01:01.033 --> 01:01:04.464
It was trivial for the developer to invoke
Bing Maps instead of Google Maps when

01:01:04.728 --> 01:01:05.799
running their code on Windows.

01:01:07.651 --> 01:01:11.402
Part of the bridge we're building for Android
code will include a rich SDK for

01:01:11.680 --> 01:01:15.883
Microsoft services in Java to make it easier
for developers reusing Android code

01:01:16.081 --> 01:01:17.754
to build a successful Windows app.

01:01:18.858 --> 01:01:21.283
And as far as tooling, I'm not going to
show you this right now, but there's

01:01:21.431 --> 01:01:25.346
a session later on today where you can learn
to reuse your current IDE and workflow to

01:01:25.577 --> 01:01:28.282
build great Windows apps from your Android code.

01:01:36.806 --> 01:01:39.326
That was a big step for us, in
case that wasn't obvious.

01:01:40.694 --> 01:01:45.039
Now, let me walk you through the Universal
Platform bridge for your iOS

01:01:45.186 --> 01:01:46.534
code as well.

01:01:47.126 --> 01:01:49.483
It lets you import an Xcode project into

01:01:49.657 --> 01:01:53.955
a Visual Studio solution while sharing the
exact same source code files across the

01:01:54.197 --> 01:01:55.437
two projects.

01:01:56.400 --> 01:02:00.930
You can work in the familiar, powerful
Visual Studio experience to edit, debug,

01:02:01.152 --> 01:02:03.122
profile and ultimately build your Windows app.

01:02:03.784 --> 01:02:07.399
You have full access to the API set the
platform provides, including things like

01:02:07.508 --> 01:02:11.929
Cortana, and you can integrate C and
C++ code in with the same project.

01:02:13.132 --> 01:02:14.932
You're producing a Universal Windows app

01:02:15.199 --> 01:02:18.331
that you can deploy to the Windows Store.
Let's check it out.

01:02:22.779 --> 01:02:26.609
Here we have a directory with the source
code files for the Math Dream project that

01:02:26.845 --> 01:02:29.598
Terry showed yesterday.
Same exact Objective C files.

01:02:30.410 --> 01:02:34.953
In the command-line interface, we're going
to run a little batch file, and what

01:02:35.104 --> 01:02:38.608
this batch file does, it runs the code
that's going to do the conversion of the

01:02:38.778 --> 01:02:43.952
Xcode project to the Visual Studio Solution.
If you watch in the Explorer window over

01:02:44.156 --> 01:02:47.546
here, a bunch of new files showed
up, including the solution file.

01:02:48.512 --> 01:02:52.135
Double-click on it.
We'll bring up Visual Studio, and we've

01:02:52.368 --> 01:02:55.139
created this Math Dream project
from the Xcode project.

01:02:57.717 --> 01:03:02.890
It still has the original Objective C code
from the iOS application, and you can

01:03:02.991 --> 01:03:04.568
see it in the Visual Studio view.

01:03:06.136 --> 01:03:07.683
Simple F5.

01:03:08.421 --> 01:03:09.969
We'll build and run it.

01:03:17.222 --> 01:03:19.860
And for a simple app like that,
that's all it takes.

01:03:20.139 --> 01:03:22.017
Here's the app running, the
same one you saw yesterday.

01:03:25.314 --> 01:03:28.810
We can add the apples, simple arithmetic application.

01:03:29.424 --> 01:03:32.409
But now, let's take a step and
bring this one step further.

01:03:33.988 --> 01:03:38.252
We know that great Windows apps also want
to take advantage of all the compelling,

01:03:38.667 --> 01:03:41.720
unique Windows features that we've been
talking about in the Universal Windows

01:03:41.943 --> 01:03:43.463
Platform, so let's actually do that.

01:03:46.028 --> 01:03:53.139
First, we're going to add a couple of files
that we've already written into the project.

01:03:58.264 --> 01:03:59.696
These two files.

01:04:06.995 --> 01:04:09.817
And then what we're going to do is we're
going to make a couple of small

01:04:09.943 --> 01:04:13.411
modifications to this source code.
You're not going to enjoy watching me

01:04:13.556 --> 01:04:19.008
type source code, so I'm just going to cut
and paste this from the popular Notepad application.

01:04:35.222 --> 01:04:37.488
All right.
Now, when we rebuild this project,

01:04:39.819 --> 01:04:42.086
we'll rebuild it with the changes for the new

01:04:42.247 --> 01:04:45.043
interactive notifications.
It's the same concept that Microsoft --

01:04:45.370 --> 01:04:48.637
that Kevin showed with Band, but now we're
going to have an interactive toast added

01:04:48.747 --> 01:04:49.840
to this particular application.

01:04:53.971 --> 01:04:55.397
F5 to run it.

01:04:58.084 --> 01:05:02.637
What we've done is, if it you do a math
operation that results in 10 -- we like

01:05:02.763 --> 01:05:10.002
the number 10 -- it brings you this interactive
toast down at the bottom right.

01:05:10.762 --> 01:05:14.396
And what we can do is the compelling feature
of unlocking division inside the

01:05:14.641 --> 01:05:18.683
application, so that we can have all four
basic arithmetic operations in the app.

01:05:23.487 --> 01:05:25.171
Six divided by 3 is, in fact, 2.

01:05:27.215 --> 01:05:33.946
So that's how you can add unique Universal
Windows Platform capabilities to an

01:05:34.285 --> 01:05:38.890
existing iOS Objective C application.
All right, thanks for your attention.

01:05:39.449 --> 01:05:50.841
That was all a look at how you can take
your Universal Windows Platform bridges to

01:05:51.142 --> 01:05:55.287
take the code you have today, no matter
where it was born, bring it to Windows.

01:05:56.412 --> 01:06:00.036
Then you can build experiences only possible
on Windows, across all our family

01:06:00.244 --> 01:06:05.401
of devices, by taking advantage of unique
Windows features like Xbox Live Services,

01:06:05.771 --> 01:06:10.393
Cortana, interactive notifications, Live
Tiles, adapting and tailoring your UI,

01:06:10.690 --> 01:06:13.794
inking, sensors, holograms and much, much more.

01:06:15.046 --> 01:06:19.491
I'm psyched to see what you all do to
change the world using the Universal

01:06:19.715 --> 01:06:22.714
Windows Platform.
Thank you very much.

01:06:25.971 --> 01:06:27.294
>> Come this way, David.

01:06:27.537 --> 01:06:29.236
>> There you guys are.
>> There you go.

01:06:29.429 --> 01:06:31.241
Great job.
That was really good.

01:06:31.719 --> 01:06:34.599
Big hand, those guys cranked it out.
That's exactly what we hope you were

01:06:34.770 --> 01:06:37.639
looking for, right stuff?
Everybody's awake now?

01:06:38.568 --> 01:06:41.832
All right.
The nice thing for us is we get to take

01:06:42.168 --> 01:06:45.595
the work that Kevin showed you and David
showed you, and we bring it to life.

01:06:46.091 --> 01:06:50.401
We've already started working with
developers building solutions on the technology.

01:06:50.889 --> 01:06:53.888
So you see a slide here of Shazam.
Shazam is taking a web experience,

01:06:54.417 --> 01:06:58.238
turned it into an application.
It's a nice mix because it uses C++ code

01:06:58.493 --> 01:07:01.400
for doing the music recognition, but
then it's all web-based experience.

01:07:01.584 --> 01:07:02.932
We put it into the store.

01:07:03.184 --> 01:07:07.029
They can deep link, so from within the
app itself, you can go in and download music.

01:07:07.400 --> 01:07:10.804
It's got links back into the platform itself.
From there, there's actually an

01:07:10.965 --> 01:07:13.971
opportunity for monetization
through a referral program.

01:07:14.453 --> 01:07:17.966
The Rdio one we saw earlier is
also a web-based experience.

01:07:18.279 --> 01:07:22.228
We're starting to bring these things to life.
I've got a couple here just to take from

01:07:22.352 --> 01:07:24.875
where Kevin was.
First one is one of my favorites.

01:07:25.182 --> 01:07:29.032
I'm a long time Fitbit user,
about 2,500 miles a year.

01:07:29.284 --> 01:07:31.567
Here, two things that come out
of what Kevin was showing you.

01:07:32.000 --> 01:07:36.402
One, today, if you use Fitbit to connect
to the PC, you need to use the Bluetooth

01:07:36.634 --> 01:07:39.203
dongle, so you plug it into the side of
the PC, and then when you're working

01:07:39.478 --> 01:07:42.626
and you're moving around, that's how
you do the Bluetooth connection.

01:07:42.880 --> 01:07:45.078
Don't need the dongle anymore.
Connects automatically.

01:07:45.320 --> 01:07:48.119
Don't have to use that for the PC.
Works just like the phone.

01:07:48.603 --> 01:07:51.325
The second thing is building from the
ground up, taking advantage of the

01:07:51.644 --> 01:07:52.783
responsive design.

01:07:53.083 --> 01:07:55.773
In this particular case, you'll notice,
here's my Control Panel.

01:07:56.000 --> 01:07:59.312
This is my dashboard.
If I start to slide down, it gets very

01:07:59.420 --> 01:08:02.806
clean, as I come down, and
here sort of tablet form.

01:08:03.144 --> 01:08:07.464
If I go a little smaller here, this is phone
UI, and John's got it up and running

01:08:07.802 --> 01:08:10.937
on the phone next to me, and you'll notice
-- let's see if they can project that.

01:08:11.307 --> 01:08:15.001
The phone UI looks exactly the same now
as what we've done on the desktop.

01:08:15.348 --> 01:08:18.749
So you have this really great ability to
take the app and scale it across all of

01:08:18.865 --> 01:08:20.602
the devices without having to do extra work.

01:08:20.850 --> 01:08:24.195
Now, the other side of this particular
conversation would be up to the Xbox.

01:08:24.715 --> 01:08:27.990
So if we switch over to the Xbox,
I can take that same dashboard.

01:08:28.154 --> 01:08:32.524
>> And here I'm going right into the Xbox,
and notice, I'm using a pretty radically

01:08:32.807 --> 01:08:34.112
different way to navigate around this,

01:08:34.397 --> 01:08:37.627
but I get all the features through
that Universal app.

01:08:37.828 --> 01:08:39.916
>> I think there's a magic of code here,
because a couple of your guys have more

01:08:40.029 --> 01:08:42.666
steps now than I do, which there's
just something wrong on that one, as well.

01:08:42.911 --> 01:08:44.467
I've been pacing backstage for hours.

01:08:45.277 --> 01:08:49.322
So here's a good example on the consumer side.
Fitbit, we want to thank them for letting

01:08:49.423 --> 01:08:51.851
us show it.
Now, on the other side of the coin,

01:08:52.001 --> 01:08:55.344
on the commercial side, this is
an application from Siemens.

01:08:55.599 --> 01:08:58.628
This is called JT2Go.
And if you think about design, this

01:08:58.774 --> 01:09:00.222
is the designer for physicists.

01:09:00.474 --> 01:09:04.188
So if you want to build bridges, if you
want to build ships or, in this case,

01:09:04.411 --> 01:09:08.198
if you want to build rocket ships, this
is literally the toolset that they use,

01:09:08.426 --> 01:09:09.428
very high end.

01:09:09.716 --> 01:09:12.006
It has all the physics applied,
along with the math.

01:09:12.261 --> 01:09:14.547
Now, the cool thing is I have
it here on the Surface Pro.

01:09:14.917 --> 01:09:18.830
I can use it with touch and interaction.
But same application, if we go back over

01:09:19.065 --> 01:09:24.661
to the Surface Hub, now we see JT2Go up
on the big screen, and here, we can

01:09:24.915 --> 01:09:28.945
collaborate, work on it together.
John can use the smooth inking.

01:09:29.431 --> 01:09:30.870
>> So this is the actual rocket from

01:09:31.370 --> 01:09:35.340
orbit, and you notice that you can see
pretty amazing stuff like this connection here.

01:09:35.596 --> 01:09:37.664
Maybe that's a little too close,
something like that.

01:09:37.953 --> 01:09:39.022
>> Yes, and we could work on it together.

01:09:40.111 --> 01:09:43.316
This pen has decided to give up on me.

01:09:43.724 --> 01:09:46.347
Well, we could work on it together, but
we're going to use your pen for now.

01:09:48.912 --> 01:09:50.863
It's all real code.
That's the challenge.

01:09:51.594 --> 01:09:54.267
Go ahead.
>> So one of the great things that we can

01:09:54.519 --> 01:09:59.663
do in addition to what's happening here
is we can bring in, for example, experts.

01:10:00.030 --> 01:10:04.111
So if Guggs and I, who happen to not be
rocket scientists, wanted to understand

01:10:04.354 --> 01:10:06.863
whether we've got a problem here, just
bring up Skype, have the conversation,

01:10:06.992 --> 01:10:09.580
and off we get.
>> And Skype's built in, so take advantage

01:10:09.803 --> 01:10:11.658
of all the different services with the

01:10:12.167 --> 01:10:15.430
applications, and so good set of conversations.
There's a whole set of partners we're

01:10:15.571 --> 01:10:19.605
working with this and ISVs.
I wanted to build off of where David

01:10:19.717 --> 01:10:22.861
and Kevin was, and link into one of
the conversations we do have on a pretty

01:10:23.033 --> 01:10:25.195
regular basis.
We often get questions -- they showed us

01:10:25.462 --> 01:10:28.750
how to build a Universal Windows app
from scratch, how to bridge in.

01:10:29.279 --> 01:10:32.743
Sometimes, we'll get the question, if I'm
starting from scratch and I want to build

01:10:33.022 --> 01:10:37.038
an application that runs across all
the devices, what's a good way to do that?

01:10:37.280 --> 01:10:40.266
And so there are multiple
plans or ways to do that.

01:10:40.517 --> 01:10:44.070
Last year, no, two years ago, we showed
Unity for the gaming platform.

01:10:44.447 --> 01:10:47.997
Last year, we took what Kevin had built
the day before, on day one, and used -- it

01:10:48.115 --> 01:10:50.831
was a .NET application.
We used Xamarin to bring it over to iOS

01:10:50.988 --> 01:10:54.361
and Android, so this year, we thought we'd
pick up on the web theme, and if we wanted

01:10:54.464 --> 01:10:57.517
to build a web experience or a web application
that runs across all devices,

01:10:57.634 --> 01:11:01.060
how could we do that? >> So as
you saw earlier today with

01:11:01.360 --> 01:11:07.402
Kevin's demo, with the flight game, what
Shazam and others are doing, we're able to

01:11:07.568 --> 01:11:11.227
take a web application.
Here's a web application, very simple,

01:11:11.672 --> 01:11:15.398
using modern frameworks, and what we'd
like to be able to do is very quickly

01:11:15.515 --> 01:11:16.627
generate a Windows app.

01:11:17.123 --> 01:11:22.811
The key to this is a new format from the
W3C called a manifest, and I've got the

01:11:22.917 --> 01:11:25.850
manifest for this particular
app sitting over here.

01:11:26.064 --> 01:11:29.922
And really, it's the simplest thing.
It's just a JSON description of where the

01:11:30.036 --> 01:11:34.472
app's located out on the web, whether you
want this thing to be full screen, icons,

01:11:34.673 --> 01:11:36.725
various things like that -- again, all standardized.

01:11:37.323 --> 01:11:41.923
We load that into the Windows Store by giving
it the URL to the app and it goes

01:11:42.213 --> 01:11:46.207
and produces the Windows application, and
we saw great examples of Kevin showing

01:11:46.475 --> 01:11:49.643
that up and running.
Now, wouldn't it be cool if you could take

01:11:49.876 --> 01:11:54.762
this same manifest, that same approach,
but also create that same kind of

01:11:54.890 --> 01:11:58.839
experience but on, say, iOS or
Android or other platforms?

01:11:59.013 --> 01:12:02.479
So we're pretty excited to announce
a new capability today.

01:12:03.262 --> 01:12:08.764
If you're a web developer, chances are,
you know JavaScript, and chances are,

01:12:08.879 --> 01:12:12.641
you're probably using Node on the back end.
So we've added, and we're announcing

01:12:12.877 --> 01:12:16.879
a new thing -- you're probably using the
Node Package Manager, and if you typed npm

01:12:17.045 --> 01:12:25.439
install -g manifoldjs, that will go download
this toolset that I'm about to show.

01:12:25.690 --> 01:12:28.322
Now, I've already done that, so let
me just actually have this work.

01:12:28.489 --> 01:12:34.083
Here's manifoljs.
There's the URL to my app.

01:12:34.526 --> 01:12:36.478
I'm just going to turn on logging with

01:12:36.981 --> 01:12:40.240
debug level so you can see what happens.
So there it is.

01:12:40.482 --> 01:12:44.925
It's reached out across the web, it's picked
up that manifest, and it's using it

01:12:45.209 --> 01:12:48.205
to go generate a bunch of applications.
In fact, let's go see what it's done.

01:12:48.436 --> 01:12:52.812
So we're going to down into the Shifter
application, and I'm just going to launch

01:12:53.128 --> 01:12:57.330
Explorer here, so you can kind of see
what's going on, and notice, it's now

01:12:57.562 --> 01:13:03.275
automatically generated apps for Android,
for Chrome, for Cordova, Firefox, iOS,

01:13:03.530 --> 01:13:04.809
web, you name it.

01:13:05.130 --> 01:13:10.525
These are now ready to go as apps.
So let's dig into the Android example.

01:13:10.810 --> 01:13:14.759
I'm going to launch this.
That's going to bring up Android Studio,

01:13:15.612 --> 01:13:20.521
and it's going to use a very powerful piece
of open-source technology, Cordova,

01:13:21.059 --> 01:13:26.192
so that it can use that set of
web technologies as an Android application,

01:13:26.437 --> 01:13:27.880
and we can see that coming up now.

01:13:28.383 --> 01:13:30.641
So here's our Android application up and running.

01:13:31.130 --> 01:13:34.240
We could go through this, look
at all the Java and so on.

01:13:34.482 --> 01:13:36.608
Now, I'm just going to hit run, and that

01:13:37.094 --> 01:13:40.935
would go off and compile it, but Steve,
you have the apps up here and running.

01:13:41.190 --> 01:13:42.809
>> Let me bring that back up.

01:13:43.211 --> 01:13:45.758
So I have two devices here.
I have an Android device and I have an

01:13:45.884 --> 01:13:49.886
iOS device, and we have that same Shifter
app basically built and running on both of

01:13:50.156 --> 01:13:53.569
the platforms, straight from what John
did, real easy to work with, and of

01:13:53.815 --> 01:13:56.566
course, we could have some fun picking
our favorite frameworks here if we'd like.

01:13:57.087 --> 01:14:01.268
>> Now, this might almost seem like magic,
but it's amazing how many partners we're

01:14:01.426 --> 01:14:03.935
working with that have actually
started this way.

01:14:04.214 --> 01:14:06.131
>> And in fact, the conversations --
we talked about Salesforce before.

01:14:06.409 --> 01:14:08.732
That's exactly how they operate.
They basically do their dynamic content

01:14:09.010 --> 01:14:12.610
up on the web with HTML5 and JavaScript,
then do native code locally.

01:14:12.980 --> 01:14:16.164
They use Cordova, and that's how we started
the project together in terms of

01:14:16.453 --> 01:14:17.537
building the Windows 10 application.

01:14:17.894 --> 01:14:21.858
>> So what I'm doing here is I'm closing
down everything, and I wanted to talk for

01:14:22.129 --> 01:14:25.367
a second about one of the challenges when
you start building apps this way.

01:14:25.708 --> 01:14:29.528
It's fantastic to be able to generate these
apps and put them out there, but we

01:14:30.015 --> 01:14:34.214
lose one of the most powerful features of
the web, which is the fantastic debugging

01:14:34.483 --> 01:14:36.521
capabilities that are built into the browser.

01:14:36.932 --> 01:14:41.640
So we've got a cool additional project that
we wanted to announce today called Vorlon.

01:14:41.814 --> 01:14:46.883
Now, what Vorlon does is it's a package
that you add to your web app, and it

01:14:46.981 --> 01:14:51.271
reaches out across the web to a Vorlon
server running in Node.js, and as you can

01:14:51.467 --> 01:14:54.245
see, this is connected to our
Android and iPhone app.

01:14:54.476 --> 01:14:57.959
I'm going to go start up the Windows version
of the app, and as you can see,

01:14:58.330 --> 01:15:00.886
it's now popped that one up.
I can select it.

01:15:01.129 --> 01:15:06.364
Not only that, I can reach out anywhere.
This app could be running in Australia.

01:15:07.092 --> 01:15:08.528
We would see that thing pop up.

01:15:08.780 --> 01:15:12.578
I can identify it, just to make sure that
I'm thinking about the right one, so we

01:15:12.959 --> 01:15:14.286
have the ability to interact with it.

01:15:14.657 --> 01:15:18.011
I can look around at the DOM.
I have a lot of capabilities here.

01:15:18.413 --> 01:15:23.284
In fact, I can go and do things like write
to the console, all that stuff.

01:15:23.698 --> 01:15:27.209
I'm just going to do the simplest thing.
I'm just going to call a function that

01:15:27.564 --> 01:15:31.164
would be equivalent to if I clicked that
I liked one of these frameworks, and I'm

01:15:31.410 --> 01:15:32.480
just running that remotely.

01:15:32.811 --> 01:15:34.414
Notice, I reached out across the web,

01:15:34.659 --> 01:15:39.684
injected that into a running Windows
application, running iPhone application,

01:15:40.102 --> 01:15:44.212
all nice, new ways to develop
using the web technologies.

01:15:44.815 --> 01:15:46.117
>> Slick stuff, John.

01:15:46.392 --> 01:15:49.285
Then the other one then is obviously the
Asm -- let's give John a hand for that

01:15:49.438 --> 01:15:50.285
and the team.

01:15:50.936 --> 01:15:56.650
>> So the whole web space is just the
level of innovation going on there

01:15:56.765 --> 01:16:01.130
is incredible, and we're seeing stuff like
the Babylon work that we announced last time.

01:16:01.335 --> 01:16:05.728
Another project that we wanted to announce
today is the Asm.js project,

01:16:06.133 --> 01:16:10.485
which gives us a way to write down
in JavaScript a subset of that that can be

01:16:10.684 --> 01:16:12.681
easily compiled and provide high performance.

01:16:12.991 --> 01:16:17.815
So, again, we're very supportive of both
this cross-platform way to do things but

01:16:18.109 --> 01:16:21.068
also bringing in open source
into the whole approach.

01:16:21.583 --> 01:16:24.152
>> Thank you, John.
And I think in terms of open sourcing

01:16:24.407 --> 01:16:26.738
and sharing code, we've done
a lot of work with GitHub.

01:16:26.887 --> 01:16:29.174
John says all the projects
here will be up on GitHub.

01:16:29.413 --> 01:16:31.485
One of the things they've done is they've
worked really well with us on students,

01:16:31.616 --> 01:16:33.776
a bunch of areas.
I'm happy today to announce we now have

01:16:33.882 --> 01:16:37.062
GitHub Enterprise for Azure up and running.
That means if you're behind the firewall

01:16:37.216 --> 01:16:40.022
at a commercial entity, you can use your
Active Directory for sharing code.

01:16:40.393 --> 01:16:43.484
We can scale to all of the developers
out there and work together on Azure.

01:16:43.623 --> 01:16:46.132
So again, just trying to contribute into
the community for a bunch of different

01:16:46.374 --> 01:16:49.025
areas, make sure we can share code
and projects and work together.

01:16:49.786 --> 01:16:53.051
Now, I'm not going to use switching
gears, because that's been overused.

01:16:53.288 --> 01:16:56.083
Why don't we go to Python-esque with a now
and for something completely different?

01:16:56.336 --> 01:16:57.171
We'll go that way.

01:16:57.671 --> 01:17:00.654
One of the conversations that I thought
Scott did a good job on yesterday was

01:17:00.933 --> 01:17:04.847
around data, and scaling out data,
security for data, Data Lake.

01:17:05.136 --> 01:17:07.287
There was just a whole bunch of parts
to that, and we end up with a lot of

01:17:07.619 --> 01:17:09.826
conversations where people want to
talk about data as a platform.

01:17:10.210 --> 01:17:12.927
Data as a platform is incredibly interesting,
but you have to be able to do

01:17:13.066 --> 01:17:15.561
something with it.
The ability to understand and act on data

01:17:15.898 --> 01:17:19.220
and bring it to life, that's where the
magic is in a lot of the cases.

01:17:19.383 --> 01:17:20.973
There's nobody better to talk about that

01:17:21.229 --> 01:17:25.965
than our own Joseph Sirosh, who leads the
Machine Learning Group, an expert in the area.

01:17:26.279 --> 01:17:28.970
So I thought we'd have him come out and
sort of give us a walk around the park,

01:17:29.224 --> 01:17:32.934
in this case, building on top of the data
with machine learning, real-time analytics.

01:17:33.298 --> 01:17:34.730
Let's see where Joseph's coming out from.

01:17:35.621 --> 01:17:37.528
>> All right.
>> There he is.

01:17:38.129 --> 01:17:39.674
>> Joseph, welcome to the stage.

01:17:40.135 --> 01:17:42.279
How are you? >> Thank
you, Steve.

01:17:42.416 --> 01:17:43.853
>> Have some fun.
We'll be back in a little while.

01:17:44.033 --> 01:17:44.832
>> Yes, thanks.

01:17:46.939 --> 01:17:48.997
Software is eating the world.

01:17:49.822 --> 01:17:56.358
Marc Andreessen said that about four years
ago, but today, the cloud is eating software.

01:17:58.098 --> 01:18:03.372
Software is being delivered as services
in the cloud, and most pieces of software

01:18:03.732 --> 01:18:04.687
are connected to the cloud.

01:18:05.485 --> 01:18:10.028
Now, the cloud is not only eating
software, but it is eating data.

01:18:11.052 --> 01:18:13.267
And when the cloud digests software

01:18:13.709 --> 01:18:16.716
and digests data, it can produce intelligence.

01:18:17.680 --> 01:18:19.240
Let me tell you what I mean.

01:18:20.460 --> 01:18:23.033
For human history, most of human history,

01:18:23.517 --> 01:18:24.952
the world was analog.

01:18:25.607 --> 01:18:27.632
Once upon a time, in the 1980s,

01:18:28.520 --> 01:18:31.650
analog data dominated.
Digital data was just being born.

01:18:32.760 --> 01:18:38.004
And come the '90s, you have the Internet.
You have client-server computing.

01:18:38.681 --> 01:18:40.000
You have digital music.

01:18:40.366 --> 01:18:41.807
You have DVDs.

01:18:42.058 --> 01:18:43.513
And the digital data exploded.

01:18:44.114 --> 01:18:46.918
But with Internet, one thing
very interesting happened.

01:18:47.366 --> 01:18:49.712
Data started to have an IP address.

01:18:50.699 --> 01:18:52.117
It became connected data.

01:18:52.764 --> 01:18:54.867
It lived on datacenters on the cloud,

01:18:55.116 --> 01:18:59.570
PCs and devices, but it was starting
to have an IP address.

01:19:00.288 --> 01:19:04.466
And fast forward to today, digital data dominates.

01:19:05.117 --> 01:19:10.717
Analog data is going down, and about half
of all digital data is connected.

01:19:11.408 --> 01:19:14.760
It lives in the cloud.
It's flowing in from mobile devices that

01:19:15.007 --> 01:19:18.671
are connected, the Internet of things is
just starting to emerge, and there are

01:19:18.782 --> 01:19:20.844
10 zettabytes of it.

01:19:21.085 --> 01:19:23.244
That's 10 million petabytes.

01:19:24.210 --> 01:19:28.125
Look at the future.
Look at 2020.

01:19:28.587 --> 01:19:30.921
In 2020, we're going to have 50

01:19:31.407 --> 01:19:35.439
zettabytes, 50 million petabytes, of data.

01:19:36.214 --> 01:19:41.785
The vast majority of that is in the cloud
and flowing in it from connected devices.

01:19:41.972 --> 01:19:44.031
Analog has gone down almost to zero.

01:19:44.435 --> 01:19:46.121
The cloud is where the data lives.

01:19:46.641 --> 01:19:51.356
That's where the planet's data, intelligence
and information resides.

01:19:52.095 --> 01:19:54.365
And that has profound implications for developers.

01:19:55.688 --> 01:20:01.650
So the best way -- so when I talk
to developers about this, we tend to have

01:20:02.045 --> 01:20:03.373
about four conversations.

01:20:04.233 --> 01:20:09.127
So developers want to look at historical
data and look at it retrospectively.

01:20:09.325 --> 01:20:11.640
It's big data.
You want to analyze it.

01:20:11.919 --> 01:20:12.870
You want to report on it.

01:20:14.098 --> 01:20:15.983
And then there's real-time data,

01:20:16.245 --> 01:20:22.188
data flowing in over the wire, and developers
want to analyze that asset as flowing

01:20:22.446 --> 01:20:24.599
through the wire and get insights from it.

01:20:25.643 --> 01:20:30.181
Developers also want to look at historical
data, learn patterns from it, and predict

01:20:30.445 --> 01:20:31.271
the future.

01:20:31.524 --> 01:20:36.241
And they want to bring all of this together
into intelligent SaaS apps.

01:20:37.574 --> 01:20:41.477
To bring this to life, let me tell you a story.

01:20:45.326 --> 01:20:47.468
My story is about the connected cow.

01:20:48.488 --> 01:20:50.522
Yes, there is such a thing as connected cows.

01:20:51.527 --> 01:20:53.190
It has all the buzzwords of today,

01:20:53.922 --> 01:20:57.126
the Internet of things, analytics, the cloud.

01:20:58.125 --> 01:20:59.963
It's perhaps the sexiest story in the cloud.

01:21:01.200 --> 01:21:02.876
But it's also about human ingenuity

01:21:03.127 --> 01:21:08.562
and how this new technology
is revolutionizing even some of the world's oldest

01:21:08.672 --> 01:21:10.270
industries, such as dairy farming.

01:21:11.979 --> 01:21:15.365
So these are the connected cows that I'm
talking about.

01:21:15.691 --> 01:21:19.824
Look at those pedometers on their legs.
They're connected to Wi-Fi.

01:21:20.441 --> 01:21:23.552
I have one of those in my hand, the cow pedometer.

01:21:24.548 --> 01:21:32.250
It counts the steps of every cow on the
dairy farm and sends that data to Microsoft Azure.

01:21:32.757 --> 01:21:38.222
It has Fujitsu's Gyuho, which means
cow step, service in the cloud.

01:21:40.302 --> 01:21:43.327
So do cows need to take 10,000 steps a day too?

01:21:45.624 --> 01:21:51.451
Before I give you the answer, let me tell
you about the modern dairy farm.

01:21:51.780 --> 01:21:56.497
These days, every company is a data company,
even the ones you least expect.

01:21:56.977 --> 01:22:00.181
A dairy farm has all the constraints
of a modern business.

01:22:00.669 --> 01:22:05.529
It has a fixed herd.
It has a pasture and labor, which often

01:22:05.643 --> 01:22:07.580
is very expensive, and their output

01:22:07.869 --> 01:22:12.421
is milk and beef, and they have to optimize
that output under all of these constraints.

01:22:13.428 --> 01:22:15.218
So what can a farmer do?

01:22:15.832 --> 01:22:17.501
It turns out he has two controls.

01:22:18.745 --> 01:22:22.308
He can detect health issues in cattle
early and prevent loss.

01:22:23.150 --> 01:22:27.370
He can also improve cattle production
by accurate detection of estrus.

01:22:28.670 --> 01:22:33.362
If you remember high school biology, estrus
is when the animal is ready to mate

01:22:33.638 --> 01:22:37.691
and goes into heat, when the time is right,
when the magic is ready to happen,

01:22:37.844 --> 01:22:38.813
so to speak.

01:22:41.613 --> 01:22:44.169
But how could you detect estrus in

01:22:44.817 --> 01:22:46.365
hundreds of cows in a dairy farm?

01:22:47.220 --> 01:22:50.962
Before I tell you, let me tell you about
the importance of doing this.

01:22:51.342 --> 01:22:54.168
These days, with artificial insemination,

01:22:54.418 --> 01:22:57.768
the probability of conception is pretty good.
It's about 70%.

01:22:58.263 --> 01:23:01.969
But detection of estrus has been
done by age-old methods.

01:23:02.338 --> 01:23:03.435
It's just really close observation.

01:23:04.091 --> 01:23:07.366
In the best of cases, you get about a 55% accuracy.

01:23:08.897 --> 01:23:11.327
And then the pregnancy rate is about 39 percent.

01:23:11.883 --> 01:23:13.766
But if you could move that detection rate

01:23:14.019 --> 01:23:16.449
up to 95 percent, look what happens.

01:23:16.989 --> 01:23:20.706
You get a pregnancy rate of about 67
percent, which is a big improvement.

01:23:21.484 --> 01:23:26.840
It's very material for the dairy farmer.
But this is hard.

01:23:27.301 --> 01:23:31.338
Estrus lasts only 12 to 18 hours every
21 days, and it's variable.

01:23:31.748 --> 01:23:33.675
And it occurs, like many of these things,

01:23:33.883 --> 01:23:35.837
mostly between 10:00 p.m. and 8:00 a.m.,

01:23:36.099 --> 01:23:39.341
when the farmer is taking his hard-earned rest.

01:23:41.350 --> 01:23:44.708
So how can farmers tell when the time
is right for hundreds of cows?

01:23:45.586 --> 01:23:47.132
Could technology help?

01:23:47.386 --> 01:23:50.834
Could you develop a heat map
of the dairy, so to speak?

01:23:55.188 --> 01:23:59.708
Well, that's a question that a farmer
in Japan asked Fujitsu, our partner.

01:24:00.991 --> 01:24:05.162
Fujitsu engineers consulted some researchers
and came up with a very

01:24:05.276 --> 01:24:10.062
ingenious system, something that was indeed
95% accurate for the detection of estrus.

01:24:10.885 --> 01:24:13.703
It's literally the hottest
system for detecting heat.

01:24:14.690 --> 01:24:16.464
Now, this is that service.

01:24:17.508 --> 01:24:22.637
Data from the pedometers that I showed
you from the cows are sent over the wire

01:24:23.559 --> 01:24:29.022
to a service on the cloud on Microsoft
Azure, where it analyzes all that data.

01:24:29.556 --> 01:24:35.232
And from the footsteps of cows detects when
the animal goes into heat and sends

01:24:35.535 --> 01:24:37.369
alerts on the farmer's phone.

01:24:37.691 --> 01:24:41.165
So the farmer knows which cow went
into heat and exactly when.

01:24:43.218 --> 01:24:45.763
Well, it turns out there's a simple secret

01:24:46.157 --> 01:24:47.934
to detecting when an animal goes into estrus.

01:24:48.689 --> 01:24:51.036
Let me explain that to you with a graph.

01:24:51.485 --> 01:24:53.659
The X-axis is time of night on this graph.

01:24:54.215 --> 01:24:57.013
Y-axis is the number of steps a cow is taking.

01:24:57.951 --> 01:25:03.109
So this is a cow on a normal night.
Sleeping sometimes.

01:25:03.688 --> 01:25:07.369
Let's see what happens when
the animal goes into heat.

01:25:08.086 --> 01:25:10.507
Yes.
The number of steps she takes goes up.

01:25:10.960 --> 01:25:13.963
An animal goes into heat, she starts
walking around furiously.

01:25:15.284 --> 01:25:19.544
And that turns out to be about 95% accurate
for the detection of estrus.

01:25:20.383 --> 01:25:25.215
And the optimum time for artificial insemination
for maximum conception rate

01:25:25.560 --> 01:25:26.839
is 16 hours from that.

01:25:27.908 --> 01:25:30.636
And that's when AI meets AI,

01:25:30.819 --> 01:25:32.240
artificial insemination, that is.

01:25:36.415 --> 01:25:41.738
Now, Fujitsu researchers found something
else that was very amazing.

01:25:42.765 --> 01:25:45.373
There was a window around that optimum.

01:25:46.390 --> 01:25:51.570
If in the first four hours of that window,
if you performed AI, you would get

01:25:51.835 --> 01:25:56.619
a female, and the second next four
hours you would get a male.

01:25:57.090 --> 01:26:00.940
So the farmer now had an amazing
control at his disposal.

01:26:01.483 --> 01:26:04.141
He could choose the gender of the calf

01:26:04.418 --> 01:26:06.106
based on the needs of his daily farm.

01:26:06.683 --> 01:26:11.363
Not only that, Fujitsu found that
by analyzing the step patterns of cows,

01:26:12.021 --> 01:26:14.348
they could detect about eight different diseases.

01:26:15.414 --> 01:26:20.661
And remember that 5% false positive rate,
95% accurate, 5% false positive?

01:26:21.592 --> 01:26:25.311
Even some of that turns out to be
very important because some of it is when the

01:26:25.658 --> 01:26:27.910
cow jumps over the fence and skips the farm.

01:26:30.485 --> 01:26:32.818
Well, it's an amazing application.

01:26:35.092 --> 01:26:40.737
But it's an application that today every
one of you could build in a few days with

01:26:41.468 --> 01:26:43.712
the platform services that's available in Azure.

01:26:44.417 --> 01:26:46.240
And you can scale that out globally,

01:26:46.391 --> 01:26:50.297
distribute it, and this would never
have been possible before.

01:26:52.091 --> 01:26:56.968
So that's the power of intelligent
apps that live on the cloud.

01:26:57.304 --> 01:26:59.906
And now let's look at the power
of real-time analytics.

01:27:00.786 --> 01:27:06.944
Data is always moving these days.
It's constantly in motion.

01:27:07.473 --> 01:27:09.937
Connected data coming from sensors,

01:27:10.191 --> 01:27:14.462
from websites, from apps in the cloud,
from social apps, it's streaming over the wire.

01:27:15.832 --> 01:27:20.573
Now, developers want to easily process
this data and get insights real time.

01:27:22.052 --> 01:27:25.466
So now let's take a look at an example
of a solution that does that on Azure.

01:27:27.651 --> 01:27:32.263
So with me is Corum, who is
going to help me do a demo.

01:27:32.674 --> 01:27:35.982
We're going to create an app that's going

01:27:36.775 --> 01:27:39.675
to be a fun, engaging demo, and you are

01:27:40.048 --> 01:27:43.717
going to actually help us create
data in motion, okay?

01:27:44.202 --> 01:27:47.514
When we started this, we wanted to build
a fun and intelligent application,

01:27:48.380 --> 01:27:51.706
something that would capture the
attention of people worldwide.

01:27:52.875 --> 01:27:58.622
So we went to the Machine Learning Gallery,
and today we have an exciting

01:27:58.831 --> 01:28:02.467
collection of intelligent APIs on
that Machine Learning Gallery.

01:28:02.828 --> 01:28:05.731
It's gallery.azureml.net.
All of you can go there.

01:28:06.180 --> 01:28:11.057
And yesterday afternoon, Harry Shum, the
head of MSR, announced Project Oxford to

01:28:11.467 --> 01:28:16.147
bring some of the amazing, intelligent
APIs that have been created by Microsoft

01:28:16.432 --> 01:28:21.065
Research and Bing to developers like yourselves.
There are face APIs.

01:28:21.401 --> 01:28:24.002
There are image analysis APIs.
There are speech APIs.

01:28:24.677 --> 01:28:26.111
So we took the face API.

01:28:26.715 --> 01:28:30.477
It's a really fun API that allows
you to submit a picture.

01:28:30.724 --> 01:28:36.880
It detects the faces in that and it tells
you an estimate of their age and gender.

01:28:38.583 --> 01:28:42.326
So the URL for this demo is howold.net.

01:28:42.882 --> 01:28:44.625
Now, I would like everyone here to

01:28:44.776 --> 01:28:48.599
actually take a minute and go to this
URL, especially everyone watching online.

01:28:49.383 --> 01:28:52.192
Please navigate to the site and take a look.

01:28:54.979 --> 01:28:56.534
So let's take a couple of pictures.

01:28:56.976 --> 01:28:58.379
Let's look at that happy family.

01:28:59.061 --> 01:29:01.355
Let's submit that, and you will see,

01:29:01.723 --> 01:29:03.942
it identified the faces in the image,

01:29:04.681 --> 01:29:07.738
the grandparents, the parents, the children.

01:29:08.133 --> 01:29:11.026
It got that -- it looks like
it got pretty accurate.

01:29:11.383 --> 01:29:12.840
So let's try another picture.

01:29:13.401 --> 01:29:16.530
Let's take, say, Da Vinci's Mona Lisa, a painting.

01:29:20.253 --> 01:29:24.796
And so we're using the Bing search API to
search Bing, get the images from online,

01:29:25.292 --> 01:29:29.474
and hopefully we can bring --
yes, Mona Lisa's image up.

01:29:30.087 --> 01:29:34.038
So let's submit that photo, and she is 23.

01:29:34.404 --> 01:29:39.239
Surprisingly, when that model posed
for Leonardo, she was actually about 23.

01:29:40.283 --> 01:29:42.430
So now let's all try your pictures.

01:29:43.323 --> 01:29:45.242
Take a picture from your mobile phone,

01:29:45.493 --> 01:29:47.635
from a PC, especially if you're watching online.

01:29:48.254 --> 01:29:50.938
Feel free to take a selfie
and send it, as well.

01:29:51.333 --> 01:29:53.178
Let's see how it performs.

01:29:53.797 --> 01:29:58.434
So, Corum, maybe you can take one
of our photos from the desktop.

01:29:58.675 --> 01:30:01.436
So that's my family picture.
Just uploaded it.

01:30:09.680 --> 01:30:11.236
So it's analyzing that.

01:30:14.717 --> 01:30:17.274
So we can actually see how it's doing on

01:30:17.583 --> 01:30:19.356
our dashboard, as well.

01:30:25.780 --> 01:30:28.952
Yes, the upload is taking a little while,
Corum, so let's go look at the dashboard

01:30:29.177 --> 01:30:30.440
and see what people are doing online.

01:30:30.692 --> 01:30:34.001
It's amazing.
This is the Power BI dashboard.

01:30:34.198 --> 01:30:36.005
John actually showed some of it earlier.

01:30:36.982 --> 01:30:42.753
People now from all of the world seem to
be coming to howold.net, and that map

01:30:43.000 --> 01:30:46.683
shows the distribution of people.
So what's different about this dashboard,

01:30:46.995 --> 01:30:48.353
by the way, it's pretty amazing that

01:30:48.850 --> 01:30:54.203
you're seeing real-time flowing data being
analyzed, and you see that graph that just

01:30:54.429 --> 01:30:57.932
spiked up.
That's all of you bringing data in motion.

01:30:59.133 --> 01:31:03.337
Now, let's peek behind the curtain a
little bit and see how we built this

01:31:03.688 --> 01:31:06.329
streaming analytics and the dashboard.

01:31:06.799 --> 01:31:09.797
So the data from the howold.net website

01:31:10.597 --> 01:31:12.152
is captured as a JSON file.

01:31:12.780 --> 01:31:18.145
There is -- it looks at the face data,
the age data, looks at the browser.

01:31:18.959 --> 01:31:22.929
It looks at the location from which the
IP address is coming, a collection of things.

01:31:23.334 --> 01:31:28.731
The JSON is sent to Azure Event Hubs.
Azure Event Hubs is a fully managed

01:31:28.842 --> 01:31:32.204
service on the cloud to ingest data at

01:31:32.448 --> 01:31:34.238
millions of events per second.

01:31:34.733 --> 01:31:36.882
And then, we use Azure Streaming Analytics.

01:31:37.602 --> 01:31:43.038
Azure Streaming Analytics is a fully
managed service for complex event processing.

01:31:43.201 --> 01:31:49.040
It lets you analyze streaming data,
put complex queries in it and get aggregates

01:31:49.183 --> 01:31:52.002
from that.
And then we use those aggregates

01:31:52.350 --> 01:31:53.440
and display it in a dashboard.

01:31:53.694 --> 01:31:55.208
So now let's take an example.

01:31:55.400 --> 01:32:01.761
Let's take that dashboard that is there,
that trending graph, so that trending

01:32:01.855 --> 01:32:03.760
graph shows two lines.

01:32:04.460 --> 01:32:11.414
You have the blue line showing the count
of females in the faces submitted, the pictures.

01:32:11.783 --> 01:32:13.816
The magenta is the number of males.

01:32:14.579 --> 01:32:18.485
And all developers here, if you have tried
to construct a trending graph like

01:32:18.728 --> 01:32:22.255
this over streaming data,
you know how hard it is.

01:32:22.477 --> 01:32:23.920
It takes hundreds of lines of code,

01:32:24.332 --> 01:32:27.436
if not more, to set something like this up.

01:32:28.325 --> 01:32:33.017
Let's now go to Streaming Analytics, the
Azure Stream Analytics query, and show you

01:32:33.174 --> 01:32:36.813
how simple it is.
So Azure Stream Analytics makes it really

01:32:36.956 --> 01:32:42.282
easy to configure such analytics using
just about eight lines of SQLite code.

01:32:42.734 --> 01:32:46.038
It's a select statement.
It's selecting the system's timestamp as

01:32:46.161 --> 01:32:49.528
out time, the face.gender as gender

01:32:50.060 --> 01:32:54.683
and the count of gender from the streaming
input and then aggregating it over

01:32:54.927 --> 01:32:58.253
a window over a 10-second interval, right?

01:32:58.410 --> 01:33:02.590
And that's all there is to it, and that's
the data that is now being displayed in

01:33:02.907 --> 01:33:04.357
the Power BI dashboard.

01:33:05.308 --> 01:33:09.130
So this is the magic of fully managed services,
like Azure Stream Analytics in

01:33:09.663 --> 01:33:11.684
the cloud and Power BI.

01:33:11.939 --> 01:33:16.733
It lets you analyze real-time flowing data
and embed intelligence around that

01:33:17.211 --> 01:33:18.293
into your applications.

01:33:21.180 --> 01:33:25.013
So now let's go from understanding the
present to predicting the future.

01:33:27.659 --> 01:33:37.734
So if we switch to slides, so in Feb.
of this year, we launched a powerful

01:33:38.014 --> 01:33:40.177
service called Azure Machine Learning.

01:33:41.137 --> 01:33:45.215
It allows you to learn patterns from historical
data and predict the future

01:33:46.175 --> 01:33:51.604
and create APIs in the cloud that can
be easily hooked up into any application.

01:33:52.258 --> 01:33:58.531
For example, Ziosk is using Azure Machine
Learning to produce recommendations on

01:33:59.008 --> 01:34:00.982
Ziosk tablets on Chili's restaurants.

01:34:01.709 --> 01:34:08.086
We have eSmart Systems of Norway using
Azure Machine Learning to actually predict

01:34:08.827 --> 01:34:12.495
the energy usage in the future
and control energy demand.

01:34:13.143 --> 01:34:16.664
The Microsoft Band uses Azure Machine
Learning for recommendations.

01:34:16.941 --> 01:34:21.668
We have companies, more traditional companies
such as Gaffey Healthcare using

01:34:21.891 --> 01:34:27.590
Azure Machine Learning to estimate when an
insurance claim will be paid, so they know

01:34:27.918 --> 01:34:31.594
how to act on that particular claim.
It's a very powerful service.

01:34:32.583 --> 01:34:38.213
So the best way for me to bring this to
life is to tell you another story.

01:34:40.383 --> 01:34:44.869
For those of you who are watching this
from outside the US, there is an annual

01:34:45.132 --> 01:34:47.886
sports event here called March Madness.

01:34:48.860 --> 01:34:54.331
It refers to the NCAA Men's Division
1 Basketball Tournament, so it's played each

01:34:54.689 --> 01:34:58.289
spring with 68 collegiate teams to determine
the national championship.

01:34:59.633 --> 01:35:02.531
And for Americans, we find it as a time to gamble.

01:35:03.336 --> 01:35:07.141
We try to predict who will make it to the
Final Four teams and ultimately who will

01:35:07.610 --> 01:35:08.330
win it all.

01:35:09.628 --> 01:35:12.291
It seems that everyone has a
prediction for the winners.

01:35:12.634 --> 01:35:19.183
Our President Obama, our CEO Satya Nadella,
and Satya's predictions got a lot

01:35:19.416 --> 01:35:21.811
of press, because it seemed
to be extremely accurate.

01:35:22.515 --> 01:35:26.407
Now, to be fair, Satya had help.
Satya had data scientists and people who

01:35:26.664 --> 01:35:28.777
knew basketball to help him make his predictions.

01:35:30.828 --> 01:35:32.868
But I want to tell you the story of Adam Garland.

01:35:34.115 --> 01:35:37.005
Adam is a developer in our
Microsoft Office group.

01:35:37.494 --> 01:35:41.863
Now, unlike Satya, Bing and Google, Adam
didn't have any experience using machine learning.

01:35:42.634 --> 01:35:44.181
He's just a developer, like you and me.

01:35:45.782 --> 01:35:50.136
And we had a hackathon going to predict
March Madness using Azure Machine Learning.

01:35:50.643 --> 01:35:55.510
Adam thought it would be a great way for
him to learn machine learning, so he came

01:35:55.881 --> 01:36:01.722
to the tool, he played around with the data,
and within a few hours, he was able

01:36:01.837 --> 01:36:06.285
to create a model to predict who
will win in a basketball match.

01:36:06.687 --> 01:36:09.884
And then, after a few days,
he got to be really good.

01:36:10.371 --> 01:36:16.366
And not only Adam, but many of the people
who participated on that competition ended

01:36:16.484 --> 01:36:20.520
up predicting much better than the
automated algorithms that Google used

01:36:20.763 --> 01:36:22.804
and Bing used and was pretty competitive.

01:36:23.816 --> 01:36:28.284
So these Azure ML tools are very easy to
use for developers, so I thought it might

01:36:28.516 --> 01:36:34.091
be actually fun to replicate what Adam did,
to show you how Adam built that app

01:36:34.484 --> 01:36:39.884
right in front of you and actually publish
it, publish an API live and show you

01:36:40.117 --> 01:36:44.715
a real demo, calling it with a basketball match.

01:36:46.059 --> 01:36:50.055
So let's see how easy it is to create an experiment.

01:36:50.421 --> 01:36:52.207
To predict the outcome of a match,

01:36:54.024 --> 01:36:58.473
whether team one will win or team two,
we typically need something called a binary classifier.

01:36:59.249 --> 01:37:03.602
There are experiments in the Azure
ML Gallery, so let's take this particular one.

01:37:03.872 --> 01:37:06.773
This is an experiment you'll find in gallery.azureml.net.

01:37:07.617 --> 01:37:09.673
So we just brought it to the studio,

01:37:10.915 --> 01:37:12.923
and this experiment is a workflow.

01:37:13.224 --> 01:37:14.610
It's actually really simple.

01:37:15.227 --> 01:37:16.596
So it reads and cleans the data.

01:37:17.764 --> 01:37:20.089
You split the data into training and test data.

01:37:21.016 --> 01:37:25.452
So you train a model with that training
data, and then you score the test data

01:37:25.649 --> 01:37:28.851
that you then provide to the model
and see how well it did.

01:37:30.150 --> 01:37:33.963
So let's actually run this and see how it performs.

01:37:39.917 --> 01:37:46.317
So we are going to now connect the March
Madness data set -- so to just get Adam's

01:37:46.575 --> 01:37:51.372
experiment, you take the data from the
sample experiment, bring the March Madness

01:37:51.668 --> 01:37:54.120
data set, and now we actually go and run it.

01:37:55.336 --> 01:37:58.853
So that experiment is running, and while
that's running, let's look at the data.

01:38:01.570 --> 01:38:05.493
So you'll see, this is data
about 12 years of matches.

01:38:06.123 --> 01:38:11.520
We have the seeds for each team, and the
final column there, team one wins, true or

01:38:11.767 --> 01:38:13.206
false, is what we are trying to predict.

01:38:14.318 --> 01:38:17.070
So let's go back and see
how well the model ran.

01:38:17.851 --> 01:38:19.273
So let's look at a performance.

01:38:20.251 --> 01:38:24.120
So that graph actually shows what's called
an auto-seeker, but the most interesting

01:38:24.375 --> 01:38:25.373
number is the accuracy.

01:38:25.766 --> 01:38:29.925
So you'll see that simple model performed
at an accuracy of 66%.

01:38:30.857 --> 01:38:32.732
Not bad for a minute or so of work.

01:38:33.625 --> 01:38:37.820
You just put in new data into that existing
sample experiment environment.

01:38:38.052 --> 01:38:39.873
So now let's see what Adam did.

01:38:40.824 --> 01:38:42.288
Adam did a couple of things.

01:38:42.624 --> 01:38:46.576
Adam brought in an algorithm called
Two-Class Decision Jungle.

01:38:46.920 --> 01:38:49.469
That's one of the algorithms
in Action Machine Learning.

01:38:49.871 --> 01:38:51.216
He used something called Sweep Parameters

01:38:51.663 --> 01:38:55.569
to sweep over the parameters of that
machine learning model and find the best one.

01:38:56.567 --> 01:39:01.220
He also found that bringing in team
performance data would be very,

01:39:01.467 --> 01:39:08.475
very helpful, so he took the historical data,
married it with team stats, and then let's

01:39:08.745 --> 01:39:11.492
look at that data.
When you look at it, you'll find that he

01:39:12.343 --> 01:39:17.967
brought in data such as the
field goals made, rebounds.

01:39:18.325 --> 01:39:23.295
He even found, for example, that
team performance from away games was actually

01:39:23.424 --> 01:39:26.894
a really important predictor of performance,
of match performance.

01:39:27.519 --> 01:39:29.820
So let's see how that model ran.

01:39:33.371 --> 01:39:35.495
So you'll see the performance went up dramatically.

01:39:35.775 --> 01:39:37.692
It's just about 74% accurate.

01:39:38.910 --> 01:39:44.093
And now that we have a model in Azure
Machine Learning, we can create an API

01:39:44.425 --> 01:39:46.017
with it, a cloud-hosted API.

01:39:46.457 --> 01:39:49.693
Let's do that now.
To do that, we create a scoring experiment.

01:39:50.473 --> 01:39:53.851
And this is a workflow that will run
inside of a web service call.

01:39:54.521 --> 01:39:56.296
And here's the magic.

01:39:57.126 --> 01:40:01.523
It automatically identifies what
the predictive model is, identifies the web

01:40:01.626 --> 01:40:03.271
service input and web service output,

01:40:03.615 --> 01:40:06.074
and we are now ready to publish this as an API.

01:40:06.620 --> 01:40:08.122
We can run it, and when you publish it,

01:40:08.373 --> 01:40:11.096
you'll get an API that is live in the cloud.

01:40:12.171 --> 01:40:13.719
So let's see that API now.

01:40:14.626 --> 01:40:17.096
Well, there.
This is the page you get when you run

01:40:17.297 --> 01:40:19.571
and publish it.
You see that API key at the top?

01:40:19.768 --> 01:40:22.417
That's the API key you will
use on your REST call.

01:40:22.969 --> 01:40:26.627
We can test this.
We can test this API live in the cloud.

01:40:26.870 --> 01:40:32.226
So now, let's take that historic match
between Duke and Wisconsin that just

01:40:32.337 --> 01:40:38.615
happened and see what the API predicts.
So there you go.

01:40:39.167 --> 01:40:45.076
The API predicts Duke will win over Wisconsin
with a probability of 63.2%.

01:40:46.468 --> 01:40:48.168
And that's exactly what happened.

01:40:49.624 --> 01:40:54.409
Now, you can predict the future and build
this intelligence into cloud apps.

01:40:55.974 --> 01:40:57.893
It's very simple.

01:40:58.425 --> 01:41:01.293
You have C# code.
You have Python code.

01:41:01.920 --> 01:41:05.265
Those are things that you can
use to just call that API.

01:41:06.520 --> 01:41:10.618
So now, let me move from the demonstration
to something else that's

01:41:10.874 --> 01:41:14.625
pretty exciting about the language of data.

01:41:15.669 --> 01:41:20.221
Now, machine learning is a field
of advanced statistics.

01:41:21.274 --> 01:41:26.691
And over the last 20 years, a revolution
has happened here with the development of

01:41:27.025 --> 01:41:28.325
open-source R.

01:41:29.276 --> 01:41:34.025
Statisticians all over the world have
now started contributing their latest

01:41:34.265 --> 01:41:36.778
innovations and research as packages in R.

01:41:37.667 --> 01:41:42.694
If there is one language that is truly
about data, something that puts the power

01:41:42.921 --> 01:41:46.334
of data at the fingerprints of
every developer, it is R.

01:41:47.071 --> 01:41:52.670
In IEEE Spectrum's rankings of programming
language popularity in 2014,

01:41:52.923 --> 01:41:55.528
R placed ninth, after Ruby.

01:41:56.177 --> 01:41:58.780
That's an amazing feat for a
domain-specific language.

01:41:59.379 --> 01:42:04.619
So if there's a single language that
you choose to learn today to tap into the

01:42:04.874 --> 01:42:06.895
power of that cloud, let it be R.

01:42:08.718 --> 01:42:14.264
Now, and that's why Microsoft acquired
Revolution Analytics, the company that

01:42:14.695 --> 01:42:20.774
made R scaled to big data and brought open-source
R to the enterprise, making it

01:42:20.896 --> 01:42:21.864
enterprise grade.

01:42:22.184 --> 01:42:26.491
For example, American Century Investments,
one of the largest mutual

01:42:26.621 --> 01:42:30.702
fund companies in the world, uses it to
build their quantitative investment platform.

01:42:31.823 --> 01:42:36.191
Data Song, a local company, a big
data marketing company in San Francisco,

01:42:36.580 --> 01:42:41.291
uses it along with Hadoop for their marketing
performance management and attribution platform.

01:42:42.742 --> 01:42:49.094
Now, to bring the story of R and big data
to life, let me tell you another story.

01:42:51.869 --> 01:42:54.009
We are all big data.

01:42:55.723 --> 01:43:01.531
There are billions of letters of genomic
data in every one of our cells.

01:43:03.029 --> 01:43:05.031
It turns out that each human genome

01:43:05.778 --> 01:43:08.288
is about 2 gigabytes of information, and with

01:43:09.182 --> 01:43:11.933
the power of R, we can analyze all of this data.

01:43:13.268 --> 01:43:17.381
And when we plot this set of information
against the general population, we can

01:43:17.747 --> 01:43:20.017
actually see some incredible things about ourselves.

01:43:23.276 --> 01:43:27.736
So the first human genome was
sequenced in the year 2000.

01:43:28.715 --> 01:43:33.225
It cost about $200 million
and over 10 years of work.

01:43:34.060 --> 01:43:38.290
Since then, the cost of mapping the genome
have come down much faster than

01:43:38.667 --> 01:43:39.625
Moore's law.

01:43:40.342 --> 01:43:45.460
It's about $1,000 to get your entire genome,
and you can get the most important

01:43:45.732 --> 01:43:50.061
parts for about $100, and this is
driving an untold revolution.

01:43:51.189 --> 01:43:52.735
In the future, when you go to a doctor,

01:43:53.741 --> 01:43:57.491
the first thing that they will do will be
to map your genome to understand your

01:43:57.745 --> 01:43:58.693
disease risks.

01:43:59.315 --> 01:44:04.982
This will let them treat you based upon
your individual genome, personalized medicine.

01:44:06.314 --> 01:44:10.100
You will even know the risks you should
anticipate in the future and change your

01:44:10.225 --> 01:44:11.188
lifestyle because of it.

01:44:13.716 --> 01:44:16.695
So let's show that to you with a demo.

01:44:17.472 --> 01:44:21.060
Joining me is Mario, who was
at Revolution Analytics.

01:44:22.033 --> 01:44:24.696
So genomes are analyzed using
the language of R.

01:44:24.903 --> 01:44:27.329
It has one of the richest libraries
for analyzing genomic data.

01:44:28.474 --> 01:44:32.613
1,000 people worldwide have contributed
their genome to scientific research.

01:44:33.387 --> 01:44:36.305
It is public data called
1,000 genomes data set.

01:44:36.670 --> 01:44:40.087
It's about 2 gigabytes of data per person,
and we're going to analyze all of

01:44:40.298 --> 01:44:42.622
that data and see their disease risks,

01:44:43.475 --> 01:44:46.161
and Mario is going to actually
walk through the demo.

01:44:46.497 --> 01:44:51.331
Now, it's going to take only a little bit
of code, but it's a tremendous amount of communication.

01:44:52.126 --> 01:44:55.337
So it really needs big Hadoop clusters,

01:44:55.982 --> 01:44:59.986
so if we could show the Hadoop clusters
that we are actually showing, the slides,

01:45:00.183 --> 01:45:05.781
we're going to use about eight HDInsight
clusters in four Azure datacenters, two in

01:45:06.035 --> 01:45:12.072
the US, one in Europe, and one in Southeast
Asia for a total of about 1,600

01:45:12.307 --> 01:45:13.543
cores in the calculation.

01:45:14.917 --> 01:45:16.668
By the way, they are Linux clusters.

01:45:17.078 --> 01:45:20.898
We are actually running Revolution R on
them, and Revolution R is going to

01:45:21.130 --> 01:45:25.268
coordinate a computation across those
1,600 cores in all of these regions across

01:45:25.380 --> 01:45:27.668
the world.
We are actually going to take computation

01:45:27.909 --> 01:45:31.012
to where the data resides when
we do that global computation.

01:45:31.638 --> 01:45:32.936
So now let's see the core.

01:45:34.981 --> 01:45:38.824
So only a few lines of R code.
This is the code that's actually used to

01:45:39.186 --> 01:45:40.673
analyze the genomic data.

01:45:41.037 --> 01:45:46.501
It leverages some extremely powerful functions
in an R package called Bioconductor.

01:45:47.182 --> 01:45:50.190
And let's also see the code that
coordinates the computation.

01:45:50.585 --> 01:45:54.859
So this is the piece of the code
that coordinates computation on HDInsight

01:45:54.985 --> 01:45:58.828
clusters across eight clusters across four datacenters.

01:45:59.348 --> 01:46:04.785
Let's kick that run off, Mario,
and let's see what it produces.

01:46:04.957 --> 01:46:06.324
It produces a heat map.

01:46:08.952 --> 01:46:11.071
This is a heat map of disease risks.

01:46:11.435 --> 01:46:13.180
Each row is an individual.

01:46:13.477 --> 01:46:14.931
We have fictitious names on the right,

01:46:15.556 --> 01:46:18.305
but each column is a disease.

01:46:18.830 --> 01:46:22.454
So let's take, for example, the second
row from the top, Claire Hickman.

01:46:22.837 --> 01:46:26.531
Claire Hickman has a high risk
of ulcerative colitis.

01:46:27.757 --> 01:46:31.780
And let's take, say, the third from
the bottom, Sophie Albrecht.

01:46:32.316 --> 01:46:37.028
Well, it turns out Sophie has a high
risk of multiple sclerosis.

01:46:37.871 --> 01:46:39.582
By the way, this heat map is an amazing

01:46:39.834 --> 01:46:46.186
visualization produced by a package called
Shiny in R, and it lets you visualize

01:46:46.358 --> 01:46:49.181
things and zoom into these things.
It's very, very powerful, as well.

01:46:50.271 --> 01:46:55.077
So now you've seen the disease risk of
a population, of the population we analyzed

01:46:55.554 --> 01:47:00.873
on the Hadoop cluster, and almost happens
in a few minutes, and it's pretty amazing,

01:47:01.356 --> 01:47:02.788
chunking through all of that data.

01:47:04.031 --> 01:47:10.023
But now what if we could take that R
code, publish that as a web service API?

01:47:10.982 --> 01:47:14.992
So you saw me publish a web service API
with Azure Machine Learning earlier.

01:47:16.184 --> 01:47:21.704
What if I could do the same and create an
API that lets you submit data and see your

01:47:21.981 --> 01:47:23.108
disease risks?

01:47:24.556 --> 01:47:26.332
So let's see the scoring experiment.

01:47:26.558 --> 01:47:28.481
This is a scoring experiment in Azure ML.

01:47:29.954 --> 01:47:31.628
See that execute R script?

01:47:32.239 --> 01:47:37.780
That's where we can actually copy the
R code and publish that as an API.

01:47:38.187 --> 01:47:39.536
So let's do that now.

01:47:40.834 --> 01:47:46.295
So Mario's going to copy some of the R
code, first coding some genomic data,

01:47:46.928 --> 01:47:49.902
put that into the execute R script and run

01:47:50.730 --> 01:47:52.387
that experiment.

01:47:53.350 --> 01:47:58.507
By the way, as it's running, execute
R script shows you how easy it is to

01:47:58.739 --> 01:48:00.471
operationalize R.

01:48:00.722 --> 01:48:04.529
Any R code can be published
as an API in the cloud.

01:48:04.735 --> 01:48:07.940
And Azure Machine Learning lets you
do the same thing even with Python.

01:48:08.476 --> 01:48:13.424
It is the simplest, easiest way
to operationalize your analytics code as APIs

01:48:13.785 --> 01:48:14.505
in the cloud.

01:48:15.153 --> 01:48:22.075
So now, let's see -- let's publish the
web service, and let's get that API in the cloud.

01:48:24.581 --> 01:48:28.099
Here, that's the API page.
You got the key.

01:48:28.957 --> 01:48:31.108
There's even sample code to call that API.

01:48:32.589 --> 01:48:36.537
But to test this, we actually created
-- yes, there's a sample code.

01:48:36.909 --> 01:48:40.430
If you click on it, you'll see C#, Python
and R code are automatically generated.

01:48:42.238 --> 01:48:46.535
So now to call this API and show you
the results, we created a mobile app.

01:48:47.323 --> 01:48:48.387
I'll tell you about that in a minute.

01:48:49.751 --> 01:48:54.304
Now, early in April, I sent a sample of

01:48:54.522 --> 01:48:58.739
my saliva to 23andme.com to sequence my genome.

01:49:00.359 --> 01:49:02.790
Last Friday, I got the results from that,

01:49:03.638 --> 01:49:06.795
and so for the first time, I was able to

01:49:07.038 --> 01:49:09.909
analyze my DNA and see my future.

01:49:11.240 --> 01:49:12.788
So let's do that now.

01:49:14.478 --> 01:49:15.908
So let's take the mobile app.

01:49:19.530 --> 01:49:21.333
Can you all see the mobile app?

01:49:22.929 --> 01:49:27.509
So I'm going to log into 23andme,
get the data from their website.

01:49:33.474 --> 01:49:35.083
It's uploading the genomic profile.

01:49:35.922 --> 01:49:39.473
So you will see a graph that shows the risks.

01:49:41.184 --> 01:49:43.588
So the blue bar is a population risk,

01:49:44.329 --> 01:49:45.737
and red is mine.

01:49:45.988 --> 01:49:52.308
So you'll see that I have low risk
for gallstones, low risk for asthma,

01:49:53.036 --> 01:49:58.623
certainly low risk for breast cancer,
but let's look here at the top.

01:49:58.991 --> 01:50:00.714
Look at that very top line.

01:50:01.730 --> 01:50:04.231
That red bar shows 0.36.

01:50:04.474 --> 01:50:10.476
I have about 2.5 times the population
risk for prostate cancer, and I just

01:50:10.733 --> 01:50:11.819
discovered that.

01:50:12.323 --> 01:50:20.679
That's my future predicted from my genomic
data, R and big data analysis.

01:50:22.387 --> 01:50:26.845
That's the power of big data and advanced analytics.

01:50:27.789 --> 01:50:29.229
So if we switch back to the slide,

01:50:30.784 --> 01:50:34.997
big data and advanced analytics can change lives.

01:50:46.280 --> 01:50:50.429
My next story is about the connected grid.

01:50:52.261 --> 01:50:57.907
For a century, the management of power
has been by analog systems, just like the

01:50:58.147 --> 01:50:59.516
media we were consuming was analog.

01:51:00.049 --> 01:51:04.310
But now, utilities are discovering the power
of big data analytics and the cloud.

01:51:05.678 --> 01:51:11.340
And the hero of this -- the hero of this
story is a small startup from Norway,

01:51:11.951 --> 01:51:14.842
born in a small town of 30,000 people,

01:51:15.074 --> 01:51:19.547
and they're reinventing the future of energy
management, and they're going global with it.

01:51:20.042 --> 01:51:23.782
They're reinventing the grid with the
cloud, creating great efficiencies through

01:51:24.074 --> 01:51:25.394
data and advanced analytics.

01:51:26.357 --> 01:51:30.506
To tell you that story, let me welcome
Erik Asberg, the head of development of

01:51:30.612 --> 01:51:33.796
eSmart Systems to the stage. Erik?

01:51:35.404 --> 01:51:37.310
Welcome.
>> Thank you, Joseph.

01:51:38.929 --> 01:51:40.826
So let me tell you about eSmart Systems.

01:51:42.672 --> 01:51:44.350
We accelerate energy systems.

01:51:45.794 --> 01:51:51.401
We optimize energy investments and
we minimize carbon footprints through better,

01:51:51.623 --> 01:51:53.876
faster energy decisions.

01:51:54.849 --> 01:51:57.880
Like many of you, we are in
the business of disruption.

01:51:58.652 --> 01:52:02.281
We're taking an industry that has
been operating in the same way for over 100

01:52:02.527 --> 01:52:07.475
years, and we use technology to radically
rethink the way we approach it.

01:52:08.781 --> 01:52:13.323
Our disruption is directed at the business
of energy, and we started with a pilot

01:52:13.481 --> 01:52:15.394
project in Norway two years ago.

01:52:17.874 --> 01:52:21.823
So when we started, our goals were to
reduce power grid investments by

01:52:22.249 --> 01:52:26.745
increasing the utilization factor
of existing grid capacity.

01:52:27.278 --> 01:52:29.347
We needed detailed predictions of load

01:52:29.600 --> 01:52:34.601
and power generation, and we needed to
take advantage of IoT and big data,

01:52:35.451 --> 01:52:36.879
since smart meters and sensors are

01:52:37.179 --> 01:52:39.606
a prerequisite for our predictive analytics.

01:52:41.174 --> 01:52:45.123
So the big question was, how were
we going to go off and do this?

01:52:45.446 --> 01:52:50.192
Were we going to spend millions of dollars
and thousands of person hours in datacenters?

01:52:51.453 --> 01:52:54.557
For us, this was an incredibly easy decision.

01:52:55.281 --> 01:53:00.112
We leveraged Azure from the very beginning,
and what makes this so amazing

01:53:00.329 --> 01:53:05.347
is that we made this journey of changing
the business of energy without acquiring

01:53:05.672 --> 01:53:06.750
a single server.

01:53:09.279 --> 01:53:12.396
So here is a look at the eSmart
Connected Grid application.

01:53:12.731 --> 01:53:15.727
All the houses that you see here are equipped
with smart meters and sensors,

01:53:16.282 --> 01:53:20.753
and we use machine learning to identify
potential congestions in the power grid.

01:53:21.878 --> 01:53:29.230
We control consumer flexibility to
avoid substation overloads, and we use both

01:53:29.347 --> 01:53:31.077
short-term and long-term predictions to

01:53:32.374 --> 01:53:36.681
control heated floors and water heating
through home automation.

01:53:38.282 --> 01:53:44.682
eSmart and Azure Machine Learning use real
data to learn for each specific area.

01:53:47.931 --> 01:53:52.228
And we take this information and we make
it available on your phones with consumer

01:53:52.334 --> 01:53:53.877
apps managed by Azure.

01:53:56.373 --> 01:53:59.080
Every part of the power grid is unique.

01:54:00.181 --> 01:54:03.728
There is no system today that is able
to adapt to this uniqueness.

01:54:05.276 --> 01:54:09.226
eSmart Connected Grid and Azure ML
totally changed this reality.

01:54:09.377 --> 01:54:11.259
This is truly revolutionary.

01:54:13.181 --> 01:54:16.831
So we started 2.5 years ago with
no employees, no revenue.

01:54:17.203 --> 01:54:21.327
By the end of this year, we'll be over 40
employees and over 50 million Norwegian

01:54:21.477 --> 01:54:22.625
kroner in revenue.

01:54:22.980 --> 01:54:26.933
I couldn't be happier to be partnering
with Microsoft and Azure, and I want to

01:54:27.128 --> 01:54:30.125
say a big thank you to Joseph
for having us here today.

01:54:30.482 --> 01:54:31.926
>> Thank you, Erik.

01:54:33.373 --> 01:54:34.802
It's an amazing story.

01:54:38.575 --> 01:54:43.532
The cloud amplifies startups
such as eSmart Systems.

01:54:43.881 --> 01:54:46.076
It gives them the power to go global.

01:54:46.446 --> 01:54:50.730
It gives them the power to build applications
that revolutionize entire

01:54:51.128 --> 01:54:53.682
industries in a very short period of time.

01:54:54.178 --> 01:54:59.531
In the future, all of the planet's
power generation, power grids and power

01:54:59.799 --> 01:55:03.575
consumption will be optimized with
real-time data and data analytics.

01:55:04.627 --> 01:55:06.643
And so with the power of the cloud,

01:55:07.377 --> 01:55:12.524
even really small companies like eSmart
systems are able to make that dream come

01:55:12.736 --> 01:55:14.620
true at a speed that no one else can.

01:55:15.474 --> 01:55:17.902
That agility, by the way, that agility

01:55:18.071 --> 01:55:20.848
is a hallmark of the cloud, and that's its magic.

01:55:22.947 --> 01:55:26.424
The cloud turns hardware into software,

01:55:28.218 --> 01:55:35.213
software into services, fully managed
services, and data into intelligence.

01:55:36.577 --> 01:55:39.496
It makes you smart and it lets you free.

01:55:39.979 --> 01:55:47.246
Thank you.
>> Nice job, man.

01:55:50.086 --> 01:55:54.047
I don't think anybody does a better job
of the notion of data as a platform

01:55:54.384 --> 01:55:57.924
and bringing intelligence to data than Joseph,
a great storyteller, great at really,

01:55:58.226 --> 01:55:59.019
really bringing this to life.

01:55:59.367 --> 01:56:03.386
So I think we're on our final run.
We wanted to bridge from Joseph and pick

01:56:03.515 --> 01:56:04.941
up on where we were a few minutes ago.

01:56:05.334 --> 01:56:08.922
So last year, when we were talking about
the web, we were talking about the

01:56:09.143 --> 01:56:11.188
Babylon.js project.
John mentioned that earlier.

01:56:11.536 --> 01:56:13.709
And one of the things we had done is
we actually took a web experience,

01:56:14.189 --> 01:56:19.198
used Babylon.js, hooked it up so we could do
virtual reality with it, took advantage of

01:56:19.433 --> 01:56:22.114
Oculus Rift at the time.
This time, we've been working further on

01:56:22.344 --> 01:56:25.538
Babylon, connecting it into the data
side, trying to make it more intelligent.

01:56:25.941 --> 01:56:27.029
So in the city of Pompeii, the government

01:56:27.191 --> 01:56:30.785
has been using drones to fly around and
map the city, and I'm going to fly around

01:56:31.139 --> 01:56:33.886
using what they've created from that on
the web and let John tell you about it.

01:56:34.592 --> 01:56:39.225
>> So in partnership with the Italian government,
we took these drones that were

01:56:39.482 --> 01:56:44.223
flying around, about 50 hours of drone time,
and we took over 30,000 pictures,

01:56:44.729 --> 01:56:49.432
high-res images of Pompeii, and then the
very interesting thing is we moved that

01:56:49.793 --> 01:56:54.483
information up into the cloud, where we
used Azure and machine learning algorithms

01:56:54.943 --> 01:56:58.431
to go and generate the 3D mesh that
you're seeing in front of you.

01:56:58.719 --> 01:57:01.389
Now, the thing that's pretty incredible
about this is you're actually looking at

01:57:01.557 --> 01:57:04.861
an image that's about close to a trillion pixels.

01:57:05.088 --> 01:57:09.231
And as Steve's able to do, you can
wander around in this thing.

01:57:09.482 --> 01:57:10.458
You can see any aspect of it.

01:57:10.643 --> 01:57:15.028
But I think this really illustrates the
power of when we can take great innovation

01:57:15.391 --> 01:57:19.031
in the client, couple it with the
machine learning, the big data in the cloud

01:57:19.316 --> 01:57:23.548
and bring experiences to every platform that
we wouldn't have been able to do before.

01:57:23.787 --> 01:57:26.118
>> Flew us around.
I ended up in the basilica.

01:57:26.523 --> 01:57:29.030
So this is a good bridge and transition.

01:57:29.334 --> 01:57:31.484
A couple of things here, which
is obviously the cloud side.

01:57:31.937 --> 01:57:35.918
I also have a machine up here, a laptop
with two graphics cards, two GPUs.

01:57:36.194 --> 01:57:39.143
And one of the things I want to bridge
into is gaming, DirectX 12.

01:57:39.391 --> 01:57:42.088
One of the things that DirectX 12 allows
us to do is actually take advantage of

01:57:42.317 --> 01:57:44.753
multiple GPUs, so I can have some
client-side assist here.

01:57:45.236 --> 01:57:48.725
And then on the gaming side, look, like
music, gaming is an area that I'm pretty

01:57:48.920 --> 01:57:50.892
sure everyone in the audience has
some connection to one way or the other.

01:57:51.135 --> 01:57:58.627
There's lots of conversations around gaming
from the mobile side to the Xbox

01:57:58.886 --> 01:58:00.628
and others.
The real thing there is when you think

01:58:00.756 --> 01:58:05.392
about high-end graphics in gaming, it's
not actually the Xbox or any of the consoles.

01:58:05.644 --> 01:58:07.002
It's actually back to the PC.

01:58:07.245 --> 01:58:10.353
And so if I can do that with a two graphics
card system, we brought along

01:58:10.724 --> 01:58:14.625
just for fun a box that has four graphics cards.
Digital Storm lent it to us.

01:58:15.172 --> 01:58:17.344
It's the very highest end on the hardware side.

01:58:17.934 --> 01:58:21.793
And then we asked our friends at Square
Enix to take the work they do, which is

01:58:22.115 --> 01:58:25.126
a mixture of science and really
the computation side and graphics quality

01:58:25.520 --> 01:58:29.346
and art and bring those together and show us
a little bit about what you can do with DX

01:58:29.627 --> 01:58:32.997
12, with Windows 10 and sort of where
this whole technology area is going.

01:58:33.169 --> 01:58:36.799
So first off, I'm going to have their
chief technologist give us a little introduction.

01:58:37.682 --> 01:58:38.955
Let's go ahead and run the video.

01:58:39.196 --> 01:59:15.152
>> [Spoken in Japanese].
>> Domo arigato.

01:59:15.373 --> 01:59:18.792
So Square Enix has built Final Fantasy,
over 100 million copies sold.

01:59:19.193 --> 01:59:22.479
This is an art and science technology
demonstration they put together.

01:59:22.753 --> 01:59:25.524
What you saw was DX 11.
What I'm going to do now is run through

01:59:25.798 --> 01:59:27.589
a similar scene in DX 12.

02:00:14.881 --> 02:00:18.289
Now, you might assume, looking at that,
that that's also a video, but the truth

02:00:18.417 --> 02:00:21.196
is, that's in-game DX 12.
So what we're going to do now is I'm

02:00:21.481 --> 02:00:24.032
going to go between manual and automatic,
so I can shift back and forth, and when

02:00:24.278 --> 02:00:26.437
you see the word manual up
there, I'm going to drive.

02:00:26.679 --> 02:00:28.730
So let's let this go through auto, and
then I'll change the lighting, and you can

02:00:28.850 --> 02:00:29.754
see this real time.

02:00:31.683 --> 02:00:36.431
So as it pauses here, I can take over, so
now I can scroll around, I can look down.

02:00:36.652 --> 02:00:39.125
I can change the lighting effects
as they come through.

02:00:41.332 --> 02:00:42.752
I can move on to the next scene.

02:00:46.135 --> 02:00:47.554
Again, let it run in auto.

02:00:47.937 --> 02:00:49.727
And now I'm going to take it and drive around.

02:00:51.081 --> 02:00:52.675
Again, I can adjust the lighting.

02:00:53.276 --> 02:00:54.721
We can keep going through in this way.

02:00:54.879 --> 02:00:57.287
Let me bring the shadows in, take them out.

02:00:57.885 --> 02:00:59.359
All right, let's keep going through.

02:01:07.534 --> 02:01:10.151
I'm going to pass through this
one and go on to the next one.

02:01:10.531 --> 02:01:12.800
And we'll see as we get closer,
we'll look at the skin tone.

02:01:20.975 --> 02:01:24.002
There we go.
>> Now, the thing that's really incredible

02:01:24.264 --> 02:01:28.169
about what you're seeing is just the density
of data that's involved in this.

02:01:28.419 --> 02:01:33.678
Each of these scenes is over 63
million polygons per scene.

02:01:34.046 --> 02:01:36.368
That's about six to 12 times more than we

02:01:36.522 --> 02:01:40.366
could do with DX 11.
Just to give you an idea on the textures

02:01:40.601 --> 02:01:46.194
that you're seeing here, those are 8K by
8K textures, again, significantly more

02:01:46.462 --> 02:01:49.356
than we're able to do.
I think where it gets really interesting,

02:01:49.595 --> 02:01:51.369
though, is look at the hair.

02:01:51.615 --> 02:01:55.367
Every piece of hair that you're seeing
is actually being rendered as a polygon.

02:01:55.727 --> 02:01:59.928
This isn't surface map stuff, and as
those polygons are running through the

02:02:00.160 --> 02:02:03.626
pipeline, they're running over 50 different
shaders to go through this

02:02:04.064 --> 02:02:06.665
and to generate that level of clarity on this.

02:02:07.114 --> 02:02:11.404
I think it's an incredible example of just
how far people are pushing the limits of

02:02:11.731 --> 02:02:15.985
big data and technology, bringing it together
and really building experiences

02:02:16.216 --> 02:02:18.768
that would be hard to build
almost any other way.

02:02:19.120 --> 02:02:21.598
>> And so our thanks to the folks at Square
Enix for letting us show this off

02:02:21.708 --> 02:02:24.196
and for building it.
Incredible piece of technology and art

02:02:24.322 --> 02:02:25.064
put together.

02:02:25.447 --> 02:02:29.026
Now, that's sort of the high end, incredibly
fun -- let's give those guys a hand.

02:02:34.317 --> 02:02:38.288
Graphic intensive side of gaming, and now
for something completely different.

02:02:38.386 --> 02:02:41.125
If you go to the other end of gaming, one
of the acquisitions we made earlier in the

02:02:41.364 --> 02:02:45.522
year was Minecraft, and Minecraft is
a community game, lots of people like to

02:02:45.860 --> 02:02:47.356
work on it, mod on it.

02:02:47.818 --> 02:02:51.399
It's a place we get a lot of feedback to
not change the modding side of it, to not

02:02:51.503 --> 02:02:53.324
change the community.
So what we wanted to do was actually

02:02:53.513 --> 02:02:56.475
contribute to the community, so what
we want to do today is announce the

02:02:56.683 --> 02:02:59.130
availability of a modding toolkit
for Visual Studio.

02:03:00.440 --> 02:03:03.528
I'm going to pass on this slide and come
back to it, since I paused along.

02:03:04.410 --> 02:03:06.736
And so I want to invite Aiden Brady --

02:03:07.011 --> 02:03:09.309
that's a junior out of Atlanta.
He's actually one of the top modders in

02:03:09.648 --> 02:03:12.365
the US, and Briana Roberts from our team.

02:03:12.591 --> 02:03:15.536
They're much better equipped to talk about
this and demonstrate it than we are,

02:03:15.846 --> 02:03:17.196
so I'm going to have them come on out,

02:03:17.716 --> 02:03:20.269
and why don't you guys show us what's
going on with Visual Studio?

02:03:20.399 --> 02:03:24.080
>> Hi, everyone.
My name is Briana Roberts.

02:03:24.462 --> 02:03:26.067
I'm thrilled to be here today.

02:03:26.643 --> 02:03:30.692
I'm a senior content developer in Microsoft
Learning Experience's academic team.

02:03:31.333 --> 02:03:34.865
We sit with the Developer Experiences
organization led by Guggs.

02:03:35.365 --> 02:03:38.876
So why am I here today? Well, I happen
to think I have the best job.

02:03:39.043 --> 02:03:43.742
I get to create awesome content to
get students excited about computer science

02:03:43.889 --> 02:03:44.562
and computer programming.

02:03:45.248 --> 02:03:48.540
You may be asking yourself, what's
hot with kids these days?

02:03:48.680 --> 02:03:52.348
And the answer is Minecraft.
It is one of the newest ways to engage

02:03:52.485 --> 02:03:57.019
students and teach them about coding using
mods like the ones we're going to demo today.

02:03:57.321 --> 02:04:02.145
Minecraft is an awesome education tool.
It's being used over 5,000 schools,

02:04:02.250 --> 02:04:03.917
libraries and after-school programs.

02:04:04.535 --> 02:04:07.949
All right, without further ado, I
want to introduce Aiden Brady.

02:04:08.208 --> 02:04:11.646
He's a high school student out of Atlanta,
Georgia, and let me just throw

02:04:11.807 --> 02:04:14.860
this out there, but he's a big deal
in the Minecraft modding community.

02:04:15.224 --> 02:04:19.912
His very first mod, Mechanism, has taken off.
It's huge.

02:04:20.409 --> 02:04:24.309
So, Aiden, will you tell us a little bit
more about yourself and your love for Minecraft?

02:04:24.460 --> 02:04:26.682
>> Sure.
My name is Aiden Brady.

02:04:27.141 --> 02:04:29.106
I'm 17 years old and a junior in high school.

02:04:29.932 --> 02:04:34.108
I started programming in Python when I was
10 but moved on to Java when I was 12,

02:04:34.341 --> 02:04:35.792
which I've kind of focused on ever since.

02:04:36.057 --> 02:04:40.112
A friend introduced me to Minecraft in 2011,
and it was kind of the perfect fit

02:04:40.274 --> 02:04:42.663
for me, because I already knew the language
and I just loved the creative

02:04:42.860 --> 02:04:44.226
potential that the game had.

02:04:44.480 --> 02:04:48.343
I hope to later on get a computer engineering
degree and maybe an MBA, too,

02:04:48.588 --> 02:04:51.793
to do what I love, which is maybe to work
for a company as awesome as Microsoft.

02:04:51.986 --> 02:04:53.412
>> You're well on your way.

02:04:53.735 --> 02:04:56.917
Well, I don't know if everyone in the
audience has played Minecraft.

02:04:57.316 --> 02:05:00.631
Maybe their kids have.
Can you tell them what a mod is?

02:05:00.881 --> 02:05:03.516
>> Sure.
A Minecraft mod is basically an extension

02:05:03.737 --> 02:05:06.236
of the Minecraft game.
It can add new content, and if you're

02:05:06.479 --> 02:05:09.631
familiar with the game, it's things like
new blocks, new items, but in our case,

02:05:09.880 --> 02:05:12.314
we're just going to focus on one new
block, which is kind of exciting.

02:05:12.736 --> 02:05:16.963
>> As Guggs mentioned, Microsoft recently
acquired Minecraft, and we're so excited

02:05:17.196 --> 02:05:20.994
about it, and we really committed
to continuing this vibrant community of

02:05:21.242 --> 02:05:24.398
gamers that we have out there.
So what we're going to today is show off

02:05:24.636 --> 02:05:28.107
some Minecraft modding using
Java in Visual Studio.

02:05:28.479 --> 02:05:30.914
>> Yes, and this tool is fantastic.

02:05:31.284 --> 02:05:35.307
I recently switched from using Eclipse as
my primary modding development tool,

02:05:35.715 --> 02:05:38.943
and honestly, it's the perfect transition.
It's easy, it's intuitive.

02:05:39.082 --> 02:05:41.311
I love it.
I feel right at home.

02:05:41.565 --> 02:05:45.117
And right here, you can see on the new
project dialog, we have a few little

02:05:45.477 --> 02:05:48.659
templates here, and I love this.
These are Minecraft Forge mod templates,

02:05:48.914 --> 02:05:52.341
so by clicking this right here, we're able
to make a new Minecraft mod just like that

02:05:52.630 --> 02:05:55.286
and get started.
And there's also one that's near and dear

02:05:55.591 --> 02:05:58.030
to my heart right here, which
is the Mechanism mod sample.

02:05:58.514 --> 02:06:01.394
So you can mess around with what I've done.
>> This is awesome for all these Java

02:06:01.636 --> 02:06:05.112
developers, that they can just both play
and change the game that they love,

02:06:05.596 --> 02:06:06.943
all within our IDE.

02:06:07.558 --> 02:06:12.015
Now, if you're familiar with Visual Studio,
then you're familiar with IntelliSense.

02:06:12.244 --> 02:06:15.796
We are going to show off some of the key
features of IntelliSense that really bring

02:06:16.036 --> 02:06:17.823
this modding to life for these developers.

02:06:18.089 --> 02:06:21.760
I want to make sure I throw it out there
that this is not a replacement for Eclipse.

02:06:21.930 --> 02:06:25.416
This is an add in that's been built
so students just like Aiden, who want to

02:06:25.684 --> 02:06:28.147
build and create, can do so in Visual Studio.

02:06:28.735 --> 02:06:31.118
We're going to get into the
code just a little bit.

02:06:31.235 --> 02:06:33.835
You've seen this with other languages.
Now you'll see it with Java.

02:06:35.084 --> 02:06:39.768
So as I hover over a keyword, I get the
quick info, which displays the complete

02:06:39.883 --> 02:06:41.488
declaration of code that I'm looking at.

02:06:43.164 --> 02:06:50.208
Now, as I type a word, and I'll type that
period, a valid list of members appears.

02:06:50.681 --> 02:06:54.766
All I have to do is hit tab.
It'll add that selected line into my code.

02:06:55.252 --> 02:06:57.799
Aiden, do you want to tell us
about parameters? >> Sure.

02:06:58.167 --> 02:07:01.083
Parameter info here gives you information
about the name, number and types of

02:07:01.361 --> 02:07:04.715
parameters required by a method, and in
this case, you can see we have a parameter

02:07:04.837 --> 02:07:07.235
listed in bold.
This is the next parameter required by

02:07:07.516 --> 02:07:08.990
the series of parameters of this method,

02:07:09.441 --> 02:07:13.310
and it's fantastic for new developers.
I wish I had this when I got started.

02:07:13.564 --> 02:07:16.083
>> Yes.
I can't even imagine learning to program

02:07:16.199 --> 02:07:18.242
with this kind of help.
This is awesome.

02:07:18.486 --> 02:07:21.722
>> All right, but on that note, I say
enough coding, and let's play something here.

02:07:21.965 --> 02:07:23.685
>> Okay, so what do we have now?

02:07:24.154 --> 02:07:26.760
>> All right, now, this is a little
project that I've been working on.

02:07:27.412 --> 02:07:30.605
If we open this up here, you see we're going
to run this directly through Visual Studio.

02:07:30.964 --> 02:07:34.148
And as this is loading, I just want to
say, when you think about Minecraft,

02:07:34.403 --> 02:07:37.211
you think about the game, like I already
mentioned, the creative potential that it

02:07:37.481 --> 02:07:39.691
has, and that's why I got into
the game in the first place.

02:07:40.080 --> 02:07:43.032
You're opening this world and you can do
whatever you want, build whatever you want.

02:07:43.310 --> 02:07:44.288
It's so cool.

02:07:44.535 --> 02:07:47.921
But, okay, getting in here, I'll
open up our little test world.

02:07:48.312 --> 02:07:51.804
And in here, I'm going to open up
my inventory, and you see the normal

02:07:51.912 --> 02:07:54.689
Minecraft TNT block right here.
>> Sure.

02:07:54.881 --> 02:07:58.681
>> But we have a fancy TNT block here
that's going to do a little bit more

02:07:59.014 --> 02:08:02.360
damage than what you might be used to,
so here, I'll place a few of these down.

02:08:03.765 --> 02:08:08.629
>> It's perfect, because I happen to have
this trigger over here, so I think it's

02:08:08.885 --> 02:08:10.166
going to help us with this explosion.

02:08:10.489 --> 02:08:12.812
It's a little smaller than
when I ordered it online.

02:08:13.110 --> 02:08:15.111
Okay, I'm going to hold this.
You ready?

02:08:15.363 --> 02:08:17.685
Go.
>> Whoa.

02:08:18.416 --> 02:08:19.636
>> That was awesome.

02:08:19.879 --> 02:08:22.761
This extension is available.
Make sure you go check it out.

02:08:23.003 --> 02:08:24.321
We cannot wait to see what you build with it.

02:08:24.487 --> 02:08:26.835
>> Thank you so much.
What do you guys think?

02:08:27.229 --> 02:08:28.078
Did they do a great job?

02:08:30.263 --> 02:08:32.012
>> Thank you.
>> Thank you.

02:08:32.127 --> 02:08:34.417
>> Thank you guys so much.
We've got to get him back to school.

02:08:34.567 --> 02:08:37.286
I think he's missed two days of school because
of us, so we want to make sure we

02:08:37.398 --> 02:08:39.442
did a good job.
Look, we've got lots of great partners in

02:08:39.551 --> 02:08:44.754
this area, as well, on the tool side with
Unity and Cocos, Trivia Crack, Cut the

02:08:44.888 --> 02:08:45.726
Rope, social games.

02:08:45.968 --> 02:08:48.119
I'm addicted to Trivia Crack.
I hate to say it.

02:08:48.683 --> 02:08:52.924
Monument Valley has got a new game coming out.
So, again, we've got folks pushing us,

02:08:53.407 --> 02:08:56.418
working with us, making sure we
do a great job in this area.

02:08:56.683 --> 02:08:59.919
Look, as we get through this, then,
I wanted to come back around to

02:09:00.166 --> 02:09:02.955
conversations with developers.
You saw a bunch of different ones today.

02:09:03.208 --> 02:09:04.423
One of the things that John and I do,

02:09:04.661 --> 02:09:07.437
and our teams around the world, is
we like to get together and code.

02:09:07.913 --> 02:09:10.014
We run hackfests.
They're not competitions.

02:09:10.127 --> 02:09:11.686
It's not a hackathon.
It's getting together with you

02:09:11.927 --> 02:09:14.094
and building things.
All the companies listed here and groups

02:09:14.365 --> 02:09:15.805
are groups we've worked with.

02:09:16.175 --> 02:09:18.837
We have space up in Seattle
that we use for doing this.

02:09:19.232 --> 02:09:21.556
I'm happy to announce that we're going to
open a space here in San Francisco under

02:09:21.764 --> 02:09:24.530
the Reactor label.
That's why I changed my rugby jersey --

02:09:24.687 --> 02:09:27.485
so that we have a space here.
Obviously, I'd love to have space all

02:09:27.727 --> 02:09:30.239
over the world.
We don't, but we are available all around

02:09:30.377 --> 02:09:31.947
the world.
So we're going to make sure we show up

02:09:31.947 --> 02:09:32.689
wherever you are.

02:09:33.065 --> 02:09:35.951
The Reactor space will be here in San Francisco.
We've got one in Seattle.

02:09:36.215 --> 02:09:39.722
And then as a team, we're going to take
the content from Build, the things you're

02:09:39.874 --> 02:09:41.088
going to see the rest of the day and tomorrow.

02:09:41.368 --> 02:09:44.565
We'll be going to 26 cities around the
world, try and show up where you are.

02:09:44.854 --> 02:09:48.723
In addition, we'll be either hosting or
showing up at thousands of events around

02:09:48.963 --> 02:09:51.880
the world over the next year, to
bring everything you saw from Joseph's work to

02:09:52.129 --> 02:09:56.082
Kevin and David to everybody else that
works with us in the company, the Office

02:09:56.254 --> 02:09:57.207
Graph and all the other pieces.

02:09:57.937 --> 02:10:01.353
So with that, I want to thank
you for your time today.

02:10:01.605 --> 02:10:04.009
We're going to have a maker
video as our walk off.

02:10:04.279 --> 02:10:06.956
The thing I'd like to say, I think, which
Joseph has teed up, if our meme this

02:10:07.159 --> 02:10:11.037
morning was more code, then in the words
of Christopher Walken, I think our meme

02:10:11.325 --> 02:10:14.287
for the rest of the day and probably
next year is more cow.

02:10:14.635 --> 02:10:17.166
With that, I wish you well.
Have a great day.

02:10:17.652 --> 02:10:19.429
[Begin Video].

02:10:20.170 --> 02:10:21.960
>> Making really is about sharing

02:10:22.177 --> 02:10:24.766
and about a lot of collaborators.

02:10:25.257 --> 02:10:29.288
>> What I love about being a Microsoft maker
is what Microsoft does to enable us

02:10:29.520 --> 02:10:33.072
makers here at the company.
>> You can come in and there are many

02:10:33.194 --> 02:10:36.636
different people from all different sorts
of expertise, and they can all help you

02:10:36.765 --> 02:10:38.018
out in various sorts of projects.

02:10:38.365 --> 02:10:41.721
>> There's been a tremendous opportunity,
especially in the last few years,

02:10:42.081 --> 02:10:45.481
of opening up beyond what Microsoft
has traditionally focused on.

02:10:46.083 --> 02:10:48.530
>> B15 is a robotics platform that we

02:10:48.684 --> 02:10:51.231
built in conjunction with the HoloLens team.

02:10:51.457 --> 02:10:55.235
>> A lot of the IoT devices are headless devices.
They don't have a display.

02:10:55.534 --> 02:10:59.636
But when you put on a HoloLens, that can
become the display to not only view the

02:10:59.888 --> 02:11:01.633
rich data coming out of the IoT devices,

02:11:02.138 --> 02:11:03.999
but also to do command and controller.

02:11:04.218 --> 02:11:07.355
>> There are now increasing emphases on
the Internet of things here in the

02:11:07.600 --> 02:11:10.045
company, and as part of that, we had to
build a platform for us to work on.

02:11:10.269 --> 02:11:14.031
Micro Framework has become the Microsoft
answer for resource-constrained devices,

02:11:14.611 --> 02:11:17.838
with Windows providing a solution
on larger devices.

02:11:18.373 --> 02:11:23.123
>> When makers got a chance to experience
Visual Studio 2015, they were delighted to

02:11:23.484 --> 02:11:28.490
see all of the capabilities and power of
Visual Studio 2015 available for building

02:11:28.962 --> 02:11:29.819
IoT applications.

02:11:30.457 --> 02:11:35.422
>> My son did a picture of the sun and
tree and landscape, and what virtual

02:11:35.685 --> 02:11:40.438
shields allows him to do is to take the
current location, go to the web, get the

02:11:40.768 --> 02:11:45.124
weather forecast and actually turn on
lights behind his picture on an LED strip.

02:11:45.528 --> 02:11:48.433
It feels good to tie that into the virtual
shield work I've been doing.

02:11:48.686 --> 02:11:52.449
>> I've been building Tesla coils since
I was a small kid, and it's been a great

02:11:52.698 --> 02:11:55.204
passion of mine.
Because my Tesla coils are electronic,

02:11:55.699 --> 02:11:59.126
that means I can control them with
some sort of electronic device.

02:11:59.498 --> 02:12:00.694
So I worked together with Jason who

02:12:00.853 --> 02:12:05.499
creates great music on his own free time,
and we created this project where Jason

02:12:05.720 --> 02:12:10.129
will have his Surface Pro pumping out beats
and music, and this could talk to my

02:12:10.364 --> 02:12:18.527
coil and make them sing.
I'm a maker.

02:12:18.698 --> 02:12:20.127
>> We are makers.

02:12:20.557 --> 02:12:22.731
>> We are makers.
>> We are makers.

02:12:23.018 --> 02:12:25.212
>> We are makers.
>> We are makers.

02:12:25.560 --> 02:12:26.889
>> We can't wait to see what you'll make.

