de:code 2019 [DT07] .NET とクラウド ネイティブ ～ 本格化するクラウド移行とそのアーキテクチャ（前編）

Microsoft de:code 2019に参加した内容を紹介します。
もし間違いなどあれば、ご指摘いただけますと助かります。

前後編に分かれたセッションでしたが、とりあえず、前編について記載します。

2019年6月17日　[後編](https://qiita.com/tfukumori/items/7055c5551a75591338cc)を記載しました。

# [DT07].NET とクラウド ネイティブ ～ 本格化するクラウド移行とそのアーキテクチャ / 2019年5月30日

# TL;DR（要約）

- 新規アプリケーションは、.NET Core 3（2019年11月リリース.NET Core 3.1 ）を使い、クラウドネイティブなアプリケーションを意識してほしい。様々なプラットフォームをサポートした統一プラットフォームである。Win Forms・WPF（Windows限定）も含まれる。
- .NET Framework は、4.8が最終バージョンとなる。既存アプリケーションは無理に移行する必要はない。
- .NET 5（2020年11月リリース）には、ASP.NET Web Forms、WCF、WFなどが含まれない。ASP.NET Web Formsについては、代替としてBlazorを利用することで、Javaスクリプトをほとんど記載しないスタイルを同様に行うことができる。

# リソース

- [セッション詳細](https://www.microsoft.com/ja-jp/events/decode/2019session/detail.aspx?sid=DT07&kw=DT07)
- [セッション動画](https://www.youtube.com/watch?v=UQS9_Xd_CjQ&feature=youtu.be)

# セッショントピック（前編 & 後編）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/768c1bf2-9aec-b317-f940-97e10fabc9c2.png)

# .NET の人もクラウドネイティブの世界を考えよう

これからは、.NETを扱う人たちにも、クラウドネイティブな考え方で進めることを考えてほしい。.NETでは、すべてのアプリのための統一プラットフォームとして動作し、クラウドで扱いやすいように準備されている。

アプリケーションをどのようにクラウド対応アプリとしていくかが大事だが、そのための環境がすべてのプラットフォームに対して用意されているのが.NETである。

(所感)実際他のセッションでも話がありましたが、サーバーの管理費用（セキュリティ、アラート、スケーリング）なども考えると、ほとんどの企業ではオンプレよりもクラウドで管理した方が費用が安い時代に入ってきていると感じます。なにより、たぶんそちらの方が楽しいのではないかと。


# .NET Core 3について

.NET Coreはコミュニティベースで開発が進んでいる。

すべてのアプリケーションのための統一プラットフォームであり、作成したアプリケーションをコンテナで簡単に動かせるので、Linuxでも簡単に動作する。

今では、.NETの世界でAIも動く（ML.NET）
https://docs.microsoft.com/ja-jp/dotnet/machine-learning/index
https://docs.microsoft.com/ja-jp/dotnet/machine-learning/tutorials/

## .NET Core 3 Preview 5 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/f39280ea-9ec0-0b7b-929d-efdda439da58.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/daa14582-ce3b-4acf-e75f-a89197bcd140.png)

.NET Core 3.0でキャッチアップされている機能としては、Windowsのデスクトップアプリケーション対応となる（WPF and Win Forms）。こちらはすでに開発が進められていて、プレビュー版でも動作する。

.NET Core 3時代のフレームワークとしては、.NET Framework、.NET Core、Xamarinが存在する。

この中で画面上のロゴでも示されているように、NET CoreはLinuxでも動作する。注意すべき点としては、Windowsロゴが記載している機能は、.NET CoreでもWinodwsでしか動かない。
逆に言えば、それ以外の機能は、対応するすべてのプラットフォームで動作するということ

|フレームワーク|機能|対応プラットフォーム|
|:--|:--|:--|
|.NET Framework|すべて|Windows|
|.NET Core|Win Forms, UWP, WPF|Windows|
|.NET Core|ASP.NET Core, Console|Windows, Linux, Mac|
|Xamarin|すべて|Windows(UWP), iOS, Max(OS X), Android|

### WinFormsとWPF

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/417b7191-320d-ea60-ce22-e6d78b56960c.png)

WinForms, UWPが将来的にどうなるかは現時点では不明だが、しばらくはWindowsのみの対応となっている。

#### Win FormsとWPFを.Net Coreに入れるメリット

- 他のアプリケーションとの分離性（.Net Coreで採用される自己完結型の配布）
- 新しいAPIを使用できる
- あたらしいSDKベースのcsprojシステムの利用
    - 実際csprojの中身がかなりシンプルになっている
- パフォーマンス向上の恩恵が受けられる
- **今後、Unitiyも.NET Core 3.0ベースになっていく**
- 開発の活発化
    - すべてがオープンソースとなっているので、プルリクエストもどんどん出てきて、開発が活発に行われている状況

## デモ
### デモ:XAMLのデザイナーが動作している

XAMLのデザイナーも.NET Coreで使えるようになっているデモが行われました。このなかで、Taget Frameworkを見ると、確かに`netcoreapp3.0`となっていることが示されました。

また、Intellicodeについて、XAMLエディタを見てみると、こちらでもIntellicodeが働いていることが確認できました。

### デモ:.NET Core 3は自己完結型の配布が可能である

.NET Core 3では、自己完結型の配布が可能（現在も形式によっては可能）であることがデモされました。

1. publish（配布）
1. フォルダを選択
1. 編集
1. ターゲットフレームワークを選択
1. 配置モードとして、自己完結を選び、winxx86等を選ぶ

必要なものをすべてまとめてくれるので、.Net Coreがインストールされていなくても動作する。

|方式|コマンド|結果|特徴|
|:--|:--|:--|:--|
|通常|`dotnet puglish -c rerease -t win10-x64 -o out1`|出力フォルダに必要ンファイルが大量に出力される|起動が少し早い。|
|シングルファイル|`dotnet puglish -c rerease -t win10-x64 -o out2 /p:publishsinglefile=true`|1つのEXeとしてくれる|今は画面からは選べない。初回展開が行われるため、起動は少し遅い|

# .NET のオープンソース化について

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/9c23673d-8053-57ef-cc39-aa19205e4093.png)

転換点としては、2012年にScott Hanselmanが発信したメッセージ「もっとオープンになるし楽しいものになるよ」というのが契機となる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/20919fbc-cf66-74d8-30e8-47e6fd42d6e1.png)

