de:code 2018 [AD14] .NET Everywhere ～ .NET が創る Mobile & Cloud Native プラットフォームの未来

[de:code 2018](https://www.microsoft.com/ja-jp/events/decode/2018/)に参加してきましたのでその結果をまとめています。

内容の間違い、誤字脱字等はご了承ください。正確なところは、本家のサイトを参照いただければと思います。

# タイトル等
## タイトル
de:code 2018 [AD14] .NET Everywhere ～ .NET が創る Mobile & Cloud Native プラットフォームの未来
## 演者
井上 章さん　日本マイクロソフト株式会社
## 日時
2018/05/22 17:10-18:00


#概要

現状の.NETの状況がどのようになっているのか、どのようにどの技術を使用していけばよいのか、についてのセッションとなる。

# 実例

![画像](https://9wudya.bl.files.1drv.com/y4mci9kpiXAb5sK_s7nIy-fNI-QGyXdu5zlag8v7rI06Q4P9ziw67LkFBzeGjs0rpmWIYZu9GPNPPICioqWBrh9zHka51lfnXtZwvgP68kMdwvNOrRmqvFoenS1hp52HUXeadZyAM-KbsW2F4H3SnlvPmT0BaVw779BHlQUKRtr6U5InaN9swUVNHSOdHgkSre3_7hCiHaudkH5v5-DyO2O7g?width=3587&height=2018&cropmode=none)

モバイルで動作しているアプリケーション。予約、サービスが動いており、ホテル、従業員、スタッフが使用している。

使用するデバイスは、Android、iOS、PCまで様々となる。

この中で、アプリ開発のチャレンジが出てくる。

* 画面サイズ、レイアウトが多様な中でどのように作っていくか。
* 様々なデバイス（スマートスピーカー、ホロレンズ）でアプリケーションを動かしてほしい
* AIを使用してほしい！
	* どうしろと？

# Microsoft .NETの歴史を振り返ってみよう

去年で15周年となる。2002年のコマーシャルでは、ワインの流通業者と売る側で.NETが動いていてダイレクトにつながることができる、というCMとなっていた。


# .NETの基本構成
![基本構成](https://pqs4pq.bl.files.1drv.com/y4m4OVKucJUA8p8EzlS3xLJj7FX_da7Pqes6QTWNM9fFBmFEpurKUVGuoIYd0YjKdvzIvn4wMCzZb6E6LZMBVHB0WUD66MPCcW-tfMWwNo_McF_-RFzqP-p_vjjx6FlI031OZ_LZpRQ39KtZflFUeMuEjUKE4Ycq5wNzF1WmkOUUK_tIMkZa5JfnPnhZywrbnEbi4QzHxTCzWb2kIG_AM-Fcg?width=3429&height=1929&cropmode=none)

基本としてWindows上でしか使うことができないというものだったが、クラウドを使用する上でもっと変わらなければならない。

![画像](https://9qs4pq.bl.files.1drv.com/y4m0LCfqz_yD68iRilIEaS5ULzyJCAerptpGoL4cWdQ0onQQmwIYISRjYXTVscCiXPHjk6s3bkgKuD9OjfhJsyO92wREpAPa7QJ_KgyVFsrOmrPch1Xj9fGXRjf51c1RuvgI1DRASHgBMLvH2tuQJGi-vKK9I6prg41tSp91yyGxuuytWxyS3D_Y66s8LVAcEBMS5Hbj8QdbfZt6gpvg7kalg?width=3348&height=1883&cropmode=none)

2012年にScott Hanselmanが「ASP.NETがオープンソースになり、もっと楽しいものになる（意訳）」と言っているが、これが現実のものとなってきている。


![画像](https://9gudya.bl.files.1drv.com/y4mN6GKcEBlJtmhDyKTDr1piqCHe_2vxPii8C2Z4bR1zxSYctVY0fzw-7cAMrmBwGForRx_0B3Vsiii66KaqiCm-xzQxlZQKVHVcpX1W1C1RctAJt5O3ZYlbhcZieTK6ZyzwZPpFWEJoCwQ_ERESWDgLdpd2afwY-8aSHYtZ0ugwYev48XJuLs_K7AxZzspq9T0hu2ztm4065Ud8BESGxGnPg?width=3396&height=1910&cropmode=none)

現在の.NET Coreに生かされているのが2014年のOne ASP.NET構想（KATANA Project）となる。

# 現在（2018）年の状況
![現在](https://9ws4pq.bl.files.1drv.com/y4mC-N7IvyzBHArmGZJJZa6Bh5qTD18R3zN8VhsFl76clUdqcF6f-yzc_-Sfb65Rd5rKAmlnUywuZkbwxYISqNMw0sprA-Ej-gUowzB0ktzKPThkW9ZFehXY17VaRGGspsFcSYP-4cTyR9_mp5-P-H4TrxHgxs9qh12DQ6kLJVQG1g3MHNP2UsRLHfUQH_0amolln9hh735v3Ryb_FlAsDRyQ?width=3257&height=1832&cropmode=none)
## .NET Framework

Windows上で動作する。

## .NET Core

Windows、Mac、Linux上で動作する。ただし、GUI（UWP）については、Windows上でしか動かない。

## Xamarin

Windows、iOS、Android、Mac上で動作する。

## .NET Standard

.NET Standardは、各フレームワーク間の共通ライブラリの実装に使用する。

# .NET 開発者の増加

![画像](https://7qs4pq.bl.files.1drv.com/y4mcKoMqW093hzo_l3FOYL9dEcclcZvhBtrmGPocEc6RpeXirAyda7YmqSc7yS5BQ4LHCucGuBiZCFZ4TR8mCMfPjTL8L5_TqFCsSywi-Uk9Q7fx4AUedR6qbmbOir_1lKVsQSWmCdHKx9HSVvzWB3flAMnNRt1AmpM1MFlFnlA00As_uuxIVh6vbIGWHkMLrICjiw7EHJNb5aaUTZoVskVrg?width=3231&height=1817&cropmode=none)

アクティブな開発者が、昨年（2017年）に100万人以上増加している。ここで大事なのは、アクティブということである。最近の開発ツールと同様に、Visual Studioはテレメトリ情報を取得しているので、インストール数ではなく、実際にアクティブな開発者ということである。

![オープンソース](https://7gudya.bl.files.1drv.com/y4mlINPi2p-pg2ky5kLxzZsQBL8IiHkb3DWHd5t1Pc8yfiLVtsCMwe6aiS4c60HkbGDrfw4n-zb8yHayvbz3zasCk7NDF4vtAqQOEBt14CjJYfveh61UEtapq2Cihz7sYjBosnBlsZl-ENbCng7aPZB5xLoaTWqczjPk8Emcm2DTvPNVyQmMLOml40aKz8mhR6zIddsgGsUmMJq25Ut93LmGg?width=3338&height=1878&cropmode=none)

またGitHubへの登録状況を見ても増加状況にあり、すごく盛り上がっている状況である。

# .NET の各言語の対応状況

VB.NET開発者としては、.NET Coreも出てきた状況で、VB.NETはどういう状況にあるのか、ということが気になるところだと思う。

下に示すように.NET Coreでも各言語（C#, VB.NET, F#）の対応は進んできており、C#しかサポートされなくなる、ということはないので安心してほしい。

![対応状況](https://9gs4pq.bl.files.1drv.com/y4mA6yMktQO0UcKXVbVuttL5P025SYMyKV8zresLpDuJjv7qTLy5S1M7oS7zqCe52uFBQlKx9BkrO547kZ2NhnyCr1tcUzSLEXyJfqE80qqZ_2K_WyoSsthjhw1to8kBwtLvjiHtcBPsHcyY1QnMCMijKni-xl1NwdF2XkPnASABECffFnQRXw356k73WujWiq4l77iaxdEEnAOfWpLGDEkQg?width=3538&height=1990&cropmode=none)

# Xamarin

## 画面デザインの共有

画面デザインを共有したいなら、Xamarin Native Formsで画面を共有する。画面を共有するなら、最近主に使われている手法である。

## Xamarinのコンパイルとパフォーマンス

![コンパイル](https://pgudya.bl.files.1drv.com/y4mVXIUJ6v0lvvJJkqrewzVl1xDyRS_UZ0ozStEKVlut8BXvjMh9bJW9zczRRpnCd8OmxiD4lEn_2hhSZtYqcGudbrHAOeFZmxKlTudTnAqNOzuzX4bA8QR-5c53TKHhnaz5-6aVrhZa2IcKnE4t7KGZhzOvbXGw_ePDjPk-Udry0GMtFuWrQ_UPV5E-leRYxJognJLIIlG0TMyafMxKN7lXg?width=3436&height=1933&cropmode=none)

iOSは事前コンパイル、Androidは実行時コンパイルとなる。どちらの場合も、Nativeで動作する形となるため、高いパフォーマンスを発揮できる

## Build 2018で発表されたアップデート

![アップデート](https://pwudya.bl.files.1drv.com/y4mfRGJE0BnY_bUpwapgv3ateh5s85by4CEFbdgwvPbD-vs7mZwgYsSRXvHL45_2L6bxgH9fVgaUjvre7bX2df4EDv6VuVMNyocCXqs7d21-sSYKWBbJ88MN_eXWPXuuctoCVKgR-U8l2iTd103lXinjEuzH_EH-gXq8n2BBrgI-CH4j12vrxDmIDyu2bdZv6oDwm7k9Kr3kfAcDRTAZTClWg?width=3352&height=1885&cropmode=none)

* Xamarin.FomrsがアップデートでCSSに対応する
* 共通のライブラリとして、Xamarin.Essencialsが利用できる
* Android Emulator for Hyper-V 対応が出てきている。速度が早いのが特徴

## Xamarin.Forms on the Web

![Xamarin on the Web](https://qaudya.bl.files.1drv.com/y4mvZeObzf4NjXjsAh3NSzcB-WMgVGt_EnnuUy92ckRafXuOHUyYDx2xFX38uRIg2t0FVjaRusb-hdJsp3hzBnOb9BQlziiWQbg9rtBSjVqvMWhXJVAj-BTkUD1sR_PeO7Rrgr3tJN3OiVskqZ0rEWW3qze5wvdMwWAT4_h8FzSiGzbZqllTSGl3XwFKFXX0OSbg4JNPGeQY_C5RiofdA3GQg?width=3569&height=2008&cropmode=none)

XamarinのコードをWeb Assemblyとしてコンパイルすることで、ブラウザ上で動作させることができる

# .NET Frameworkの統一化

![統一化](https://7qudya.bl.files.1drv.com/y4mC9bbnr9fZ0WKtJoTRfBtjNlqmZUWCBt_AiM_Q3LsqavFvUYuIOSu6LI0eApgioeh_n7T2YisRHKdmKorCM-TXOcOZ0JcSw3obMsSpNUnR3JYaQkijNbrTHkvSqHpV8Nn2wn7hniz3-5WU1DK_OrFtlHxQyKVZh1cCmbxO5pIad3VTcZ4y1cDQhDuRehtcCHNpucqP_7K0xjBRHG0bX74IQ?width=3397&height=1910&cropmode=none)

.NET Framework、.NET Core、Xamarinで、コードライブラリの共有化を行いたい、という要望、方向性がある

## .NET Standard

![仕様](https://paudya.bl.files.1drv.com/y4mkiJj2_vflmH0CoTkmM42-LyJ-V7bXAgBacXG33ZxtxXsBZZzAlKdfBAYz5LtC356fUV_gYj1bezs7_Ibwo3AAIlg9ErveViwjrPZ6AoPBiBuUsZx2x8Q20i1NfcldZfGmuiI-xvmTf-VHFF7z4HxhkOYwHQDEkbba9FR4-s9ElT0x4SxsGHBMdkODoqNCmxoHwL38zFit5D1yoQOeOMeGg?width=3462&height=1947&cropmode=none)

考え方としては、HTML5と同じ。すでに仕様はできており、できている仕様に対して、各Frameworkが実装していくという考え方となる。

![統一仕様詳細](https://9gtn3w.bl.files.1drv.com/y4mNxtaFP-ohoDIJETXByAX4WSIapkBMq2uLEr-E8XQ6CvgHbtlggawh-2tJX4HM4FDL2G8D-oUDiFr9DdNkEQXyEWjcdPPQleHDPxWiYRZsKm66CJDv6Z4y_XK18jx4Q9DWLhTOwLkSOmFEGVSUzq7fyQQ0EX5uIMGfceqs4aa9ps2nniORPUsBeOEw-2U9J-H1SsKtaOOElGJ8veMcFwnew?width=3485&height=1960&cropmode=none)

基本的に、各Frameworkが実装するというのは、既に述べられた通りだが、Type Fowarding(型の転送)については、共通DLLを経由して行うことになる。

## デモ

Xamarin.Formsと.NET Framework、同じプログラムをそれぞれで作成し、共有コードは.NET Standardで共有しているというデモが行われた。

ソースは、GitHubのリポジトリで公開するかも、とのこと。

また、iOSの実機で、顔認証で特定の人しか使えないアプリケーション、画像認識して、ラーメンを判定するアプリケーションのデモが行われた。

# .NET Core 2.1(RC)

![アナウンス](https://pwtn3w.bl.files.1drv.com/y4mj1eL4mfM1kuMM78I4g_ettNyZj29RuJuP7U7YQgmgVj9sR6qOQ8Z_sjVrE62IygQZYs40uabAHu-LymnScZxN6UB5Tsc5bvnxj6lP6NKICuFIH8Dg0qpgX7d3UDM7gmzRGFrEuulk66IsNzJAzrSV6sZBtEh_Q5hW0HwpHuAEB0kp1AyoqBpTnUfsGlQAnyaOYkPMymNbvQfiTkwJS5rnQ?width=3490&height=1963&cropmode=none)

RC版だが、既に製品で使える状態。パフォーマンスは、SDKでもランタイムも改善している。ランタイムだけではなく、SDKも改善しているということで、開発時の効率改善も見込まれる。

## 実装予定の機能一覧

![機能一覧](https://pgscva.bl.files.1drv.com/y4mOFSRgck0oad6cClmDJWllJHc-29KkWbDff4y83GcWwJnoPgcTi1yD-6NkAiOZIxjj6qpXJILs20aBxbB8aeU7ld1tXJvGwk3DjnI2JYxiGj0VEoOWGJL1ZMEen4pHFQ_Lueldf2JkbxfnMULbkQ1texR34y1jlXuejL2KSSjGP48lwBQjlrm2ned059OfyAZmiMO1c2LoruKzxSvDEytJA?width=3205&height=1803&cropmode=none)

ラズパイもサポートしている。実装としては、ラズパイ上のDockerコンテナで動くので、ラズパイ上で動作する.NET Coreベースのアプリケーションを作ることができる

### デモ

Signal Rを使うと、リアルタイムのWebサービスを作ることができる

## Blazor

![Blazor](https://7qscva.bl.files.1drv.com/y4mmf22w1buiElD-L5HpoPaQCQl8jOAgErHl1qtIPDYYTfrWfKglHYZ-9NATjqDD9iXDRWktiECFjS8zDSGa_rft7SbakvEXymsAd50QUMeascZHV2RW2eVDiOr9-u1OrNbRakIXJzjRP9NArrDEjixMb4j8fOHew-Tp_bcHXl9gM0IfMTLmOyYf3nqmt3BZXndINlLf_wUGQ4aDvgSCo1GVg?width=3340&height=1879&cropmode=none)

**Browser + Razor = Blazor**

すべてのブラウザーで動作させることができ、Reactiveなどを知らなくても、.NETでクライアント側のWeb UIをビルドすることができる。

Web Assemblyとなるため、ブラウザにプラグインなどは不要である。

クライアントとC#でのコードの共有、C#の強く型付けされた開発、.NETの安定性と一貫性を受けた開発が実現できる。

### デモ

ポイントとして、WebアプリケーションにDLLが配布されていることをChromeの開発者ツールで確認した。

読み込み速度が重くなるのでは？という疑問については、最近はJSも大きくなってきていることを考えると、誤差範囲になるのでは、と想定しているとのこと。

実行はクライアントのOSのNativeで動作するので速度的にも有利になる。実装としては、コンパイルされてブラウザー側で動いている形になる。

# .NET Core 3.0

今年度後半にはPreview版が出てくる。

## Desktop Packs
![概要図](https://pwscva.bl.files.1drv.com/y4m9j81w5TBt9zP7DaKXAKv-hxmmLUDW_TwHL0qfqJxjKvJ_2qGfXqJ-dv53TFbkJC7e0CPx8EgzWBNoAUP_IWfE7O7tGokupVrLVbMG8OxKaGK-qKeI_i5fXjCSpdmnr-GcaP17_GWG1xvIDVk11HKTuEcvRocbqhgFEpSJNZOwBy8qYDxxt8hE72C5vNeoekrb13zjnrrD_MLMCBWO01JOQ?width=3410&height=1918&cropmode=none)

Desktop Packsが実装される。

Desktop Packsを追加することで、Windows OSの.NET Core上でWPFのアプリケーションが動くことになる。

### デスクトップアプリケーションで、なぜ.NET Coreが必要となるのか

![選択肢](https://qascva.bl.files.1drv.com/y4mwa_WMb4-ffWzgGR13MfPaObY9w-VfPfrlrl6JoLuGsv2kxbRuTYPi1FgjKO-fpTilHknEmQxisHuW_tQ1OKdo1-r_l8dkFYA22ZFrkukgJjDId-qMGyMRVGP63ulpXQH5XXFw3U8-q14bXpAu2ZJxNYSjniCviusP3tM7gdYRmaVKkfqPqe91OqbeX4wgt_gYBCt24EEzJjVq9HX1JdGSw?width=3539&height=1991&cropmode=none)

* side by sideで実行されるため、環境依存が少ない。
* .NET Framework ライブラリのグローバル参照 or ローカル参照を選択することができる。これはコンパイル時に選択することになる。
* 最新のAPIは、.NET Coreに先に実装されるため、.NET Coreを使用することで、最新機能を利用しやすくなる

### 新規アプリケーションでの選択肢

前項の利点を考えると、デスクトップアプリケーションの新しいプロジェクトでの選択肢として、.NET Coreを考慮に入れたほうが良い。

## .Net And Machine Learning

.NETで機械学習を行うには、今回開発されていくことが発表となったML.NETを使用することになる。

![Build your own (custom) ML Models](https://7qtn3w.bl.files.1drv.com/y4mH-KlOOxDPSImOeJ3pn-xnbd5TjcZPw0WPH2iATE3ewW3meic0jNJ3uDssqwcJQJhYo1oPrqV1_Ynp2r9UchrLwsGLPB8M2tLIS4cltepa3TLuKQkQRC9q8rgXOrjsPLDdBHwU_KiAV-SI1VUYV8RiW7WgtnHhnS1K3bPf2J321iOunKYg4Na890fIlNE1fqPV13A59g-eJhZsbbqKyg0IA?width=3409&height=1918&cropmode=none)

独自の学習モデルを作成することができる。そして、分析してその結果を出す。.NET のアプリケーションの中で、機械学習を使用できるようになる。

### ML.NET 0.1 (Preview)

![プレビュー](https://9gscva.bl.files.1drv.com/y4m4ABsrQrgdOGjV2AYwzVAElvUnxZGfza1J7aovbhs_wnOhBr1CqY_yDP_ck064WaYexOWNbUXkmZUUuxQGv0E4rhM2KyNxB509qLqnIGCSj2CiovAHPaJdOIKvW9WzwirUaC627EAo_f8L_UZap7-EFBH01BnhSmCcQv0C_npzTrePlGTaqUeUYK8Yy3n9ZhVHfO3f8WQahh4A4Ig_kSgjg?width=3326&height=1871&cropmode=none)

.NET Core 3.0のころには、1.0に近いものが出てくると考えられている。


# .NETのモダナイズ

**.NETアプリケーションがどのようにモダナイズ（近代化）されてきたか？**

![モダナイズ](https://9qscva.bl.files.1drv.com/y4m4tVGuqXJXF1muDFozL9Q7AnRSYGKT8xLqThVjA66IwsfKyU2h_4SLHDVQAjBPy0B9RTH2_13P0ZB68H3n1IY2D-mKLsII3rweSabsc7BqOKTiKD17XT_wfErQEMnGbjhVmH5UAE0BvyfMAoEwgLJimprDbxYH8LJtFeiiq1J4Nl707ub3n1jX1U8n1bsa5wPjZZ2SABQsbBnWNY35pwv5Q?width=3273&height=1841&cropmode=none)


## まずはRehost

クラウドや仮想マシンが、オンプレミス以外の選択肢となった。しかし、これではまだまだモダナイズとはいかない。

## コンテナへの対応

![コンテナ](https://pqtn3w.bl.files.1drv.com/y4mRkG10f84PvojiKa8TleIBDotAFE4dZsjFInsYzbNUdg9wfUMmFCobUL9ICVzocRGbARTXNSTsN8ot_Fm2Pk7CtvpOnwE-ys8Y4wrQjWA_rQsYI10Gl2zgAGBM6KSPQeVq4aCc955ZUV0M6ksP0aau8ZNCYvFML0FlBymbMsTR5pe9bHSWUy7cRXB6bTJWda-yjCjrRfTDpgx_Pu2RjKvkg?width=3553&height=1999&cropmode=none)

Windows Containerとしてクラウドで動かすこともできるようになった。
Minimal Code Changeであり、アーキテクチャの変更も少ないということが大事である。

## クラウドネイティブ

落ちないアプリケーションを実現するために、必要になる。

Dockerなので、.NETCoreにしないといけないのか？そんなことはない。.NET Frameworkのままでよい。

![共通](https://qatn3w.bl.files.1drv.com/y4mgsWQ-CF6BFvd3mw4angs8u4TbHt0WxQYDyf7dyH4PUdT8ccsj0LkFBQBWRvQD2pnt61qAE9yo18ZzhMsE__LHkmxbyQwJ30o1kpMvjDoXLRii0Ho2X3jlMnYkHiHs1XJHVh5ws9uFjg3iPEYjmiv1-lGcxrjFC78qU0MgNGhv965NzI7aBwIh5hOxRmKwjNwjJFBWh5vMvxqDMmD4-W9cQ?width=3632&height=2043&cropmode=none)

.NET Coreにしておけば、共通のDocker Containerを共通のDeploy単位とすることができる

# .NET Everywhere

![Everywhere](https://patn3w.bl.files.1drv.com/y4mkTsdd025SqKMZmw6lkncqIR0yBu25rXHUlOnPsbRr5zYxkIe_XzjoxU5m0y9oe8sGsWyXz9cN1Vvb4z-HTWHpEiqpeRGcVYExgBqjGYt8cdZgGY7MKhWg-XJeWrt8tN9fsUtCifHqaLzystU9Who9LAZk3Ni1cYhHxzQW5xcJB3Ww-2hdlxKv4GjQR8RG4gcAVbZWMSEF6Hq9qh-n6S-JA?width=3231&height=1817&cropmode=none)

すべてのアプリのための統一プラットフォームとして、.NETを利用することができる。

Xamarin、.NET Coreなど、開発をする際に、複数を選択して開発することができる。

これから、さらに.NETは盛り上がっていく。