# ASP.NET Core 2.2のホスティングモデルについて

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/6334c9b4-b8c5-2d40-8a41-86230fab1284.png)

よく質問をもらうことが多いが、WebサーバーとしてKetrelが動き、その後ろで.NET Coreが動作する。

## アウトプロセスホスティングモデル

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/63a43239-2d91-00f8-a627-7902ea8ca4c1.png)

直接Kestralでも構わないが、実運用では、Kestralの前に、IIS、nginx、apactheを前に立てることが多いだろう。また、KestrelはWindows認証に対応していないので、そういう時はIIS HTTPを使用することになる。

## インプロセスホスティングモデル

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/46f7943c-a289-3fa2-56f6-24a9e58fb4db.png)

2.1以前は、IISを使うときもアウトプロセスという前提だったが、Windows前提であれば、IISでインプロセスで動かすこともできる。当然、インプロセスのほうがパフォーマンスがよい

# .NET Core 3.0全体について

![img](https://w5cjmw.bl.files.1drv.com/y4m3cpHBRq6ZwbVi24cQ4frTsseLkXBQGvBi66mIvfL5IJSg2RXN0wpwatz07MhlO1jDlIf-AKnJn1cY7SzQtS0-2GS8rK0bVmECU5s4zBzu5cSY6JJqhsRtY-xiPniA2b00tNulPvQ5bAOeod9EdCDCX6Ec6hP4Wzw3_9jwxKEdph97L98K1AxacWvv-LeaYL0DiQHl1-ZK7iWEwCh4xy_Eg?width=1280&height=625&cropmode=none)

.NET Core 3.0から、Blazorが新しく追加される。Blazorは、.NET Coreのみがベースとなっている。

# Blazorとは

![img](
https://w5ckmw.bl.files.1drv.com/y4mN1bnKGkvMf_9xjYiKt752dkbC5nsoAC2D7T9JGFYuFQxd4oxFgpZtAYYIub_9q2Q2DUT80AgYyp-xqL5cT_1Q9rHZng2890W-LsxMH2eaAxvSgNu--hN7vX_5QARjchmih1ILFJPE_wwsDQLb5su44unwToTXgn1d-9jQZQAu_qRSKGIm5lc_9eGYGUMGGavktXgglfdFSKF4iAhFnzqBg?width=1280&height=663&cropmode=none)

## Web Assemblyをベースとした技術

Web Assemblyという技術がある。これ自体は以前からある技術であり、モダンなブラウザであれば、すべてのブラウザ、OSで動作する。

特徴としては、dll等が直接動くので、C#が直接動作するということになる。つまり、C#で動くので、JavaScriptを書く必要もない。Web開発で、フロント周りを開発する中で、Javascriptを書く必要がないので開発速度の向上につながる

[デモサイト](http://13.82.135.138/)　※解説は後述

## 2種類のホスティングモデル

![img](https://w5chmw.bl.files.1drv.com/y4m1tvMz02aFeTkbDnlpvBBo7AJa2bKbNt5WybX7knF8lNR8vmldoM-e4r7ei-0gSSuBlgpWW0kx7Oo-CVg6rQp082wqP2Qjf7Ooa-4mr3WRaS7XdmfFz2PdoB6nFJ8GHZe8cc6QMnFG84OfpJFJ55i-a0tb-_ClcAOO5s5uDecWl07wPJF-gv_HMF3p7YB_oOCNFqIdnUydCFikTpJE42kdw?width=1280&height=638&cropmode=none)

開発自体は、Razor構文(@～)で記述する。ブラウザの開発ツールを使用すると、dll等が普通にダウンロードされて動作していることが確認できる。C#のコードが完全にクライアントサイドで動作することになる。

|モデル|動作|
|:--|:--|
|クライアントサイド|dllがダウンロードされる<br>メリットは、作り方次第ではオフラインでも使用できる。Web APIを使用している場合にはその考慮が必要|
|サーバーサイド|dllがダウンロードされない<br>websocket（signalR）を通じて通信される。つまり、signalRを通じてバイナリ通信が行われることになる<br>HTTPのリクエストは発生しない<br>メリットは、デバッグできる|

## コンポーネント化について

PageがRazor Pageとなるので、完全にコンポーネント化されている。つまり

```html
<FetchData />
```
とするだけで簡単にコンポーネント化したページ`FetchData`を利用できる。

## 先に利用できるようになるのは、サーバーサイド

今後ロードマップとして、先に正式に使用できるようになるのはサーバーサイドとなる。

# gRPCの採用

gRPCはGoogleをベースとしてリモートプロシージャーベースのリモートコールとなる。規約ベースで、サーバー側とクライアント側で通信できる。**HTTPを介してリモートプロシージャーで通信できる。**

実装としては、HTTP2ベースでバイナリでシリアライズされて通信する。

# .NET Core 3.0は、フルスタックのWeb 開発環境となる


![img](https://w5cdmw.bl.files.1drv.com/y4m9B8cHdZCrjOCrLtN1biJL-RujDbchwWi2gzsobP0vosJYb673B4CoT2195ICy-m1SlA8FrEJFtFd8eUh6vGv-n8cJUhn2FGnJ_0zv11oNWatzNuH7NBPmBptDAyxEnQp4LGPtC5rQpy9HuEy7hYsuDAOtPZIyd1HNLTmuHpPTfLUEDORcyj5tPOs3ZhQZ5K_OU9mvGqki89tNqX_fek4Lw?width=1280&height=602&cropmode=none)

フルスタックのWeb開発というものが.NETでできる。完全にJavaScriptなしというかというとそういうことではないが、C#ベースとした開発ができる。

# ML.NET

![img](https://w5cbmw.bl.files.1drv.com/y4m4yfqdz1Nu0_7zHDEwR2st07iRM0ZhyEGg0HvPd9WC6F9W8u0UoSb3qeFyDIUgRdM56xJgBlmC_EpXLGit0LkuFqABsXLixWKjxfnLBB-jVQtTlFB11CEKEEjYwYfn7bD4w6EZkaXh78lc4QHxP-3x96HSyzlcCi_2hj8y8GmKvaS-tNr_cTXX18xoUaVtYmcKBYZIFVtbUJxJCV85lLnuA?width=1280&height=770&cropmode=none)

ここで、感情分析のデータを使用したML.NETのデモが行われた。

デモサイト
http://13.82.135.138/

学習用のデータを開いた。機械学習では、通常は自分でアルゴリズムを決めていないといけないが、AUTO-MLを使用すると、最適となるアルゴリズムを自動的に選んでくれる.NET C#でMLモデルが作成されるので、それを自分のアプリの中で使用することが可能である。

キーノートで使用していたアプリケーションは、Blazorで作っていて、感情分析は、自分で作った機械学習モデルを作成し、サーバーサイドでML.NETで使用している、

## AIはあたり前の時代

今後は、C#を使って、AIを当たり前のように使っていきましょう。C#のまま、.NETを使っていくことができる。しかもGUIベースで簡単に！

# .NET中心で一貫した開発を簡単に

![img](https://w5ccmw.bl.files.1drv.com/y4mLJcl9oxL7BEwuo4oLn9brGZtOP18x_crzaWdHfeG627X32_bTMqQfYvC_LjMIbmnN0CfcgXdcIJkW7Q84vz6HWtRnqHmry884lBi71uhYpQIsu0PX3H4HbXIDDx_X-u3dSjHsowPHlR0EteKepxST1sU7q1-v51FOBzQiiFjQlD_ijOjp_2qsQqHr6_MRgT3kO7dMfD39M6XhbMnjF-NDA?width=1280&height=674&cropmode=none)

.NET 中心で開発からリリースまで（CI/CD）、環境構築(Azure Kubernetes Services(AKS))まで、一貫した開発を行っていくことができる

# .NET 5

![img](https://xjchmw.bl.files.1drv.com/y4mar4RSbdvDUGQKGqMzIM-8i_8UC8aeJxhsvh5z7D9ZFTkT56JTDAZMHc2fm1gLl5TpNTbf0JN5GuU5nKYUSLyiU4uRbSFHYs4LLxNefUA5i3vaxaiXTJwDjfv1Gq0sPuMxlpqxlAWk-9A7NXDVivV9dgMgDiXfXEwxdzZMDIh6A2_IYKdJkPIKLvECFeUzPYSYqn02C2ZIkR7t9OdcpVYWw?width=1280&height=617&cropmode=none)

次のロードマップとして、Build 2019で.NET 5が発表された。

**.NET Core 3.1 の vNext = .NET 5**となる。

## 今までの.NET Core + Xamarinのアプリケーションモデルを含む

サポートされるのは今までの.NET Core + Xamarinのアプリケーションモデルとなる。つまり、XamarinやMonoの優れた点を取り込むことで、.NET 5はすべての.NETアプリケーションをサポートすることになる。
（.NET Frameworkは4.8で保守フェーズとなる。）

## 分かれていたライブラリが統合

基本ライブラリ（BCL）として.NET Coreで利用されているCoreFXをMonoからも利用できるように対応することで、ランタイムとその上で動作するアプリケーションを、実行環境に合わせて任意に組み合わせて利用できるようになる。.NET Standardで作成する。

## 補足

- BCL + .NET Standard
- JIT（[実行時コンパイラ](https://ja.wikipedia.org/wiki/実行時コンパイラ)）とネイティブの実行モデル
- Java(Android)とSwift(iOS)の相互運用性を含む

## .NET 5に含まれないアプリケーションモデル！（廃止されるもの）

- ASP.NET Web Forms
  - 代替は、Blazor（ASP.NET MVC）。JavaScriptを書かないというコンセプトは同じ。移行ガイドが提供される。
- WCF
  - 代替は、gRPC for WCF Server and remoting。移行ガイドが提供される。
- WF
  - 代替は、Open source core workflow for Windows

# .NET Frameworkの今後

![img](https://xjcfmw.bl.files.1drv.com/y4m3dFRGEkAR6eLV4_UrB6umqp4X_Jf1Yh6H2LxpP0fP6EnPXvy_wRkRvKzaJkBD72cL4lpJ0_1BgT3ynoK4bbQbjTBQhAXI_ElwNriYkq26XT0tqqicxiCnh70PGS6jBwUPAPGyvdopqFLbz_IUuUwn7srCDEo5O67QBH2bpzi5JwbjHXHxHuqfhJZyGPbmowFGFAYwviQlvFfkMpv1Iuiog?width=1280&height=616&cropmode=none)

4.8が最終メジャーバージョンとなる。サポートライフサイクルポリシーに変更はないので、OSがサポートされる間は、サポートされる。
（Ask The Speakerで確認したところ、3.5も同様のライフサイクルポリシーということでした）

.NET Core、.NET 5については、新規案件での開発ととらえていただければよく、既存案件で無理に移行する必要はない。
ただし、これから作成するアプリケーションについては、クラウドネイティブなアプリケーションを意識する必要がある

(所感)その後のセッションも踏まえて考えると、クラウドに親和性が高く機能性が高いアプリケーションを、効率よく開発していくには、.NET Core 3.0、.NET 5を採用することが大事だと感じました。

# 今後のスケジュール

![img](https://xjcdmw.bl.files.1drv.com/y4mqvBq512LeTu6zQhzQinJCZEu-X2gGDacsDyootxqY4vKC_OpK54MwRWgghSNmhmsfMIIp5oS7CqUybC8FL53w1j9Ns0mHIUEsMpfysRLIShVqmFzfTpFKdbvP28f17SF_FQXpTx0o16WQiKjh-MWLuwkRUqBeHnbUY8iQpIN1DpAQKVD1xP9zd7V7VBfIrRECjoJPzAC94XbwVyj-zStPg?width=1280&height=653&cropmode=none)

LTS（Long Time Support）について明確に示されている。

(所感)2019年7月の.NET Core 3.0 RC で開発しつつ、2019年11月の.NET Core 3.1を正式採用として新規開発を始めていくのが良いのではないかと感じました。

# .NET 5 はすべてのアプリケーションのための統一プラットフォーム

![img](https://xjcemw.bl.files.1drv.com/y4mXuDJE_AqfO0C56AxeUrmYSx070Mmhwl_9GEIsRJ19kKrbzzgo19wMTFkhY025FSZreV8ZFchUiHSc-bVH6One1YHO_tssWuKwQEu65uV7UF7ueypkIDG2eR4SI87CxefCUbUV5cJKsggSWKmBRhJAncBw4GAfWon74NRry_-iMBYVMIWnpht77xb3XJqbepkHQdCE9rpn6Qto650IZe41g?width=1280&height=611&cropmode=none)

.NET は、デスクトップ、Web、モバイル、IoT、Aiまですべてのアプリケーションを統一して扱えるための生産性が高いプラットフォームである