「VS Code Conference Japan」のまとめ #vscodejp

f:id:orangeclover:20201122130914p:plain

.NET 5 リリース記念のイベント は文字起こしして、ブログを書くのにえらい時間がかかったので、今回は個人的に気になったり、面白かったりしたところのスクリーンショットをピックアップしてまとめます。

告知内容

VS Code Conference Japan イベント概要
VS Code 5周年イベント です!

Visual Studio Code がリリースされてからもうすぐ 5 周年になるのを記念して、VS Code Meetup 主催のデジタルイベントを開催いたします!!!
Visual Studio Code に興味がある方、Visual Studio Code を愛している方、我こそはと Visual Studio Code について語りたい方など、みんなで集まって 5 周年をお祝いしよう!!!






オープニング

f:id:orangeclover:20201122131301p:plain



f:id:orangeclover:20201122131320p:plain



f:id:orangeclover:20201122131347p:plain



f:id:orangeclover:20201122131419p:plain



f:id:orangeclover:20201122131439p:plain



f:id:orangeclover:20201122131454p:plain



f:id:orangeclover:20201122131506p:plain



f:id:orangeclover:20201122131529p:plain



f:id:orangeclover:20201122131545p:plain



f:id:orangeclover:20201122131559p:plain



f:id:orangeclover:20201122131612p:plain



f:id:orangeclover:20201122131624p:plain



f:id:orangeclover:20201122131634p:plain



紹介された拡張機能

資料

はじめての VS Code and Codespaces

f:id:orangeclover:20201122132038p:plain



f:id:orangeclover:20201122132050p:plain



f:id:orangeclover:20201122132100p:plain



f:id:orangeclover:20201122132114p:plain



f:id:orangeclover:20201122132126p:plain



Q&A

紹介された拡張機能

資料







AI/MLエンジニアに伝えたい令和時代のVS Code使いこなし術!

f:id:orangeclover:20201122132546p:plain



f:id:orangeclover:20201122132618p:plain



f:id:orangeclover:20201122132630p:plain



f:id:orangeclover:20201122132644p:plain



f:id:orangeclover:20201122132655p:plain



続きはWebで。

Q&A

  • Q1.Anaconda さん最近大規模な商用利用でお金かかるようになったんでしたっけ?
  • A1.存じ上げない。

紹介された拡張機能

資料

アプリ開発&チーム管理で役立った拡張機能

f:id:orangeclover:20201122133532p:plain



f:id:orangeclover:20201122133558p:plain



f:id:orangeclover:20201122133612p:plain



f:id:orangeclover:20201122133624p:plain



f:id:orangeclover:20201122133635p:plain



紹介された拡張機能

資料

Fortran が拓く世界、VS Code が架ける橋

f:id:orangeclover:20201122134140p:plain



f:id:orangeclover:20201122134214p:plain



f:id:orangeclover:20201122134225p:plain



f:id:orangeclover:20201122134236p:plain



f:id:orangeclover:20201122134245p:plain



f:id:orangeclover:20201122134256p:plain



紹介されている拡張

資料

Visual Studio Code 拡張機能の活用

f:id:orangeclover:20201122134716p:plain



f:id:orangeclover:20201122134755p:plain



f:id:orangeclover:20201122134805p:plain



f:id:orangeclover:20201122134816p:plain



f:id:orangeclover:20201122134825p:plain



f:id:orangeclover:20201122134837p:plain



f:id:orangeclover:20201122134848p:plain



紹介された拡張機能

資料

Remote Development with Podman

f:id:orangeclover:20201122135107p:plain



f:id:orangeclover:20201122135130p:plain



f:id:orangeclover:20201122135141p:plain



f:id:orangeclover:20201122135151p:plain



f:id:orangeclover:20201122135200p:plain



f:id:orangeclover:20201122135213p:plain



f:id:orangeclover:20201122135232p:plain

関連リンク

Q&A

  • Q1.なんでRHELはDockerのサポートを辞めたのか?
  • A1. 深い問題。リンク にも書いてあるが、基本的のは会社の方針。 一言で言うのは難しい。気になる方は調べてください。

  • Q2.コンテナ周りの拡張機能も増えてきて選び方が難しくなってきてると思うのですが、拡張機能の相性とかあったら聞きたいです。

  • A2.Remote DevelopmentとDockerの拡張しか入れてないので、相性の問題にあたったことはない。

  • Q3.いつ勉強する時間をとっていますか?

  • A3. 起きてる時間になんとか捻出。家事をしている時間にスライドネタを考えている。

  • Q4. ぶっちゃけ、Remote Development with podmanを実運用で利用できることを期待できるのか?

  • A4. まだまだ。正直Fedoraで動かすことはできたが、まだまだ使いこなせていない。Dockerに比べてバグが潜んでいるかもしれない。 将来、Docker、Podmanどっちが優勢になるかわからないので、Podmanのいいところ、特徴を知っておくのもいいと思う。

紹介された拡張機能

資料

最強の Dev Container を考える

f:id:orangeclover:20201122140811p:plain



f:id:orangeclover:20201122140832p:plain



f:id:orangeclover:20201122140905p:plain



f:id:orangeclover:20201122140914p:plain



f:id:orangeclover:20201122140924p:plain



f:id:orangeclover:20201122140938p:plain



f:id:orangeclover:20201122140954p:plain

  • 著書


techbookfest.org

資料

LT

EmacsおじさんのVS Code挑戦記

f:id:orangeclover:20201122142319p:plain

VS CodeSQL クライアントになる ~ DBにVS Codeで接続する

f:id:orangeclover:20201122142446p:plain

この日のために拡張機能を作った話

f:id:orangeclover:20201122142729p:plain





お気に入り拡張機能について

f:id:orangeclover:20201122143055p:plain

お勧めされたので REST Client を使ってみた

f:id:orangeclover:20201122143220p:plain

クロージング

f:id:orangeclover:20201122143343p:plain



f:id:orangeclover:20201122143354p:plain



f:id:orangeclover:20201122143621p:plain



f:id:orangeclover:20201122143634p:plain

VS Code Meetup #8 - 忘年会 & LT会



f:id:orangeclover:20201122143645p:plain

感想

10:00~17:00までの1日イベントでしたが、あっと言う間だった。 見ながら拡張をインストールしたものもあるので、さっそく試用していきたい。
Dev Containerか。そうだよね。そうなるよね。 Fortranのセッションの中で出てきた 良い道具は世界観を変える が胸に響いた。
LSP(language server protocol)もそうだったけど、Dev Containerで、VS Codeを中心にして、世界観が変わっていっているように思えた一日だった。

発表者、運営の方、ありがとうございました!

第2の脳を謳うObsidianでMarkdownファイルの「つながり」を見える化する

f:id:orangeclover:20201120110255p:plain

やりたいこと

  • pukiwikiのrelatedプラグインのように、バックリンクをMarkdownでも表示できたらいいのに。
  • Scapboxのページリンクを記述すると表示される関連ページのようなことをMarkdownでもできたらないいのに。
  • Roam ResearchのようなネットワークグラフをローカルのMarkdownファイルでもできたらいいのに。
  • EmacsMarkdownをリアルタイムプレビューするのにお手軽なビューアーがあったらいいのに。

Obsidianの特徴

それが、Obsidianなら、できるんです。

Obsidainは、以下の特徴を備えたMarkdownエディタです。

  • ローカルのMarkdownファイル(.md)を扱える
  • ファイル間の関係をグラフビューで表示でき
  • バックリンクを表示できる
  • 分類用のタグ #タグ が使える
  • リンクに [[wiki-links]] 形式が使える
  • コードブロックのmermaid対応しており、図を埋め込める
  • 数式を表示できる
  • ファイルの埋め込みを使った表示ができる(pukiwikiのincludeプラグイン相当)
  • WindowsmacOSLinuxのアプリケーションが用意されている

この中で、上の4つを紹介します。

ローカルのmarkdownファイル(.md)を扱える

ObsidianをMarkdownを書くエディタとしも十分に使えると思いますが、プログラマーを始めとして、普段ソフトウェアの開発に関わる方であれば、お気に入りのエディタでmakrdownをすでに書いていると思います。

Obsidianは、Markdown専用エディタによくある独自DB形式に格納するタイプではなく、ローカルのMarkdownファイル(.md)を扱えます。

そのため、普段使いのエディタで書いて、Obsidianをビューアーとして使うといったこともできます。

Obsidianでは、 Vault というフォルダ単位で管理します。 Vaultは複数、どこにでも作れます。 ネットワークグラフ、バックリンク、タグは、 Vault 単位になります。 Vault を複数開くには、Obsidianを複数立ち上げることになります。

f:id:orangeclover:20201120110332p:plain

以下のように指定をすると、

Vault name:dotnet-doc
Location:D:\workspace

以下のようなディレクトリが作成されます。

D:\workspace\dotnet-docs\.obsidian
├ config
├ graph.json
└ workspace

Obsidianで作成する Markdownファイルは、 Vault 配下に、 .md形式 で保存されます。別のエディタで作成したファイルを持ってきても認識します。
なので、バックリンク、ネットワークグラフを見るビューアーとして使うといった使い方もできます。
すでに、EmacsvimVisual Studio Codeなど別のエディタを使ってる人にも優しいです。
Emacsmarkdown-modeで書いて、リアルタイムプレビューとして使うにもいいと思います。

ファイル間の関係をグラフビューで表示できる

Obsidianの売りの機能で、Markdownファイル間の関係をネットワークグラフで表示してくれます。
[[wiki-links]] も使えますが、通常のMarkdown記法の [リンクテキスト](ファイル名) 貼っているリンクも対象です。

例えば、Obsidianのヘルプをグラフビューで表示すると以下のようになります。
f:id:orangeclover:20201120110409p:plain



1つのノードにカーソルを合わせると、それにつながっているリンクを強調してくれます。
f:id:orangeclover:20201120110440p:plain



Ctrlを押しながら、カーソルを合わせると、ファイルのプレビューを表示することもできます。
(これはデフォルトではOFFになってるので、 SettingCore PluginsPage previewON に設定変更が必要です。)
f:id:orangeclover:20201120110503p:plain



ObsidainのヘルプはMarkdownファイルが259個なので、問題なく表示できていますが、ファイル数が多くなるとどうなるんだ?と疑問に思うかもしれません。 ファイル数が12308個の.NET Docsを表示してみます。

表示できます。しかし、これではなにがなんだかわかりません。 f:id:orangeclover:20201120110616p:plain



こういう場合は、フィルターで、関係しそうなものを抽出しると良さそうです。
試しに、 async でフィルターしてみます。スッキリしました。
f:id:orangeclover:20201120110636p:plain



その後、マウスのホイールか、 + キーでファイル名が見えるまでズームすると良さそうです。
f:id:orangeclover:20201120110701p:plain



バックリンクを表示

現在の見ているファイルが、他のどのファイルからリンクを貼られているかを右側のサイドバーにあるbacklinks for sync確認することもできます。
(これはデフォルトではOFFになってるので、 SettingCore PluginsBacklinksON に設定変更が必要です。)

[[wiki-links]] も使えますが、通常のMakdown記法の [リンクテキスト](ファイル名) 貼っているリンクも対象です。
f:id:orangeclover:20201120110728p:plain



また、サードパティー製のプラグインを使うと、ファイル下にバックリンクを表示することもできます。
(SettingTird-party Plugins で、 Safe ModeOFF にして、 Backlinks in document をインストールして、 ON にする。)
f:id:orangeclover:20201120110745p:plain



分類用のタグ

Markdownの記法を外れてしまいますが、 #タグ で分類することも出きます。日本語のタグも使用することができます。
(これはデフォルトではOFFになってるので、 SettingCore PluginsTag PaneON に設定変更が必要です。)
f:id:orangeclover:20201120110807p:plain



タグをクリックすると、該当箇所が一覧表示されます。
f:id:orangeclover:20201120111129p:plain



公式サイト

関連リンク

「.NET Conf 2020 Online - .NET 5 リリース記念 パーティートークへようこそ」のまとめ #dotnetconf

f:id:orangeclover:20201116181704p:plain
.NET Conf 2020 Online - .NET 5 リリース記念パーティートーク




面白く、ためになったので、文字起こししてみました。





告知内容

.NET Conf 2020 Online - .NET 5 リリース記念パーティートーク
.NET をこよなく愛するエンジニアによる .NET 5のリリース記念パーティートーク

はじめに

今年の 11 月 10~12 日に渡って開催される .NET Conf 2020 では、大注目の.NET 5 のローンチが予定されています!
https://www.dotnetconf.net/

.NET 5 では .NET Core / .NET Framework (の一部機能) / Mono (Xamarin) の統合が行われ、デスクトップアプリの開発からクラウドそしてはモバイル向け、はたまた IoTや機械学習向けの開発など、非常に幅広い領域をサポートしますが、一人で全てを把握するのは非常に難しいですね。

そこで、今回は .NET をこよなく愛するメンバーによって .NET 5の注目機能、個人的に推したい!という機能やアップデートについて話しちゃいます!トーク以外にもライブコーディングもあるかも!?

もちろん Twitterハッシュタグを付けて質問で参加出来ます。一緒に .NET 5のリリースをお祝いしつつ、疑問点を 解消しちゃいましょう!

スピーカーのみなさま(敬称略)

今回はオンライン開催の利点を生かし、日本各地から .NETを愛するエンジニアが集まりました!この豪華メンバーでのトークは二度と聞けないかも!?

#dotnetconf

.NET Conf 2020 Online - .NET 5 リリース記念

f:id:orangeclover:20201116181834p:plain
.NET 5 リリース

  • .NET をこよなく愛するエンジニアによる.NET のリリース記念パーティトークです
  • ハッシュタグは #dotnetconf です

自己紹介と推し機能

.NET 5 リリース!

スライド

  • NET 5 / BCL / C# 9
  • ASP.NET Core / Blazor WebAssembly
  • Entity Framework Core
  • Cloud native / Microservices
  • Xamarin / .NET MAUI Preview
  • Windows 向け機能 / その他

動画

https://youtu.be/HJ802p3syTw?t=444

NET 5 / BCL / C# 9

し「 バージョンについては.NET Frameworkの4.8からシムーレスにアップグレートできるという言い訳のために、.NET 5にしたという噂 Coreをはずしたのはそういう理由。」

チ「.NET Frameworkは4どまり、次は5だ、Coreも統合して、Coreという名称もとって、.NET、シンプルに.NET5でいこう流れですよね・・・知らないけど。」

?「よく聞かれるますよね、4は?って.NET Core 4じゃないんだって。」

?「Windows 9 がなかったですよね。」

?「触れてはいけない部分。」

し「.NET Framework から.NET Coreになって、開発できる領域が広がった結果、単に.NET5にバージョン1個あがりましたじゃなくて、中身のフレームワークがアップデートされているので今回、この会はどれかに特化するんじゃなくて、それぞれのフレームワークの部分を触れていきたい。」

し「.NETのランタイム自体がアップデートされた。あまりBCLって言わなくなったかもしれない。最近はRutimeというリポジトリが追加された。」

し「C# 9へのアップデート」
C# 9.0の新機能

ASP.NET Core / Blazor WebAssembly

し「ASP.NET Core、3.0からWPF、WinFormのクライアント系が追加されたが、メインはWeb、ASP.NET Core、Blazar。」

し「WebAssembly版が5月に正式版になったが、5へのアップデートのときに、ライブラリがmonoから.NET 5版に統合されたり パフォーマンスがめちゃくちゃあっがっている。」

チ「.NET 5は、パフォーマンスを結構推している。実際速く早くなっているし、期待値は高い。」

し「ASP.NET Core、Blazorがこの2つがC#でのWebアプリケーション開発のメインフレームワーク。」

Entity Framework Core

し「推しているEntity Framewokr Core。昔のEntity Frameworkは重厚なフレームワーク、EF Coreになってライトに使える。フルのORMではあるが、気軽に、設定も少なく使えて便利。」

チ「EFはパフォーマンスもなんだかんだ言われてて課題だった。EF Coreになって軽量化されたのはいいこと。」

し「未だにEFを恨んでいる。なぞのEDMX fileとか、EFはSQLじゃなくてEntity SQLで書いたり、Microsoftの悪いところが全部でていた。 EF Coreはシンプルなプロバイダーになった。」

し「パフォーマンスだと、テストのTechEmpowerベンチマークテストでは、DBも同時にテストされるが、DBを立ててプロバイダー周りもチューニングが進んでて、全体的にパフォーマンスが底上げされている。もちろん、Entity Framework Coreもパフォーマンスが結構あがっているらしい。」

Cloud native / Microservices

し「Cloud Native。あまり、Cloud Nativeって言わなくなった気がする。個人的に。」

チ「一時期のバズワード的ななにかだった?私のチーム名はCloud Nativeなんですけど。」

し「あたりまえになってきたかな。」

し「MicroServicesに.NETは注力している。」

チ「裏事情がいろいろあるが、ここでは話さない(後で?)。」

Xamarin / .NET MAUI Preview

し「クライアント系Xamarin、Xamrin Forms 5のデモがあった、MAUIはアップデートが進んでなさそう。後ほどじっくりと。」

Windows 向け機能 / その他

し「MSがやっているので、Windows OST向けアプリケーションに特化した機能もちょこちょこ入っている。」

チ「Windows向けで、ClickOnceみたいな話は後半にありましたっけ?」

し「ClickOnceはさかもとさんが大好きなので。」

さ「(ClickOnece)あれ死ぬかと思って、閉めようと思ってた案件があるですけど、機会があれば話しましょう。」

NET 5 / BCL / C# 9

スライド

動画

https://youtu.be/HJ802p3syTw?t=1008

Announcing .NET 5.0

し「Annoucingのblog見ました?めっちゃ長い。プロローグ?(聞き取れない)がこんな小さいと思うぐらい、長くなっている。」

チ「こんだけよくまとめたな、細かいところも全部リンク含めてまとまっている。これを見ながらリンク1つずつ見ていくだけでも理解が深まる。」

し「結構重いたい、僕らがその中で気にあるものをピックアップしていく。」

.NET 5.0 Highlights

f:id:orangeclover:20201116181951p:plain
Highlights

し「Performance is greatly improved素晴らしいことですねパフォーマンスは速いほうがよいライブラリ、GCのアップデートだったり、 ClickOnceの話も書いてある。」

チ「single-file apps、reduced container image size、うん、そうですね 。」

し「コンテナのイメージも劇的にサイズが小さくなったらしい。」

し「Windows Arm64 とWebAssembly。WebAssemblyはBlazorのWebAssemblyで超重要な機能。」

し「あくまでOverviewがまとまっている。」

Tools

f:id:orangeclover:20201116210355p:plain
Windows Forms designer

し「Tools系だとWindows Forms designerが出ている。」

ま「意外にこれでFormが作りやすくなるよね。アプリが。」

し「でも、それVS 2005のころからできてたよな。」

み「Formsのdesignerなかったんや。」

チ「.NET Core来て、WPFのdesignerの方が先にきた。最初はなかった。VSのアップデート出てきた。」

み「未だにFormsを作ったことがないなー。」

チ「.NET Confのキーノートで、Scott HanselmanがWindows FormsでWebview2コントロールを使っているデモって見ました?」

し「 Scott Hunter、Scott Hanselman、Scott Guthrieの3人を選べ。」

チ「話が脱線してしまうけど、私的にはあの3人が並んだのはすごい。でも日本人的にみると、なんでScott Guthrieが一番したなんだと、日本時的には、上司を一番上にあげないといけないのにと思って見てた 。」

f:id:orangeclover:20201116210423p:plain
3 scott

Native exports

f:id:orangeclover:20201116210527p:plain
Native exports

し「最近パフォーマンスを意識した結果Native系のサポートとか、COM参照のメニューが増えてる。令和になってもCOMを使わないといけないのかなと。」

チ「COMって今知ってる人ってどれだけいるのかな、知らない人の方が多い気がする。Componet Object Modle。」

み「聞かれたら説明できひんな。」

し「そういうものがあると知っておけばよい。」

チ「でも、WindowsはCOMの塊ですからね。今でも。まぁいいや行きましょう。.NETの話ですから。」

P95+ Latency

f:id:orangeclover:20201116210610p:plain
P95+ Latency

し「(P95+ Latencyを見ながら)requests per second (RPS) はStack Overflowの人が適用したときにこんだけCPU使用率が下がった。劇的に効果が出ていた。リクエストが多いとこだと効果ある。」

し「他言語対応のライブラリICUUnicodeWindowsに標準で入ったのでまともになったのかなと。」

チ「このブログを入口として見てください。」

Breaking changes for migration from version 3.1 to 5.0

f:id:orangeclover:20201116210714p:plain
Breaking changes for migration from version 3.1 to 5.0

し「最近Docsを見るようにしている。Breaking changesがあって全部まとまっている。マイグレーションガイドもある。」

ま「これは3.1から5.0へのマイグレーションガイドですか?」

し「そうです。よく見るとBlazorが多い。サイドでカテゴリごとにまとまっている。軽く目を通しておく、こういうドキュメントがあることを知っておくとよい。」

チ「そうでですね。3.1から5.0へ自分のソースコード、プロジェクトをアップデートしたけど、ビルドでエラーになって、なんだろう?という時に、こういうドキュメントがあると覚えておくと解決として使えると思う、これはいい。」

さ「このドキュメントいいわ、この会ためになります。」

The future of .NET Standard

f:id:orangeclover:20201116210750p:plain
The future of .NET Standard
し「これからどうなるか、One .NET visionという流れの動画。」

チ「その動画7秒だけど」

し「.NET になる。全部まとまっている。以上。」

し「頭だけ読むといい。どのTFMを使うかが書かれている。基本は一番新しいのを使えと書かれている。」

  • net5.0. This is for code that runs everywhere. It combines and replaces the netcoreapp and netstandard names. This TFM will generally only include technologies that work cross-platform (except for pragmatic concessions, like we already did in .NET Standard).
  • net5.0-windows (and later net6.0-android and net6.0-ios). These TFMs represent OS-specific flavors of .NET 5 that include net5.0 plus OS-specific functionality.

し「ライブラリでだすかアプリのコンポーネントでだすか、どれを使うべきかがまとめられている。」

チ「互換性を考えるなら、.NET Standardで、仮に.NET Framworkでも使えるようにとなると、.NET Standard 2.0でと書いてある。」

  • Use netstandard2.0 to share code between .NET Framework and all other platforms.
  • Use netstandard2.1 to share code between Mono, Xamarin, and .NET Core 3.x.
  • Use net5.0 for code sharing moving forward.

チ「これからは5.0だよ。」

C# 9

し 「別のイベントで C#で有名な人 @ufcppさんが話すので、そちらを聞くのが正解です。」 Visual Studio Users Community Japan 勉強会 #6

ASP.NET Core

スライド

動画

https://youtu.be/HJ802p3syTw?t=1555

Announcing ASP.NET Core in .NET 5

し「こっちは割とさらっとしている。フォーマンスはめちゃくちゃ上がっている。」

f:id:orangeclover:20201116210822p:plain
Announcing ASP.NET Core in .NET 5.png

し「2.1から3.1であがっていたが、5.0でさらによくなっている。なにも考えずアップデートするだけでパフォーマスがこれだけ改善するのはおいしい。」

チ「.NET coreとか新しいのがでてくると、.NET の世界では、パフォーマンス、パフォーマンスと出てくるが、毎回これだけ上がってくるというのはやっぱりすごいな。中の人ががんばっている。」

し「この辺は、クラウド上だと、サーバー台数の削減とかで、コスト削減につながるからモチベーションにもつながるかなと。」

f:id:orangeclover:20201116210850p:plain
Blazor

し「新機能はほぼBlazorのだったする。新機能はblogにはまとまっていなかったが、Docの方にまとまっている。」

し「これもマイグレーションガイドがある、マイグレーションははがんばる。差分付きで書いてあるから分かりやすい。」

し「Blazorは今回SDKも変わっているんですね。」

チ「Microsoft.NET.Sdk.BlazorWebAssembly。」

し「アップデートはこの通りに従うと、スムーズにいけるかなと。」

し「正直、ASP.NET Coreの新機能というのはあまりないんですよね。だいぶ枯れてきたなと。」

み「うらやましいねぇ、それ、クライアント民からすると。」

し「コメントに困る。」

し「なんだんかんだで、それまでの資産の積み重ねで、パフォーマンスもだいぶ上がって、機能もだいぶFIXしてきた。バグも少なくなってきた。」

し「最近gRPCがすごくよさそう。」

チ「gRPCをみなさん使ってますか?」

ま「使ってないですねー。」

チ「そうでもない。」

し「使うところがあまりない。」

ま「ちなみに、名前って、ASP.NET はCoreが残るんですか?」

し「残ってますね」

チ「そう、そんな感じです。今は。CoreがないASP.NET 5は一時期存在していたから。たぶんそのせい。名前も混沌してた時期があってネーミング、バージョンは苦労してつけている。」

チ「今のdotnetというCLIのコマンド名が、前は、dnxだったり、その前はkと言ってた時代にASP.NET 5と言ってた時期がありましたね。」

し「当時はvNextと呼ばれていましたもんね。」

チ「Coreは、ASP.NET Coreはそのまま残る気がします。」

し「たぶんこれはそのまま行きますね。Entity Framework Coreもそのまま。」

し「gRPCに話を戻すと、Webアプリケーション、ブラウザ系からだあまり触る機会がない。」

チ「前に関係していたお客様の案件だと、バックエンドにKubernetesAKS(Azure Kubernetes Service)を使って、バックエンドのサービス間の通信にgRPCを使っていますね。」

し「MicroServiceの通信だったら、同時接続、低レイテンシー、gRPCが好まれるかなとは思います。」

さ「gRPCやりたいけど、やれてないという立場の人です。自分は。型が付くのがすごく気になっています。」

チ「1つは、WCFが.NET Fraomeworkで終わり。.NET Core、.NET 5にはWCFはこないので、その辺の置き換えとして、gRPCに注力している。」

チ「.NET 5って、.NET Frameworkと.NET CoreとXamarinが統合されるよという話はあるんですが、厳密に言うと、.NET Frameworkのところは 少し切られている捨てられている部分がある。WCF、Web From、WFだったり、全部来るわけではない。」

ま「Web FromはBlazorと言われてますよね。」

し「一応扱いそうらしいですね。」

チ「概念的にははBlazorで、HTML、JavaScriptをあまり書かなくてもC#で書けますよというコンセプトだとBlazorが置き換え。厳密に言うと全然違うもの。」

ま「Web FormはBlaozrに移植しよという書籍もある。 ASP.NET Core ApplicationArchitectureASP.NET Web Forms 開発者向け Blazor 、PDFだと英語だとけど、Webだと日本語もある。」

チ「アーキテクチャの比較 も書いてあるじゃないですか、多分これ見ていただけると、ちょっと移行しようかなと考えてる人はいい感じですね。」

し「『既存の ASP.NET Web Forms アプリケーションを最新式にするための計画を立てる際に役立ちます。』結構危険なことを書いてある。」

チ「ほぼ書き直しにはなると思うんで、そこだけだけは。」

チ「こういう使えなくなるフレームワークもあるんで、gRPCに話を戻しますけど、そういったところでは注力してるところですよね、gRPCは。 ASP.NET Core gRPC for WCFDevelopers というのもある。」

し「WCFは現役のときにに全然使う機会がなかった。」

チ「最近あまり話聞かないが、まだ動いてるシステムもある。今後そういうをどうするかは、1つ課題にはなってくるでしょうけど。」

ASP.NET Core Blazor

スライド

動画

https://youtu.be/HJ802p3syTw?t=

Blazor

し「この辺の知識全然ないんで。」

チ「ここは、さかもとさんで。」

し「新機能はまとまっていました。さっきのページなんですけど。」

f:id:orangeclover:20201116211055p:plain
Blazor

チ「私もBlazorのデモアプリがあるんですが、.NET 5に書き換えようと思いつつ、また後でがんばろうと、今日はさかもとさんの話をちゃんと聞いて勉強してから帰ろうと。」

し「さかもとさん、もう仕事でふつうにはBlazorを使っているんですか?」

さ「バリバリまではいかないですけど、立ち上がりのタイミングなんで、今後やるのは全部Blazorで行くよね。」

さ「3.1から正式になったタイミングから使い始めている。」

チ「そこで質問、実際に使っているBlazorですけど、サーバーサイドを使ってますか?WebAssemblyを使ってますか?」

さ「あー、良い質もですね。両方です。」

さ「もっぱら、WebAssembly側を中心に考えている。サーバーサイドでやった方がいい案件もあったりして選んでます。」

チ「そのいい案系という理由は?どんなところにあるんですか?」

さ「ブラウザで処理させるのには重いたいのを、サーバ連携でできるですけどもUIとのイントラクションも多いので、みたいな、特殊な話ですね。」

さ「ただ、基本的にはサーバーサイドだと、切れたらおしまいってのがあって、ブラウザーとサーバーサイドとぷつんと切れたら真っ白になちゃうというのもあって個人的には気に食わないので、そいうこともあって、WebAssembly側を優先にしている。」

タブレット画面を開いて使ってもうらケースが多いんですけど、工場内でWifiが弱かったりして切れたりするので、WebAssemblyなら多少調子悪くても、電波届くところまで言って、ボタンタップしてと言えばよいので。そんな感じでやっている。」

し「Nativeアプリとような感覚で使える感じ。オフラインサポートってあるんですか?」

さ「あります。結局Webなので、PWAとして。」

し「あぁ、普通に。」

チ「プロジェクトテンプレートにPWAがあるのでPWAにするのは楽。ただオフラインの時の実装はしっかりとしないといけない。」

チ「あと最近、Visual StudioVisual Studio Codeで、WEbAssembly側もデバッグできるようになっているし、ブラウザ開発ツールでデバッグしやすくなっている。そういのもあって、使えるところだであれば使いたい Azure Web Static Apps でもBlazor対応してきている。」
Azure Static Web Apps with .NET and Blazor

し「デプロイ先悩むかなと。Azure Web Static Appsにデプロイできるということは完全に静的サイトになるということですか?」

チ「WebAssembly版でやると基本静的サイトとしてできる。」

さ「私のポートフォリオページが、Github Pageにあがっていますね。」

f:id:orangeclover:20201116211209p:plain
I'amJ.sakamoto

チ「かっこいい!!」

さ「これは函館未来大学の学生さんがやった作品を真似たというかパクっただけなんですけどね。」

さ「実装は実際やりましたけど、このコンセプト、このアイディアで。」

し「これが完全にWebAssemblyで動いている。」

さ「サーバサイドじゃないです。staticなコンテンツだけです。」

ま「サーバー側に.NETのランタイムがいらないといことですか?」

さ「いらないです。」

し「若干はいるのかなと思ってたんですけど、そういうわけじゃないんですね。」

さ「全然違いますね。httpサーバさえあればいい。」

し「僕が知ってるのだとDLLが降ってきたと思うんですけど。」

チ「Application のCache > Chache Storageにキャッシュされる。」

f:id:orangeclover:20201116211240p:plain
Cache Storage

さ「一旦は吸い上げに時間がかかるんですよ。」

し「(一旦クリアーしてリロードすると)一応圧縮されてるんですね。」

f:id:orangeclover:20201116211308p:plain
1st access
さ「はい、そのとおりです」

チ「今回のアップデートでさらアセンブリのlazy loadingの機能もでてきて、ロード時にじゃなくて、必要な時にロードするように設定できるようになった。」

し「なんだかんだでアセンブリのサイズが大きい。」

チ「そうそう、その辺懸念されてる方だと、サーバーサイドという選択肢もあったんですけど、なんとなくこなれてきているのと。」

さ「サイズ問題はどうしよもないので、サイズが飲めない方はBlazorやってはだめなんだと思う。JavaScriptの方がいいと思います。 React、Vue、Angular。」

チ「一つの選択肢として、React、VueでJavaScriptベースで行くのか、C#でシングルページの形式で組んでくのか考えて選んでもらっていけばいいのかなと。」

し「WebAssembly系でここまで作り込んだやつってないらしいんで。」

さ「アンテナ貼ってるつもりですけど、WebAssemblyでSPAが作れるというのは見ていない。Goで近いのはあったと思うんですけど。」

し「JS派の人からも注目視されいるというのは聞きましたね。」

チ「完成度高いですよね。いい感じで。」

さ「Steve Sandersonさんがすごすぎる。こんな物作ってしまった。恐ろしい人です。」

し「j.Sakamotoのサイトは、ただ表示してるだけじゃなくて、インタラクティブに動くんですね。」

    jsakamoto$ runtimeinformation
    Framework Description  - .NET 5.0.0
    Process Architecture   - Wasm
    OS Architecture        - Wasm
    OS Description         - Browser
    OS Platform            - Other
    OS Version             - 1.0.0.0
    OS Version ServicePack -

し「もう、.NET 5.0に更新したということですね。」

さ「はい。」

し「WebAssemblyは、数年後一気にきてそうだな。」

チ「WebブラウザがWebAssemblyを対応してきている。環境というところが整っているので一気にいい感じに来ましたよね。」

さ「他の言語も来たらいいのにね。」

し「案外来ないんですよね。C++のコードをWebAssemblyでコンパイルしてという話はよく見るんですけど、なかなかそれより先に進まない。フルスタックのアプリケーションフレームワークが出てこない。難しいんでしょうね。」

チ「個人的にはさらにAzure Static Web Appに対応してきたんで、ホスティング環境としてもいい感じとして整ってきたなと。 Azure Static Web Appはまだプレビューですけど、バックエンドをAzure Functionsで組んでRESTのAPIみたいな構成だと面白いなと、今風だなと。 」

し「前に、今後のロードマップみたいなので、Electronで組み込んだり、Nativeに近いアプリにするみたいな、そういう話もありましたよね。今回のデモとかそいうのでは語られなかったんですけど。」

し「Electronで配信する系であれば、サイズ制限とか全然ないのでそこは全然ありな気がします。」

チ「面白いのは、徐々に、WebAssembly、Webの技術ですけど、ブラウザからNativeにだんだん来ている。Webの技術でNativeアプリを作ろうというのが動きが出てきているのが面白いところ。」

し「正式リリースになっている。途中で諦めるんじゃないかと、SilverLightっぽくなんじゃないかと。」

?「今も言われますもんねSilverlightかーって。」

さ「SilverLightの捨て方ひどかったんですよね。MSのね。あんだけやっておいて、やーめたって。」

チ「AzureのポータルさえSilverLightで組んでた時代があったんですよね、知ってますか、みなさん。前の前の世代です。」

チ「SilverLightプラグイン依存してたところが、BlazorはプラグインではなくWeb標準のWebAssemblyというところが、そもそもブラウザが対応してるという環境が整っているというところがぜんぜん違う。」

し「最近のASP.NETチームは、Blazarしかやってない、MVCとかは放置されている。」

チ「MVCよりはBlazor、API周りに注力するというのは今の流れとしては妥当だと思います。」

チ「バックエンドを作るのにAPI周りの充実とフロントエンドはBlazorもそうだし、注力ポイントは今のトレンドを踏まえた流れにはなっていますね。」

Entity Framework Core

スライド

動画

https://youtu.be/HJ802p3syTw?t=3009

Announcing the Release of EF Core 5.0

し「ここのチームは何をやったかというのをすごい書いてある。ついに、Many-to-many が戻ってきました。」

し「さかもとさんはどれかの機能について言ってたんですが。」

さ「Required 1:1 dependents かな」

し「微妙に挙動が変わったみたいな。」

し「EF Core のリリースと計画 で リリース計画がある」

f:id:orangeclover:20201116211430p:plain
EF Coreのリリース計画

し「Entity Framework Core 5.0のおおまかな計画 で誰がやって、規模がどのくらいか、Github上でやってのが転記されている。すごいオープン。何をやったか、リーダーが誰かも書いてある。」

f:id:orangeclover:20201116211505p:plain
Entity Framework Core 5.0 の計画

し「新機能Preview 1からRCまで細かく書いてある。新機能を追うには最適です。」

f:id:orangeclover:20201116211537p:plain
EF Core 5.0 の新機能

し「互換性 に関しては、破壊的変更が多少あるので、移行の際には、この辺を気をつけていただければよいです。」

f:id:orangeclover:20201116211610p:plain
EF Core 5.0 での破壊的変更

し「一番最後(RC1)で入ったのがMany to Manyです。めちゃくちゃ時間掛かって、実装も大変だんったみたい。」

し「でも、Entity Framework 6よりか確実に良くなっている。最近なんだかんだで、DapperのマイクロORMが便利だし、Queryを書くときもさっと書いてさっと使えるのも便利ですけど、業務ロジックでJOINとかいろいろ複雑なものになってくると、Entity FrameworkでLINQで書くというのが便利なことも多い」

し「この辺りは使い分けて、どちらか片方によるんじゃなくて必要なものを選んで行けたらいい。」

し「パフォーマンスもものによってはDapperに近いくらい出るという話が挙がっている。」

チ「昔は、パファオーマンスで悩まされた方々も多いEntity Framework。Coreじゃない前のころだよね。Coreになってかなり軽量化されていい感じですよね。」

し「しかもRuntimeがパフォーマンスも上がっているんで、同時に???ってます。」

し「Entity Framework Core 5.0は、.NET Standaer 2.1なんです。」

し「ASP.NET Core 5.0は、.NET 5.0なんです。TMFが。」

し「Entity Framework Core 5.0はちょっと広く使えます。.NET Core 3.1でも使えます。広く使うという意味では重要なポイント。」

し「Azure Functionsが怪しんで、なにも話がでなかったじゃないですか。」

チ「私、追えてないんですけど、Azure App Serviceは、.NET 5が来てるじゃないですか。」

し「来てます。」

チ「Azure Functionsってどうなんですか?」

し「3.1。たぶん、無理やりランタイムを5.0にしたら落ちると思います。」

し「なので、Entity Framework Coreは、.NET Standar 2.のままじゃないと、Azure Functionsで使えなくなる。」

し「この辺りは情報待ち。」

Cloud native / Microservices

スライド

動画

https://youtu.be/HJ802p3syTw?t=3280

.NET 5.0 Release - dotnet-docker

し「dockerの命名規約が変わっている。Breaking Change: .NET Docker Repo Name Change

ま「ちょくちょくありますね。」

チ「そうだよね。」

し「こないだも変わっただろうって。」

し「dotnet/coreからdonetへ変更でcoreがなくなった。」

チ「シンプルにはなった。5でね。」

し「今使ってる方はアップデートの時に要注意かな。」

し「Docker images サイズは、嘘みたいに小さくなって、5KB。嘘みたいですけどね。」

f:id:orangeclover:20201116211637p:plain
Docker images

チ「manifest onlyなんだ。」

し「MicroServiceとKubernetesとかに展開するのに使いやすくなっている。pullのコストが大きいですからね。」

チ「なので、コンテナで移行を考えている方は、Windows Containerに、.NET Coreなり.NET 5にした方がいいと思います。」

し「Windows Containerで.NET Coreを動かす人はいないんで。」

チ「まぁ、.NET Frameworkをどうしよう。.NET Coreに移行しようかな、いや、.NET Framewokrのままで。」

し「そこは無理くり.NET Coreに移行して。」

ま「.NET Coreに移行して欲しいですよね。」

し「.NET Frameworkから移行するプロフェッショナルのまつむらさんがいるので。」

ま「お待ちしております。」

Introducing Project Tye

し「読み方に自信ないんで松村さんいいですか?」

ま「は、プロジェクトタイ。これ、Project Typeなのか.NET TyeなのかTyeだけなのか。表記がバラバラなので、僕も分からないです。Project Tyeって言葉が一番多く出ていましたね。」

ま「MicroServiceの開発を支援するツール。デプロイメントをサポートしているオーケストレーションツールですね。」

し「基本はデプロイをやってくれるということなんですか??ASP.NETの方にライブラリに入れたりする?」

ま「ライブラリには入れなくて、csprojには入れなくてよくて、Tyeというグロバールツールを環境にインストールする。ローカルでも、例えばバックエンド用のAPIASP.net core Web APIとフロントサービス用のRazor Pageとか2つ置いておいて、ローカルでTyeでrunすると、ローカル環境でMicroServiceの環境を動かすことができるコマンドですね。」

ま「それをAKS(Azure KubernetesService)とか、Azureの環境にデプロイする機能も入っています。」

し「基本はKubernetes用なんですかね?」

ま「そうですね。サンプルもAKS(Azure Kubernetes Service)用が一番多いですね。」

し「やっぱそういう形になるんですね。自社でオンプレでkuberntesをやるかわからないですけど、そういうのにも行けるかもしれないですね。」

ま「そこはですね、デプロイする時にAKS(Azure Kubernetes Service)のcredentialがいるんですよ。」

し「なるほど」

ま「ローカルでAzure CLIとかでAKS(Azure Kubernetes Service)とつなげておいて、デプロイする形ですね。」

チ「コンテナレジストリも指定するんですよね?」

ま「そうですね。Docker HubかAzure Container Registryのどっちか。その2つが使えます。」

チ「デプロイするときって、DockerfileとかKubernetesのconfig、YAMLのdeploy configとかは別になくてもいいという認識であってます?」

ま「Dockerfileいらないんですよ。」

し「いらないんですか?」

ま「Tye用のYAMLファイルをルートに置いておいて、そこに構成を書くんですよね。」

チ「勝手にその辺りは作ってうまい感じでDockerコンテナにビルドして、ACR(Azure Container Registry)なりにpushして、Kubernetesまで走らせてくれる便利ツールですね。」

し「Dockerのイメージのビルドは必要なですね?」

ま「Dockerをインストールして置かなければならなかったはずです。」

チ「ローカル環境にDockerはいないといけないですね。」

ま「これが構成を定義しているYAMLです。バックエンド用とフロントエンド用に定義しておいて。」

f:id:orangeclover:20201116211718p:plain
Project Tye YAML backend

f:id:orangeclover:20201116211743p:plain
Project Tye YAML frontend

ま「それぞれサービスですという感じで登録していて。」

f:id:orangeclover:20201116211815p:plain
Project Tye YAML serivces

services:
- name: backend
  project: backend/backend.csproj
- name: frontend
  project: frontedn/frontend.csproj

ま「レジストリですね。Docker HubかACR(Azure Container Registry)に」

registory: acrpojecttye.azurecr.io

ま「あと必要な別のサービスredisとか書いておいて。」

- name: redis
  image: redis
  bindings:
  - port: 6379
    connectionString: "${host}:${port}"
- name: redis-cli
  image: redis
  args: "redis-cli -h redis MONITOR"
  • 全体
name: microservice
registory: acrpojecttye.azurecr.io
services:
- name: backend
  project: backend/backend.csproj
- name: frontend
  project: frontedn/frontend.csproj
  env:
  - name:YOUR_NAME
    value: "YUTA in YAML"
 - name: redis
   image: redis
   bindings:
   - port: 6379
     connectionString: "${host}:${port}"
 - name: redis-cli
   image: redis
   args: "redis-cli -h redis MONITOR"

ま「これをローカルで tye run する 」

f:id:orangeclover:20201116211846p:plain
Project Tye tye run
し「ここでcsprojを指定するのは新鮮な感じがありますね。」

ま「新鮮です。Visual Studioでいいじゃんと言われたらそれまでなんですけど。」

し「いや、結構俺は好きですね。Dockefileをやっても、正直Dockerfileってだいたい同じになるじゃないですか。」

ま「うんうん」

し「なんでそこらへんも自動でよしなにやってくれた方がと思うんで。」

チ「.NETベースで複数サービス、このケースだとフロントエンドとバックエンドが1対1ですけど、いろいろバックエンドが複数のサービスが動いてくるときに例えばデバッグする時に、全部1つずつ順番を追っていくサービスを立ち上げて、フロント立ち上げて、デバッグみたいなところも依存関係も全部やってくれるですよね。」

ま「なので、ローカルにデプロイするときもYAMLを変えなくていいんですよ。そのままデプロイのコマンド打つだけで、デプロイすることができる。」

ま「5月ぐらいに発表されたですけど、見た時新鮮でしたね。あまりこういうのなかったから.NETに。」

チ「Fukutenとかでハンズオンとかやってますよね、たしか。」

ま「そうそう、はい。私がやってるコミュニティ(Fukuoka.NET?)でもProject Tyeのハンズオンはやってますよ。オンラインでやってるのでぜひぜひ参加してください。」

さ「実際画面見たら分かりやすいですね。」

ま「これまだ、プレビューにすらまだなっていないツール、試験的ツールなんですけど、一昨日ぐらいにVersion 0.5がでてきて、ようやく.NET 5に対応したんですよ。 それまで、.NET Coreの3.1しか動かなかったんですけど。一番新しいバージョンだと、.NET 5で動作できると、今日確認しました。」

し「Kubernetesを利用している話を聞くと、このYAMLってきつし、Dockerのビルドから含めてCIをするのって話を聞くだけもつらそうだなというイメージだったんですが、これは結構わかりやすい感じになっている。」

チ「アプリケーション開発者が、このケースだと、APS.NETでフロントエンドとハックエンドを作るのに、その人が更にDockerfileまでならまだしも、Kubernetesのデプロイ用のYAML書きますか?たぶんそこまでなかなか手が回らない。辛いと思う。だからどうしてもそこの専任の人が必要なケースがあると思うんですよ。」

チ「あとデバッグ環境ですよね。MicroServiceで作られているような複数サービスがあるようなときにをどういうふうにデバッグするのか、実施Kubernetesにデプロイするにしても、デバッグ用のKubernetesクラスタを作ってというところも含めて、結構大変なので。」

チ「.NETをやられる方だと、Tyeみたいなツールがあると、とりあえず手元でデバッグする、勝手に依存関係持って立ち上げてデバッグできるし、そのままTyeでKubernetesAKS(Azure Kubernetes Service)までデプロイしてくれる。ある意味楽は楽ですよね。」

ま「Tye用のパッケージある。YAML環境変数を設定するんで、それを参照するようなライブラリ。これだけ入れれば大丈夫です。」

    - name: frontend
      project: frontedn/frontend.csproj
      env:
      - name:YOUR_NAME
        value: "YUTA in YAML"
  • frontend.csproj
<ItemGroup>
  <PackageRefernece Include="Microsoft.Tye.Extentions.Configuration" Version="0.4.0-*" />
<ItemGroup>

し「これはよくあるASP.NET というか、.NET CoreのConfigureationの拡張ということなんですね。」

ま「appsettings.jsonに見るのかyamlの方を見るのか、確かyamlの方が優先。」

し「かなりシンプルですね。」

し「僕が勉強になって最高って感じです。」

ま「プレビューになって欲しいので、みんなで使ってフィードバックしましょう。」

Introducing YARP Preview 1

し「.NET Confの中で、新しいリバースプロキシーが出てきたと、C#で書かれた構成のプロキシ、YARP(ヤープ)。」

し「ちなみにまだベンチマークが公開されてないので、まだハイパフォーマンスかどうかは分からないですけど。」

し「少なくても、ARR(Application Request Routing)よりかは速いだろうという。」

チ「結構、ドキュメント、サンプルコードは揃ってましたね、いろいろ」

し「開発も進んでいて、性能も明らかに悪くはないだろうという感じですね。」

し「最近はもうHealth Cheksとか、本番で使うのに必要な開発に移ってきたかなと。」

チ「もうプレビューを取る方向で」

し「ちょっと前までは、認証がーとか、Session Affinityとか、リバースプロキシーの基本的な機能だった。最近は変わってきました。」

チ「Health Cheksの機能が入ってくるとかなり本番を意識した実装が進んでる感じですね。」

し「この辺りをMicorsoftがやっている理由というのが、Cloud Native時代というか、KubernetesからIngerssとかで外部からのリクエストを内部のコンテナに流し込む部分が必要。そこがリバースプロキシが何かしら動く必要があるという話ですよね。」

し「よく見るのはNginxのIngressとかをApplication Gatewayとして使うみたいな。でもあいつが遅いですよね。」

これは、Azureの Application Gateway イングレスコントローラーのことかしら?

チ「Application Gateway単体で使うのはいいんですけど、Ingressコントローラーとして使うことはできますけど、個人的には、私が言うのもなんですけど、NginxのIngerssコントローラを使いたいなという感じはします。」

し「僕もそう思います。」

チ「Application Gatewayも、ロードマップ的なところを見るとアップデートの予定もあるんで、いろいろ改善はされてくると思います。」

し「一応、あれV2にはなっていて、V1ってWindows+ARRだったのが、V2になってLinuxとNginxにになったんですよ。なので、ましになっって、オートスケールとかも対応してきてるですが、ちょっと重量級ですよね。」

チ「そうですよね。」

し「今リバースプロキシーを作るというのは、IIS捨てられるのかなってという気持ちも若干しつつ。」

チ (笑)

し「正直最近のAzure系の開発だと、IISを使う理由はARR(Application Request Routing)のリバースプロキシという感じ。」

チ「そうですね。まぁ、そもそも、.NET Coreが出てきて、kestreで動くという流れでは、もちろん、IIS依存をなくしていこうという動きはもちろんあるのでこういう段階でYARPみたいなC#ASP.NET Coreベースで、こういう実装が進んできてるということは、やっぱりもっとより依存を、WindowsIIS一本のてをできなくしていこうというのは明らかなところだと思います。」

し「リバースプロキシはAzure Functionsのプロキシとか細かい部分で使われているので、App ServiceもARRとか、なんだかんだで、PaaSとかSaaSの実装に必要な部分なので、このYARPは、僕らが気軽に使うというよりも、実は、社内で勝手に使っていくために作ってるんじゃないかって思ってますね。」

し「アップデートとサービスに取り込まれて、自然にその辺のハイパフォーマンスさの恩恵を受けることができる時代を期待している。」

チ「いいところに目をつけていると思います。たしかにその通りかもしれないですね。」

チ「このYARPが出てきました。普通に開発されてる方が実際YARPを使って、自分で買う言うところを実装していくかと多分やる人も濃い人はいるとは思います。」

チ「実施のAPS.NET Coreのパイプラインをもっと高速にいろいろ作りたいというのがあるかもしれないですけど、でも、たしかに、多分、MS側でいろいろ、これを使った軽量なものをしっかり作るという土台にはなっていく気がしますね。私もそんな気がします。」

し「そういった意味でもすごく注目をしています。」

Xamarin / .NET MAUI Preview

スライド

動画

https://youtu.be/HJ802p3syTw?t=4363

Recapping Xamarin Highlights from .NET Conf

し「みつばさんお待たせしました。」

み「Windowsかと言われるとちょっと違うからね。でもどうなんですかねFormsって、Monoをやってるところでも、XamarinはXamarin.Formsとは違うよ。逆にしても Xmarin.FormsはXamrinとは違うよと結構言われている。」

み「MicrosoftのデモってFormsのものが多いので、では、実際、Formsってどうなのというのは昔から思ってるところではあるんですけど。やっぱりForms、Formsって言われてるのってなんなんでしょうねみたいな。」

み「やっぱりいろんなところで動くのは嬉しいのかなどうなんかなとか、あとやっぱり、UIをXAMLで書きたい人たちがいるのかなーみたいなのは気になってはいます。」

み「で、そのタイミングでMAUIでしょみたいな。」

チ「でも、本命は.NET 5、6でのMAUIな流れだと思うんですけどね。」

み「そうですよね。」

し「何が変わるかというのがまだ明確に見えてこない。」

み「まだあんまり情報がないというか。」

し「ただ、開発自体はすごくがんばっているのはわかる。」

し「最近クロスプラットフォームのUIフレームワークが多くなってきたなっていう。いろんな言語で。」

し「だから、みんなそこに目をつけ始めた。Xamarin.Formsはちょっと先に進んでたのかもしれないですけど、追い抜かれそうなのでもうちょっとがんばってほしい。」

チ「Introducing .NET Multi-platform App UI(blog)今ちょうどでてますけど、たぶんこの辺、Xamarin.Formsとかでもある程度プロジェクトがiOSAndroidみたいな感じでどうしても依存してる部分が残っている部分があったと思うんですけど。」

f:id:orangeclover:20201116211919p:plain
MAUI Single Project Developer Experience

チ「実際この辺がどのくらいの形で、出てくるのか、これ見る限りだと分からない。もうちょっとシンプルに1プロジェクトみたいなシンプルな形でいくといいな。」

チ「まだ実体が分からないというところが正直なところ。」

し「このMVUが気にあってはいるんですよ。」

f:id:orangeclover:20201116211947p:plain
MAUI MVU

し「Model-View-Updateパターン。最近他のフレームワーク。りんごのフレームワークだとちょいちょい見るパターン。」

し「iOSのSwiftじゃなくて、Swift UIだっけ、その辺がこういうパターンだった気がするけど。」

み「そうですね。コードででUIが作れます。」

し「みなさん、MVVMかコードビハインドかどっちかだったのが、新しいパターンが増えるというのは興味があり。」

チ「最近のトレンドをちゃんと入れてきている感じはありますね。」

し「Roadmapのページもちゃんとありました。」

み「個人的には、Uno Platformにすごい興味があって、今ちょっと調べた感じ、Uno Platformが.NET 5に完全対応するぜって言っちゃってる。」

み「僕は、いわゆるWebの人間なくて、XAMLプラットフォームの人間なので、ちょっとこっちの方が興味ある。」

み「基本Mono Platformって、XAMLでUIを書いて、WindowsとWebとモバイルとなんやかんやで動きますみたいなやつなんですけど、それが一応Monoの上に乗ってたかな、WASMの上に乗ってて、それが.NET 5に移行するぜみたいなPlatformなんです。」

み「どうやらMicorsoftもいろいろお手伝いをしてるみたいです。」

チ「それは聞いてますね。多分、結構入っていると思います。」

し「High Level Architectureにあった。.NET 5で動かす。」

f:id:orangeclover:20201116212019p:plain
Uno Platfomr High Level Architecture

み「最初から興味をもって、最近ちょっとされてなかったんだけど。」

チ「割とこっちの方が進んでいる感じ、もちろん、すでに使えるものがあるわけですし。」

み「UIとかも割と揃っていて、Uno Gallary にWebなり、モバイルなりで、Material とFluent のUIを使い分けれたりとかダークモードとかブラシもあったりとか。」

f:id:orangeclover:20201116212047p:plain
Uno Platfomr Uno Gallary

み「なんかこの辺ってもしかしてMAUIと競合とかになってくるのかなと、ちょっと思いながら見てますね。」

し「同じC#で書けるクロスプラットフォームなUIをフレームワークという観点だと完全に一緒ですね。」

し「僕は、どこまで共通化ができるのかみたいなのがちょっと気になる。」

み「どうやらMVPが作ってるらいしいのね。」

み「ワンちゃん、買収してくれへんかなと思ってたりする。」

チ「ね。MAUIのロードマップとか含めても、十分なかまだこの辺は動きがありそうですね。Uno Platform含めて、どんでん返しがあるような気もしないでもないです。」

み「.NET 5もそうだし、.NET 6もそうだし、その間でチェックしておくと面白いかな。今は。」

し「ちょっとやっぱ、このMAUIは進みの悪さに。」

み「もうそうだから、Webは羨ましいなって。」

し「なぜかねー、MicrosoftはNative系のUIを作るのが苦っていうね。」

み「.NET CoreとかもWebが先で、がんがんいろんなね、それこそAsyncEnumerableとか使えたのもWebが先だったんで。」

み「そういう機能がC#の言語機能だったりとか.NET 5のSKDのなんやかが、UIライブラリとかクライアント系とかライブラリとかに使えてくるようになると今後ちょっとおもしろくなってくるのかぁという感じかなと静観しています。」

チ「ちょっと注目ですね。確かに。」

み「言い方変えればまだ注目ぐらいでよいかなって。」

し「まだいじろうにも、今回、.NET 5のリリースのタイミングでMAUIのプレビューがでるかと思ったんですよね。late2020って書いてあるんで。」

し「アメリカの人たちにとってのlate2020というのは11月だと思ったんですけど、12月はお休みでみんな仕事しないはずなんで。」

し「と思ってたんですけど、なんとプレビューが出なかったという。正直この瞬間、不安を。」

チ「で、キーノートでXamarin.Forms 5のデモしてただけでしょ。」

し「MAUIの一言も言ってなかった気がしますね。」

チ「でなかった気がする。」

し「Xamarin.Forms 5だけ出てて。」

チ「そうそっちでしたね完全に。」

し「MAUIはそういや話がなかったなって。」

み「ちょっとそっとしてあげておいた方がいいじゃない。」

チ「みなさん動向は注目しつつ、今のところはそっとしておいいてあげてくださいという感じでしょうね。」

し「まーフェードアウトしている可能性もある。個人的にはnamespaceをSystemから始めるのは失敗の雰囲気がする。」

一同 (爆笑)

チ「なるほどね。」

し「だいたい、後で、大幅なリネームとか発生して、ぐちゃぐちゃになるみたいな予感がする。ちょっと怖いなっていう。」

み「なんかあくまで僕の周りあるいはお仕事の観点ですけど、やっぱりクライアントって最近下火で、今まで作ってたクライアントアプリをWebに持っていきたいみたいな仕事も多いし。」

み「正直そうですね、やっぱりWebで作りたいあるいは社内のインフラからWebから見せるようにしたいよみたいなお客様はいるので、どちらかというとクライアントをバリバリやるというのはあんまりお仕事ではないかな。」

み「僕としては手慣れているのでまずスクラッチとかプロトタイプをクライアントでパッと作ってって、WPFとかもそうですけど、.NET Coreが来て、.NET 5がきて、なんでほぼMVVMとかをつかったりするとメソッド単位では、ASP.NETWPFと共存できたりしちゃったりするし。」

み「同じnugetのプロジェクトで使えたりするので、プロトタイプをWPFで手慣れてるから作っちゃって、同じコードを使って、APS.NETで本番作り直すみたいなことはしてますね。」

チ「そうなってくるとC#ベースでまずクライアントを先にプロトタイプ作っていきます。じゃ、完成しましょうというときに、それこそさっき言ったBlazorとかを使ってそのままWebに移行していきます。メインはC#のままいけますみたいのは、その流れというのは1つトレンドとしてあるんでしょうね。」

み「ようやくバージョンがそろって共通化されて、書き捨てるコードが減ったというのは嬉しいですね。」

チ「なるほど。」

し「Uno PlatformさっきWebAssemblyもあるって書いてある。」

み「あるよ。」

し「ブラウザに移るにも。」

み「Uno Gallary自体がすでにUnoでブラウザで作られているんじゃないかな。WebAssemblyベースなんで。」

し「えっ!?」

み「あと、Windowsで動いている電卓を丸々移植したぜってというのがあって、移植されたWindowsの電卓はWebでmacでもiOSでもAndroidでも動くというデモはそれぞれのストアーに公開されてたりします。」

チ「うん。」

し「結構、案外使われていたりする。」

み「案外いろいろできる。映画のチケットとかも、ナショナルジオグラフィックのラーニングにも使われてるらしい。」

チ「Channel 9のアプリにも。」

み「へーそれしらんかった。」

し「これは、Unoが作ったサンプルアプリですよね。」

み「勝手に作ったやつかな。」

し「やばいな、Microsoftがこれやってたらどうしようかなって。」

し「これか、Calculator。」

f:id:orangeclover:20201116212120p:plain
Uno demo

み「Google Playにも、App Storeにも。」

チ「くりそつじゃないですか。」

ま「この見覚えのある。」

チ「見覚えのある。」

さ「なぜかWindowsの電卓のソースコードが公開されてるからですよね。」

み「そうなんですよね。そそそ。公開されてるんですよね。」

み「モバイル版だとちゃんと横に向けると関数電卓になったりとかするんじゃないかな。」

し「すごい、これ普通にちゃんと日本語出ているのがポイント高いな。」

f:id:orangeclover:20201116212205p:plain
Uno calc 日本語

し「かなり広がってきて、楽しいなー。」

し「プロトタイプとかで、ライブラリとが全部共通化できて。」

み「最初Wikiに触った感じだと、若干安定していない、こういうことは書けないみたいのがあったんですけど、もしかしたら、バージョンが上がって、安定性も上がってるかもしれないですよね。」

し「ちゃんとダークモードにも対応してる。」

f:id:orangeclover:20201116212237p:plain
Uno dakrmode
チ「すごい作り込まれてて、いろなところが素晴らしい。」

し「ちょっとUno Platform買収かな。」

一同 (爆笑)

し「半年後ぐらいに買収されてきそうな気がしてきましたね。」

し「で、MAUIがそのまま入れ替えるみたいな。そういう未来もありそうな気がします。」

し「今回クライアントの話あまり聞けないかなと思ったんですけど、話がでてきて面白い。」

し「Uno Platform、自分で触ろう遊ぼうとは全然思ってなかった。」

チ「私も勉強になりました。名前ぐらいしか聞いてなかったので。実際、状況として勉強になりました。」

チ「MAUIがどうなるかはちょっとノーコメントとさせていただけたらと思いますけれども。」

Windows 向け機能 / その他

スライド

動画

https://youtu.be/HJ802p3syTw?t=5294

ARM64 Performance in .NET 5

し「Windows 10のARM64、Surface Pro Xというパソコンですね。それで、Nativeでで動くようになったんですけど、SDKも公開されて、Suraface Pro X上で、ASP.NET Coreアプリケーションとかも動くようになっているす。」

し「でも、一番欲しかったWPFが入ってなくて。」

チ「そっか。」

み「でも、UWPは動くでしょ?」

し「UWPはNativeにビルドするから、.NET Coreと関係なくて。」

し「ちなみに、UWPは最後に更新されたのが1年くらい前だと思う。」

み「大丈夫なのか?」

し「実質死んだでしょ。これね。」

一同 (爆笑)

チ「ノーコメントで行きましょう。」

し「これ死んだなと思う。と思ってます。」

み「今日はじめてUWPと言ったけどね。」

し「だからUWPがくると思ってなかった。」

し「これは死ぬんじゃないかな、正直。」

し「でもこれで、WindowsのARM64サポートで.NET CoreのコードジェネレーターとかJITコンパイラーとかがARM64のコードを普通に吐くようになってたので、LinuxのARM64、Linux ARM32に対応したんですが、この間、発表になったApple SiliconのMacBookとかのサポートが徐々に始まっているらしい。」

し「Pull Requestもいくつか出てて、そこへのサポートがひょっとして、6では普通に入ってくるかもしれないな。」

し「その辺りでクロスプラットフォームUIフレームワークの価値も出てくるかもしれないですね。」

チ「そうですね、確かに。」

し「Nativeアプリで動くって超重要だと思う。その辺りはあのARM64、あのMacがどのくらい売れるか分からないんですけど、結構主流となってくる可能性もあるかなっていう思い。」

し「デバイス適当に買って、Windowsですけど、買って遊んでるという感じです。」

チ「しばやん買ったんですか?」

し「僕はPro Xを持ってます。」

し「結構、電池持ちもいいし、パフォーマンスも悪くないし、結構いい。」

Announcing C#/WinRT Version 1.0 with the .NET 5 GA Release

し「唯一UWPっぽい話題がこのWinRT APIを利用する機能がついたってやつ。」

し「僕も最初全然知らなくて、Microsoftの太田かずきさんのツイートとかブログ見て、こういう書き方できたんだって思ったんですよ。」

し「今日、度々出てくるTFMって、昔、Target Framework Monikersだったのが、Target Framework Names になってます。ここでは、Monikersって書いてあるんですけど。微妙に名前が変更されてて。」

f:id:orangeclover:20201116212311p:plain
Call Windows APIs with new TFMs in .NET 5

し「UWPといかWinRTのAPIを叩くのってめんどくさかったんですけど、nugetで謎のパッケージ入れないと使えなかった。」

し「そこのTFMに-Windowsとバージョンを入れるとそれだけで、トーストとかのAPIも普通に叩けるようになる。」

チ「これは知らなかったな、私も。」

し「これはちょっと便利。」

し「でも、それだけなんですよね。」

一同 (爆笑)

チ「ちなみに私もWinRT周りについて詳しくないですけど、実際に.NET側からWinRTのAPIを叩くケースって結構あるんですか?」

し「実はそれあるんですよ。」

し「スタートアップ起動とか常駐アプリケーションとかだと今だとSlacとか普通にWindowsと上がってくるじゃないですか。タスクマネージャーでスタートアップとかいうタブ増えてて、そこから選べるんですが、あれって登録するAPIがWinRTにしかない。」

チ「なるほどね。」

し「常駐するアプリケーションとかは、普通にWPFを作りたいですが、今まではレジストリとか直接いじるとかしないといけなかったのが、APIだと一発なんです。」

し「あと、他にもセンサー系のAPIとか、いろいろいいですよね、デバイスいじる時。」

し「便利ちゃ、便利なんですけど、ちょっと使い勝手が悪かったです。なぞSDK入れたり。」

し「だから、公式サンプルは新しい書き方と、古い書き方と、もっと古い書き方がごちゃまぜになっていて、何が最新か分からないです。」

チ「ありがちな部分。」

し「だいぶこういうふうな感じマシになったなと。」

し「WinRTのAPIも正直どこまで使えるkわからないですけど。」

し「ちょっとこの辺りは普通に書こうっていうには便利です。」

Announcing Version 1.0 of .NET for Apache Spark

し「最後、その他というので、微妙に関係があるようでない、.NET for Apache Sparkがですね。 .NET Standard 2.0 で。」

し「Apache Spark、今だとやっぱりPythonか、元がJavaなんで、バインディグでPythonとかで書く世界なんですよ。やっぱりなれたC#で書きたい。」

し「2週間ぐらい前に、別のイベントで、Azure Synapse Analyticsとかやったんですが、やっぱりPythonも読めるけど、やっぱりC#で書きたい。型とか欲しい。とかあったんで。」

し「この辺1.0で正式リリースになったんで。Azureのサービスとかで組み込まれていくとかなり個人的にはうれしい感じです。」

チ「.NETもいろんなアプリケーションも作れますし、AIという要素もずっと謳われてて、ご存知のお方もいると思いますが、ML.NETがあるじゃないですか。.NETでモデル作って、C#の中で使っていけるのような。それを合わせて、Sparkベースで、C#で書いてける。」

チ「その辺も含めてちゃんとやってるよというのはこういうところに出てますよね。1.0になったというのは。いいことだと思います。」

Project Reunion

し「Twitter見てると、かずきさんがProject Reunionとつぶやいてくださってるんですが、完全にわすてました。」

チ「Project ReunionってWin UIのとこでしたっけ?」

し「ですね。分断されたAPIを統合するまで。」

し「本当にProject Reunionのリポジトリ ってあるんですね。CIが落ちてるのは、不吉な予感がしますけど。」

f:id:orangeclover:20201116212342p:plain
Project Reunion

し「成功を祈ります。」

し「ちょっと不安、いやちょっとじゃない、だいぶ不安ではあるです。」

し「なんかこういうWin RTをまとめた人もWin 32とかWPFがとかの統合とかいう話をしてた気がするんですよね。UWPとかも。」

f:id:orangeclover:20201116212412p:plain
Project Reunion 統合

し「そういう統合するという壮大な計画はだいたいオチが見えるみたいな。」

し「リリースされるのを一応待ちます。」

し「一応これでスライドは全てです。予定してた時間はこれで終わり、本当だったらこのあとQ&Aとかを入れようと思ったんスけど都度入れつつ、Twitterとかで拾いつつやったので、Twitterも見てたんですけど、特にめちゃくちゃ多かったというわけでもなかったので」

み「コメントが多いですね。」

し「そう、コメントが多い。」

し「MAUIはちょっと評判悪くしてしちゃかもしれないですね。」

一同 (爆笑)

XAML Standard

み「あー、なんか、XAML Standardと言ってる。」

チ「XAML Standard!!」

し「XAML Islandとか言っちゃダメだと思う。」

チ「XAML Standardを知ってる方がいらっしゃいましたか。」

し「あれ、結局、リポジトリがほぼ空っぽのまま終わったという。」

チ「終わりましたねー。XamarinのXAMLとXamarin.FormsのXAMLWPFと全部統合しましょうってやつです。」

み「Reunionにも似た雰囲気あるよな。」

チ「そんだけ統合というのは難しいということなんですよね。」

し「難しいのは分かるんで、いつか成功して欲しい気持ちはあるんですが、当分無理な気がします。」

し「一応枠的には22時までとっているのでそこまでは僕らで。」

番外編

動画

https://youtu.be/HJ802p3syTw?t=5940

LTS

み「あと、楽屋裏でちらっと話してたLTSの話はする?」

し「あー、LTSの話はしておかないといけない。」

チ「あーそうですよね。あれ楽屋裏で話してたやつですよね。」

し「確か、それまつむらさんが、.NETのライフサイクルについてQiitaでしたっけ?」

し「確かに、TLSの話しはしておかないと、XAML StandardとかXAML Islandはなかったいいねみたいな感じで。」

し「お笑い担当にみたいになって本当はよくないと思う。変えてって欲しい。」

チ「大事。大事。」

ま「 .NET Coreのサポートポリシーをまとめた これね。」

チ「サポートポリシー大事ですね。」

し「サポートポリシー超重要。」

ま「一応がんばってアップデートしているつもりです。」

し「超重要ですよね。」

ま「これ結構大事なんですよね。」

し「結構、みんな油断するのがこのCurrentとかがLTSがリリースされた後の3ヶ月間とか、後続のやつがリリースされた3ヶ月間とか結構短いですよね。」

f:id:orangeclover:20201116212459p:plain
LTS Current

f:id:orangeclover:20201117140221p:plain
LTS
ま「短い」

チ「LTSは3年。次のLTSが出てから1年という話がだいたい。」

し「今は、LTSとCurrentしかないですよね。他全部EOLになってる。」

ま「はい。」

ま「カレント使ったらがんばって3ヶ月ごとのアップデートとか、アップデートにアンテナ貼っておく必要があって。」

ま「それを気にしたくないんだったら、LTSを選ぶとかそんな感じじゃないですかね。」

し「この辺りは難しいですよね。常時開発してて、どんどん良くしていこうという形だと、新しいものを突っ込んでいって常時アップデートがされているという状況であれば全然Currentに追いつくのは簡単だと思う。」

し「LTSの絡みで面白い話があったの思い出しました。Azure FnctionsnのV2ってやつ、.NET Coreの2世代なんですが、あいつ一時、runtimeが.NET Core 2.2だったんですよ。」

ま「そうそう」

チ「あー、あったあった。」

し「2.2ということは、とっくにサポートが終わっている。(2019年12月23日)。公式が提供してるものが、サポート切れしているランタイム上でずっと動いてた。」

チ「あったね、あったね。」

し「なので、今、2.1に落としたんです。」

チ「あー、そっか。」

し「2.1に途中で落として、今は、実は、11月の頭に、Azure Function V2に関しても自動的に3.1を使うようにアップデートが走ったはずなので、3.1で動くようになっています。」

チ「一時期巷では話題になっていましたね。」

し「なんで、Azure Functionsは、2.1と3.1で動いてる状況なんですが、やっぱり、LTSを狙っているなという印象ですね。」

し「5がLTSにならないのは、ちょっとどうなるんだろう。」

チ「あー、6が出るまで動かないかも。」

し「LTSがまで1年って長いなっていう。」

チ「うんうん、そうですね。どちらを選ぶかみなさんが考える中で、LTSでとなるとしばらく3.1のままでしょうしね。そういったところでもAzure Functionsの 流れ的には.NET 6まで上がらない可能性はありそうな気もしますけど。」

し「Functionsチームが、ちゃんとCurrentに追いついてくれれえばいいんですけどね。」

チ「うんうんうん。」

し「.NET Confで話とかちょっとでなかったんですよ。」

し「Docker imageサポートとか、Docker imageとか残るんで、結構サポート切れても気が付かない。」

チ「そうですね。」

し「まとめていただいてるのはすごい助かる。」

チ「「これいいです。」

チ「サポートされるOS。」

ま「その辺もちょくちょく変わっている。サポート範囲というか。」

チ「.NET 5がでて、この辺少しアップデートがありましたね。確か一部切り捨てられたのもあったと思います。」

ま「確か、Windows Serverの古いやつとか切られたんですよね。たしか。あと、UbuntuのLTSがじゃないやつとかも気づいたら外れたたりしますね。」

し「確かに、ちょっと、Ubuntuはこの辺り(20.04, 18.04,16.04)は、LTSですもんね。」

み「.NET 6って来年の今頃に出るんや。」

チ「予定だと、そう、1年後の11月。」

まつ「1年間隔になった。」

み「また、その1年後に7、その翌年に8が出て。」

チ「奇数年に出てくるやつがLTSという一応定義になってますね。2021、2023、2025年のバージョンアップで出てくるのがLTS。予定としてはそういう形で組まれています。」

し「個人的には、5.1とかいうのがリリースされるのかというのがちょっと気になるんですけど。」

チ「あり得ると思いますよ。今言ってるロードマップのやつはメージャーバージョンアップって言ってるので、マイナーだったりリビジョンが変わったり、するてのは十分あると思います。」

し「リビジョンが変わるのは想像がつくですけどね、マイナーの話は全然出てこないんで。」

チ「そうね、マイナーとか、まそうね、可能性はあるかもしれないですね。」

し「アップデートに関しては非常に気になる。」

し「確かに、マイナーとかはどこかでリリースするかもってどこかで見たと思うんですけど。」

チ「そう、あの、そう、マイナーとかは必要であれば、その都度リリースしますみたいな記述は間違いなくあったと思います。」

チ「もしかしたら5.1というかちょくちょくでる可能性はあると思います。」

し「その辺りで、正直LTSになって欲しかったんですけど。」

チ「まぁ、そういう感じではありますね。1年というのは、長い感じはありますけどもね。」

チ「みなさんが.NET 5が出た中で、実際にどのバージョンを、もちろん試したりするんだったら5を使ってガンガン使っていただいて構わないんですけど、実際のプロダクション環境でどのバージョンを選ぶかは結構悩まれる方も多いもしれないですね。」

チ「いろいろ、会社を含めて、LTSだってのを重視される方は3.1のまま、しばらくは本番環境は3.1になるとは思いますけど。」

チ「さっき、楽屋裏でも話していましたけど、やっぱり最新のを常にバージョンアップをしていく流れの中で、CI、CD、自動化のパイプラインを作ってビルドテスト含めて組んでいけば、最小の変更だけで、常に最新のものが使える。それはそれですごいメリットではあると思う。」

チ「実際、みなさんがどういう選択をするのか、プロジェクトのリクワイアメントにもよってくる部分もあると思いますけども。」

チ「やはり、そういうなんで今のトレンドじゃ、んで、CI、CD、DevOpsみたいな話が出ているかというと、そういったところで常に最新のを使って最新のパッチ当たって、セキュアであって、そういったライブラリ、パフォーマンスの面も含めたところも向上されている。」

チ「そういったところをしっかりメリットと捉えて、まぁLTSは関係なく、アップデートがあれば、すぐにアップデート当てられる。」

チ「少ない変更で、すぐアップデートができるような環境を整えるのも、1つの今の開発環境を整えるのも大事だと思う。」

チ「そういったことをみなさん考えていって、環境を整えていってだいただけるといいのかなと思いますね。」

し「なんかもう締めに向かって話している。」

チ「だって、大事なところですから。」

し「すごい重要ですよね。」

し「なんだかんだLTSを選ぶイコール3年間はまぁあんま面倒見ませんみたいな。」

チ「塩漬け。」

し「感じがしちゃうんで。」

し「新しいものはそれなりにいろんな機能が入ってくるで、その辺楽しんでこうアップデートできるぐらいの方がいい。」

チ「仮に3.1のままいって、6がでてアップデートしようとした時の変更点を考えるとやっぱりすこしずつアップデートしていった方が、私は今の状況を見ると楽かなと思うんです。」

ま「3.1から6には一気にはアップデートには大変な部分があるとおもうから、1回5にアップデートしてから6にあげるというステップがあると思う。」

し「そこもアップグレードのドキュメントも、1個ずつしか書いてない。 3.0 to3.1、3.1 to 5.0。」

チ「そうだよね。」

し「基本的に一足飛びにに、例えば2.0から5.0に行きますという都合のいいドキュメントは世の中には存在しないですよね。」

し「地道に1つずつ、この時期にやった方がいい。」

し「2.1で塩漬けしてたら、5.0に追いつくためには、ここのステップ(2.1 to 2.2、2.2 to 3.0、3.0 to 3.1、3.1 to 5.0)からやると。」

チ「大変ですね。」

み「そうそうそう。」

し「それは正直大変です。」

し「だいたいそういう風に塩漬けしちゃうプロジェクトだとCIとかもちゃんとテストとかも、たぶん回せない。」

チ「回ってない、回ってないときもありますよ。」

し「そういう時に一足飛びにやるというのはかなりリスクになっちゃいますよね。」

し「こまめににアップデートで、楽しくやっていけたらいいなと思うんですよね。」

チ「開発エンジニアとしては、やっぱり最新のものを使いたいと思いませんかね、みなさん。」

し「趣味プログラミングだとホント、普通に最新をやりたいんですけど、業務だとちょっと難しい部分がありますよね。」

し「でもruntimeに関しては、僕は基本、最新を使うし。」

チ「最新ですね。まぁ大事だな。今の流れだと特に大事だと思いますね。」

ま「結構Azureとかも.NETのアップデートにリアルタイムじゃないけど、結構近いタイミングでアップデート入って最新のランタイムが動作するというのいいですよね。」

チ「今回のAzure App Service早く来ましたよね。」

し「今回は、そういう謎テクロジーが導入されて。」

一同 (爆笑)

チ「謎テクノロジーって。」

し「謎テクノロジーです。完全に。」

し「Early Access Runtime という。」

チ「たしかにすぐ分かるからね。」

し「ちょっとこの辺りブログ に書いたんで、適当に見てもらえればいいです。」

し「なんか入ってないランタイムをアプリケーションの起動時というか初期化時に自動的にいれちゃうという。」

し「なかなか過激な実装だなと思う。」

チ「すごい。」

し「平均でなんか30秒くらいで終わるようなみたいなこと言ってたんですけど、僕が試した時には1分ぐらいかかってましたね。」

し「ちょっとまぁ不安なんですが、最初の1回だけなんで全然いいかなと。」

し「まぁこれぐらいだと、Azure App Serviceってだいたい2ヶ月に1回OSのリイメージ、クラウドサービスのOSのアップデート入ってるんで、だいたいそこのタイミングまで待たないといけなかったんですけど、Early Access Runtimeだと実行時に入れちゃうんで、他の環境に影響でないです。だから素早くできる。」

し「僕も今いくつかプロジェクトを持ってますけど、速攻で5.0への対応を入れてます。もう、あとリリース待つみたいな。」

み「すげー」

し「はい、もうそれ、Eacly Accessです。」

ま「Early Access RutimeってAuzre App Serviceのサービスプランの種類の制限とかあるんですか?フリーがダメとか。」

し「種類はなかったです。たしか。」

し「すべてのパブリックリージョンのすべてで使えるみたいなことが書いてあったと思う。」

し「でもちょっとフリーは分からないですね。」

し「Windowsはちょっと特殊なんですが、Linuxの方は、ベースのDocker imageがキャシュされていないってだけなんで。」

し「今回、5.0のDocker imageはだいぶ小さくなったって言ってるんで、全然影響ないんじゃないかなっていう印象ですね。この辺りは普通に使って。」

し「だんだんアップデートできない理由がAzure App Serviceの対応待ちみたいになっている。」

チ「うんうん、ありますねー。」

し「チャットとか見てると、結構業務の闇が。」

し「VBの話、今回全くしなかったんです。」

チ「昨日、一昨日とお客さん先のセミナーで.NET アップデートみたいな話を2時間ぐらいしてたんですけど、その時の質問でやっぱりVBの話が出ましたね。」

チ「みなさんなんだかんだで、今C#ばっかりなんで、実際VBどうなのなのと言われて、うんそうだよねーって思って、ちょっと答えたんですけど。」

し「一応、VBはもう新機能が足されない、追加しないというのは発表されてましたよね。」

チ「言語仕様、言語的にはそうですね。基本的にはプライマリー言語としては、C#ですよね。」

チ「プロジェクトとしてはVBは.NET 5のSDKで、ちゃんと、WinFroms、WPFとかのプロジェクトはVBでも作れるようになってますけど。」

チ「まぁこれから今から新規にとか作っていくのにどの言語を選ぶかって言ったらほぼC#一択だと思いますね。現状、正直なところ。」

し「一応今回、F# 5もリリースはされているですが、ちょっとあのまぁ気軽にそこを言えない。」

し「知識がない人間が偉そうに言うのも全然良くないと思うんで。」

し「なんで、今はC#とF#の2つって感じですよね。」

チ「一応VBも使えますが、そういう状況ですということを把握した上で、VBの既存のVB.NETみたいなコードがあって、まぁそれを上手く使ってまだやりたいっていうケースはもちろんVBでそういうWPFだ、WinFormsだという特にそういうニーズはあるかもしれないですね。」

チ「WinFormsだったら結構あるかもしれないですけど、移行は可能ではあります。」

チ「新規になんかを作ろうとしたら、もちろん.NET 5ベースでWinForms、WPFを選んでくれていんですけど、ただ言語はC#にしておいた方がたぶんいいですね。」

チ「今回のC# 9も含めてやっぱり言語仕様的なところでもいろいろ日々改善が加えられ、新機能も入ってきているので。そういったところを考えるとC#がいいと思います。」

し「ちょっと質問で、Azure App Serivceに.NET 5が来た時に、Early Access Runtimeってどうなるんだろうというのがあったんですが、それは、勝手にEarly Access Runtimeではなくなります。」

チ「うん。」

し「だから気にしなくていいんですね。」

し「OS側にインストールされたら、プリインストール状態のままになるんです。」

し「なので設定しておけば勝手にコールドを使ったらパフォマーンスがよくなる話。」

ま「デプロイのし直しとかしなくていいんですね?」

し「いらないです。いらないです。勝手に。Azure App Serviceって常になんだかんだで、インスタンスって変わってるんで、1ヶ月に10回ぐらい変わったときもあった。」

さ「.NET 5 RCのころに、self-containedであげたんですけど、self-containedじゃないほうがいいとかその辺の違いってどういう風に考えたらいいのか。」

し「self-containedは、ASP.NETだとどのくらいだろ、100MBぐらいになります?ならないですよね。」

さ「60~70MBとか。」

し「そうですよね。そいつらをマウントして、ライブラリを全部読み込んでっていうところのAzure App SeriveってI/Oが遅いんですよ。読み込むファイル数は明らかに減らした方がいいんで。」

し「今回、Early Access Runtimeを使えるようになったタイミングなので、そこでself-containedのまま、Early Access Runtimeを有効にしても、self-containedそのまま動くんで、そのあとデプロイしなおして上げればいいかなと思う。」

し「いい感じに残り2分となってので、最後のスライドに。」

今後開催される .NET Conf 関連イベント

し「今日は、平日のよるに長いイベントにみなさん参加頂いて、ありがとうございます。」

し「今後、僕らは、.NET Confが終わってすぐ、.NETが好きな人間が自分が好きなことをしゃべっていたんですが、今後いろんなイベントが開催される予定です。」

し「直近だと今月27日にC# Tokyoというコミュニティーでリリース記念のイベントがあります。」

し「来月、12/05にVisual Studio Users Community Japanのイベントで、ここであの@ufcppさん、C#でググれの人がC#9について話してくれます。ディープな話が 聞けると思うので見逃せない。」

し「12/19の.NET 技術セミナーは、IoT ALGYANですかね、チャックさんが.NETについていろいろしゃべる予定になています。」

し「これらのイベントとか、ブログとかTwitterとかいろいろ、とさらに個人とかYoutubeとか配信とかあると思うんですが、こういったものをいろいろ参加して、さらに.NETを楽しく勉強して使っていければいいなと思います。」

し「それのキックオフみたいな感じで、この会が役になってもらえば、今回行った甲斐があったなと思います。」

し「イベントとしてはこれで以上になります。」

チ「こういうトーク面白いですよね。今まであまりこういう形でやってなかったんですけど、なんかこういうラフにこういう話をして、.NET周りのアップデートが知れるといのは、みなさんとしても結構面白かったんじゃないかーっていう。」

チ「参加してる側もなんか普通に気楽にいろいろあーだ、こーだー喋ってる。勉強になるところもたくさんありました。」

チ「なんか定期にこういう感じでフリートークやるのも面白かなとちょっと思っちゃいましたね。」

し「.NET 5リリース記念パーティートークは以上になります。Youtubeで参加されてたみなさん、あとスピーカのみなさん、今日はありがとうございました。」

資料

感想

機能内容や背景、目指すものものなどを含めての話だったので、大変興味深く視聴させてもらいました。
ちょくちょく小ネタが入ってきて面白かったです。
ドキュメントもどういったものがあるのか、新機能や非互換情報をどうやってたどればいいのかと、.NETの地図を手にいれたような感じです。
.NET、Azureは疎いので、文字起こしするには、用語、略語が厳しい。。。(もうやらない。)

Git for Windowsで.gitconfigにバージョン情報を管理せずに自動更新を有効にする

Git自動更新
Git自動更新

やりたいこと

Git for Windowsの自動更新]有効にしていると定期的にバージョンをチェックしてアップデートしてくれる。
ただ、.gitconfigのwinUpdateセクションに使用しているバージョンが書かれてしまう。
dotfileをGitで管理して、共通に使用している。 環境、OSごとに.gitconfigの設定を切り替えたい のように、.gitconfigには、LinuxWindows共通の設定だけを書いているので、.gitconfigにはバージョン情報を管理したくない。
また、Windowsも複数台あるので、.gitconfigに持ってしまうと、更新したマシン以外では、実際に使用しているバージョンとずれてしまう。

解決方法

"$HOME"/.gitconfigの代わりに "$HOME"/.git-for-windows-updater にwinUpdaterセクションを設定する。

[winUpdater]
        recentlySeenVersion = 2.27.0.windows.1

インストーラは、このファイルのバージョンを書き換えてくれないので、インストール後に以下で書き換える。

    git config -f "$HOME"/.git-for-windows-updater winUpdater.recentlySeenVersion `git --version|awk 'BEGIN{FS=" "}{print $3}'`

これで、.gitconfig以外にWindowsのPCごとにバージョン情報をもって、自動更新ができる。

参照

/optにインストールしてsudo sdkでパッケージ管理したい

f:id:orangeclover:20191208224339p:plain

やりたいこと

  • apt、yumのパッケージ管理と同じように、インストール、アンインストールはroot権限で実行する
  • /opt/sdkmanにインストールして、複数ユーザーで共有する (/optは755)
  • インストールしたパッケージは一般ユーザーで使用できる

sdkmanのインストール

まずは、sdkmanで/opt/sdkmanにインストールする。

export SDKMAN_DIR="/opt/sdkman" && curl -s "https://get.sdkman.io" | sudo -E bash
  • 結果
 Please open a new terminal, or run the following in the existing one:
 
     source "/opt/sdkman/bin/sdkman-init.sh"
 
 Then issue the following command:
 
     sdk help
 
 Enjoy!!!

トラブルシューティング

sdk: コマンドが見つかりません

  • 現象
$ sudo sdk install java 11.0.5-opensudo sdk install java 11.0.5-open
sudo: sdk: コマンドが見つかりません
  • 原因
$ type sdk|head -2
sdk は関数です
sdk () 

sdkはコマンドでもシェルでもなく、組み込みの関数なのでsudoできない

  • 対処
    functionを引き継いで実行する
function sdkx { 
    sudo bash -c "$(declare -f sdk);sdk $*";
}

___sdkman_check_candidates_cache: コマンドが見つかりません

  • 現象
$ sudox sdk install java 11.0.5-open
environment: 行 40: ___sdkman_check_candidates_cache: コマンドが見つかりません
  • 原因
$ rg  ___sdkman_check_candidates_cache /opt/sdkman/
/opt/sdkman/src/sdkman-main.sh
55:             ___sdkman_check_candidates_cache "$SDKMAN_CANDIDATES_CACHE" || return 1

/opt/sdkman/src/sdkman-cache.sh
19:function ___sdkman_check_candidates_cache {

sdk()は呼べるけど、そこから呼んでいる___sdkman_check_candidates_cache()が呼べない。

  • 対処
    全関数を引き継いで実行する
function sdkx {
    sudo bash -c "$(`declare -F`);sdk $*"; 
}

引数リストが長すぎます

  • 現象
$ sdkx install java 11.0.5-open
bash: /usr/bin/sudo: 引数リストが長すぎます
  • 原因
    .bashrcに関数を定義してるから、declare -f funcが大量に実行されるから 制限に引っかかってしまう

  • 対処
    sdk関連の関数だけ抽出して引き継いで実行する

function sdkx {
    sudo bash -c "$(`declare -F|grep sdk`);sdk $*"
}

expected a proper numerical parameter

  • 現象
$ sdkx install java 11.0.5-open
curl: option --connect-timeout: expected a proper numerical parameter
curl: try 'curl --help' or 'curl --manual' for more information
curl: option --connect-timeout: expected a proper numerical parameter
curl: try 'curl --help' or 'curl --manual' for more information
==== INTERNET NOT REACHABLE! ===================================================

 Some functionality is disabled or only partially available.
 If this persists, please enable the offline mode:

   $ sdk offline

================================================================================

Invalid command: install

Usage: sdk <command> [candidate] [version]
       sdk offline <enable|disable>

   commands:
       install   or i    <candidate> [version] [local-path]
       uninstall or rm   <candidate> <version>
       list      or ls   [candidate]
       use       or u    <candidate> <version>
       default   or d    <candidate> [version]
       current   or c    [candidate]
       upgrade   or ug   [candidate]
       version   or v
       broadcast or b
       help      or h
       offline           [enable|disable]
       selfupdate        [force]
       update
       flush             <broadcast|archives|temp>

   candidate  :  the SDK to install: groovy, scala, grails, gradle, kotlin, etc.
                 use list command for comprehensive list of candidates
                 eg: $ sdk list
   version    :  where optional, defaults to latest stable if not provided
                 eg: $ sdk install groovy
   local-path :  optional path to an existing local installation
                 eg: $ sdk install groovy 2.4.13-local /opt/groovy-2.4.13


Stop! java is not a valid candidate.
  • 原因
orangeclover@ponkan ~ 
$ rg connect-timeout /opt/sdkman/
/opt/sdkman/src/sdkman-utils.sh
71:             curl --insecure --silent --location --connect-timeout ${sdkman_curl_connect_timeout} --max-time ${sdkman_curl_max_time} "$1"
73:             curl --silent --location --connect-timeout ${sdkman_curl_connect_timeout} --max-time ${sdkman_curl_max_time} "$1"

/opt/sdkman/bin/sdkman-init.sh
97:# set curl connect-timeout and max-time

環境変数が引き継がれていない

  • 対処
    sudo -E で環境変数sdk関連の関数だけ抽出して引き継いで実行する
function sdkx {
    sudo -E bash -c "$(`declare -F|grep sdk`);sdk $*";
}

expected a proper numerical parameter(エラーが変わらず)

  • 現象
orangeclover@ponkan ~ 
$ sdkx install java 11.0.5-open
curl: option --connect-timeout: expected a proper numerical parameter
curl: try 'curl --help' or 'curl --manual' for more information
curl: option --connect-timeout: expected a proper numerical parameter
curl: try 'curl --help' or 'curl --manual' for more information
==== INTERNET NOT REACHABLE! ===================================================

 Some functionality is disabled or only partially available.
 If this persists, please enable the offline mode:

   $ sdk offline

================================================================================
  • 原因
orangeclover@ponkan ~ 
$ rg sdkman_curl_connect_timeout /opt/sdkman
/opt/sdkman/etc/config
4:sdkman_curl_connect_timeout=7

/opt/sdkman/bin/sdkman-init.sh
98:if [[ -z "$sdkman_curl_connect_timeout" ]]; then sdkman_curl_connect_timeout=7; fi

/opt/sdkman/src/sdkman-utils.sh
71:             curl --insecure --silent --location --connect-timeout ${sdkman_curl_connect_timeout} --max-time ${sdkman_curl_max_time} "$1"
73:             curl --silent --location --connect-timeout ${sdkman_curl_connect_timeout} --max-time ${sdkman_curl_max_time} "$1"

sdkman_curl_connect_timeoutは環境変数じゃなくて、ロカール変数かグローバル変数か。

  • 対処
    変数をexport する?環境変数にはしたくないな。 組み込みコマンドのdeclareが実行できるんだからsource sdkman-init.shを実行すればいいのか。
function sdkx {
    sudo -E bash -c "source $SDKMAN_DIR/bin/sdkman-init.sh;sdk $*"
}

これでインストールできた!!

一般ユーザーで実行すると「許可がありません」

  • 現象
orangeclover@ponkan ~/
$ sdk list java
tee: /opt/sdkman/var/version: 許可がありません
tee: /opt/sdkman/var/broadcast_id: 許可がありません
tee: /opt/sdkman/var/broadcast: 許可がありません
  • 原因
    /opt/sdkman/var配下の書き込み処理がある

  • 対処

sudo chmod +g,o+w /opt/sdkman/var/

まとめ

  1. 以下でsdkmanのインストール
export SDKMAN_DIR="/opt/sdkman" && curl -s "https://get.sdkman.io" | sudo -E bash
  1. 以下の権限を変更する
sudo chmod +g,o+w /opt/sdkman/var/
  1. 以下でパッケージ管理を行う
function sdkx {
    sudo -E bash -c "source $SDKMAN_DIR/bin/sdkman-init.sh;sdk $*"
}
  • 使い分け
    install、uninstall、default、upgrade、selfupdateはsdkx
    use、current、version、helpはsdk

残課題

  • flush、offline、broadcastはsdkで一般ユーザーで実行できてしまう
    flushは/opt/sdkman/var配下のファイルを再作成するので、再度アクセス権変更が必要になる

KanJava 10th Anniversary Party 参加してきました #kanjava #mixleap #mixleapなう

f:id:orangeclover:20191130123542j:plain

Mix Leapについて

https://yahoo-osaka.connpass.com/
ヤフー大阪オフィスで、毎週勉強会を開催してるコミュニティ。
関西圏のクリエイター(エンジニア・デザイナー)の成長を目的にしたるのでジャンルは幅広そう。
https://yahoo-osaka.connpass.com/

毎週開催してるのはすごいな。






関ジャバ10周年について

阪田 浩一(じゅくちょー) @jyukutyo

まじめなcero_tさんからの返信コメントとkiy0takaさんの3人から始まった。
その二人は東京、名古屋へと関西を離れてしまったが、他のメンバーも加わり
Javaとそれに関係する勉強会を10年続けてきた。

何はともあれ、10周年おめでとうございます!!!






モデリングのきほん

いろふ @irof
f:id:orangeclover:20191202233703j:plain

資料





自分の理解を独自モデリングしてみた。
f:id:orangeclover:20191202231243p:plain

感想

タイトルとから、勝手にドメインモデルとかクラス図とかそういう話が出てくるのだと想像してた。 モデリングとはなんぞやというメタなモデリングだった。モデリングをそういうふうに考えたことがなくて これ聞けてよかった。こういうのを視座が高くなったというのだろうか。





JVMJITコンパイラにダイブする

阪田 浩一(じゅくちょー) @jyukutyo
f:id:orangeclover:20191202234523j:plain

資料

JITコンパイル

  • JVMでのJITコンパラの仕組み。地獄の13階層の1階層目ぐらいでみんな楽しめるよ!
  • 一番最初の処理はインタプリタで実行する
  • アプリケーション実行中は、プロファイルで、実行ルート、実行状態にあわせた効率の良い機械語を生成し、コードキャッシュする
  • JITコンパイル自体もリソースを消費するので、頻繁に使う(HotSpot)コードだけを機械語にする
  • コンパイル時間と速いコードのトレードオフになる
    • C1 コンパイル時間は短く、ほどほどの速度のものを生成する
    • C2 コンパイル時間は長いけど、速いものを生成する
  • Java SE 8からTierd Complicationがはいったので、今は「-server」、「-client」の指定は不要で、JVMがC1とC2の両方を自動的に使い分ける
  • プロファイリング自体にもオーバーヘッドがある。
  • IR:コードをデータ構造で表現できる
  • 最適化、脱最適化
    • 今までと違う条件、処理が走ると脱最適化でインタプリタに戻る
    • プロファイルによってより上のレベルで再コンパイルされる
    • level0からlevel4をいったり来たりすることも

オプション

  • JITの最適化レベルを見るには-、XX:PrintCompilaton
  • JITが生成するアセンブリコードを見るには、-XX:+PrintAssembly -XX:+UnlockDiagnosticVMOptions

ツール

みなさんがやること

  • javavpを実行したことがない人はjavap
  • HSDISをビルドして、JITWatchで見ること

Q&A

  • Q.JVMの気持ちになったコードを書くには?
  • A.JVMの最適化を意識したコードを書いてはいけない! バージョンアップで最適化の仕組みが変わったら使えなくなるから。

感想

明日から、潜れ!と言われて、ダイビングスクールに来てみたら、酸素ボンベという便利なものがあると教えられ、これなら生き残れるかも!?と救いがすこし見えた気分。
気分だけなので、実際には溺れるんだろうけれども。
もし13階層目をやるなら低レイヤーな集まりの カーネル/VM探検隊 だろうか。






Kubernetesを導入して1年間本番運用した話

kiy0taka @kiy0taka f:id:orangeclover:20191202233732j:plain

資料

docs.google.com

メモ

  • 送信元IPがLBになってしまう原因は?X-Fowarded-Forを付け忘れている?どこで?

    • tcpdumpでネットワークが調べられるとインフラエンジニアっぽい、インフラエンジニアとしても一人前になった
  • k8s完全に理解した

  • 山ごもり制度

    • 年1で9連休とらないとならない。休み中は社内人へ連絡もも社内からも連絡をとってはならない
    • 属人製をとりのぞくため
  • 山ごもり制度をとった瞬間、大規模障害

    • クラスタがいきなり落ちた
    • システムからのアラートなので、人からの連絡ではないのでギリセーフ
  • 新しいクラスタを作って全部移動

    • 原因不明
    • 避難訓練的なことをしてなかった。バックアップはしっかりとってあった。
  • 新たな障害:帰ってこないノード@朝の5時
    →なんやかんやで復旧

  • k8sやめる?

    • 実績あるIaaSなら起きなかったかも
    • k8sで構築したサービスを理解しているメンバーがいない
  • でも、やめない 『「便利」も大事。「面白い」も大事。でも、どちらかなら必ず「面白い」を選ぶ。』という会社だから

  • Google Cloud Shell(無料)が便利

    • スマホでも使える。MacBookを持ち運ばず、Pixel+携帯キーボードでいつでもどこでも障害対応できる

Q&A

  • Q.基盤のアップデートをどうしている?
  • A.月1回か2ヶ月に1回アップデートしてる

  • Q.属人化の解決は?

  • A.事業部から会社になったが、人は増えてない。 人を増やすしかないので採用がんばってます。

  • Q.負荷対策は?

  • A.真ん中のPod対応で、Kubernetesの標準のでAutoScaleの設定にしている。
    アップデートするときに、新たなコンテナが立ち上がってるときぐらい

  • Q.スケールしてもログは見れる?

  • A.ファイルサーバにログを書いている

感想

サウナの話から始まったから、サウナー向けのサービスをKubernetesで運用したのかと思ったけど違った。
まじめな業務の話だった。
詳細なところを抑えてるのが一人で、Pixel+携帯キーボードでいつでもどこでも障害対応は嫌だな。
tcpdumpでとったキャプチャは、Wireshark か、 もし、ターミナルしか使えないという制約があるなら、Termshark 使うと幸せになれると思う。 『「便利」も大事。「面白い」も大事。でも、どちらかなら必ず「面白い」を選ぶ。』っていいですね。







DIコンテナ入門(裏面)

うらがみ @backpaper0
本人の写真はNG

資料

https://backpaper0.github.io/ghosts/bytecode-enhance/#1

クラスファイルの構造

  • constant_pool 呼び出すクラス名、呼び出すメソッド名、文字列リテラルなどの配列
  • constant_poolの配列の添字でメソッドを呼び出す

javapでバイトコード

  • aload:局所変数から参照値を取り出してスタックに積む
  • aload_0:thisをスタックに積む
  • clacの例
    • iload_1:1つ目のintのローカル変数をスタックに積む
    • iload_2:2つ目のintのローカル変数をスタックに積む
    • iadd:スタックから取りだした1番目の値に2番目の値を加え、スタックに積む。
    • iretrun:スタックのint値を戻り値にする
    • こう言われると足し算してるのがわかりますよね

バイトコードをエンハンスする方法

-すでにあるバイトコードを改変するのではなくサブクラスを書き出す方式 - DIコンテナで採用が多い - Instrumentation APIを使用してバイトコードを改変する - JMockitで採用 - https://docs.oracle.com/javase/jp/8/docs/api/java/lang/instrument/Instrumentation.html - 動的にバイトコードを弄るので「黒魔術」

スコープとプロキシ

  • Seasar2では自身よりも狭いスコープのコンポーネントをインジェクションできなかった
  • SpringやCDIなどのモダンなDIコンテナはProxyによってスコープに関係なくインジェクションできる

Proxyをインスタンス化する場合、コンスタラクタには何を渡せば良いのだろうか?

  • 何も渡さない
    ずるい!!どんだけブレークポイント設定したと思ってるんだ!!
  • シリアライズではコンストラクタは呼ばれない。その仕組みを使用してる
  • Objenesis:やばい方法、脱法。

Q&A

感想

裏面(りめん)うらがみさんの真骨頂?、黒魔術の解説。
デシリアアライズしたときにコンストラクタ呼ばれないなんてどういう契機に知るんだろう。 Q&Aの回答で、「知識と観察と発想」とさらりと決める。カッコいい。





ドキッ!失敗だらけのシステム開発!!

こざけ https://twitter.com/s_kozake:title=@s_kozake
f:id:orangeclover:20191202233737j:plain

発表資料は、盛っている持っている可能性あり

どんなシステムを開発してるか

入力チェックの役割

  • データの整合性

    • ゴミを入れるとゴミが出てくる
  • ユーザビリティ

    • 操作ガイドを兼ねる
    • 適切なエラーメッセージで操作を導く

画面のレンダリングが遅い

締め

f:id:orangeclover:20191202233810p:plain

感想

失敗がテーマの発表で、最後の締めのスライドで失敗するというすごいオチ。
笑かしてもらった。 仕込みではなく天然らしい。愛されるキャラだわ。職場では知らんけど。






DAPRを動かしてみた話

せろ @cero_t f:id:orangeclover:20191202233741j:plain

資料

dapr

  • dapr:ダッパー
  • フレームワーク疲れ
  • サイドカーなのかビルディングブロックなのか
  • ステート管理
  • Pub/Subの非同期
  • 分散トレーシング
    • Zipkin
    • x-correlation-id
  • アプリとインフラが充分に分離されてたら統制とらなくていい
  • ジョークがクール
    • 他の登壇者「すべった?」cero_t「滑ってないよ」

感想

daprの機能は盛りだくさん。 サイドカー?ビルディングブロック?まずはそこからの状態なので、daprの売りが全然つかめていない。 スベリ芸は初めて見た。こういう雰囲気なのね。

全体の感想

第1回プログラミングGroovy勉強会(大阪) のまとめ第1回「Play framework勉強会」IN 関西で大阪の勉強会に参加したことはあるけど、関ジャバは初めて。
わざわざ静岡から行ったかいがあった。(嘘です。前日に神戸に用事があったので参加できた。)
一番遠くからの参加かなと思ったけど、どうやら違ったようだ。
@YujiSoftware よし、大阪に着いたどれ、関東の技術者の実力を大阪勢に思い知らせてやるわ〜ww #kanjava

関ジャバの人って、技術的な「面白さ」と笑いの「面白さ」と両方を詰め込んで発表している印象。
なので、非常に面白かったし、参加できてよかった。
終わったら、時間的に帰らないとならないのが残念だった。

togetter & 他の感想ブログ

JJUG CCC 2019 Fallに参加してきました #jjug_ccc

JJUG CCC 2019 Fall
JJUG CCC 2019 Fall





10:00-10:45 Head toward Java 13 and Java 14 #ccc_c1

LINE Corporation KUBOTA Yuji @sugarlife
写真撮り忘れた・・・

java 13

  • JEP 350:Dynamic CDS Archives

  Class Data Sharing。共通的なクラスや文字列などを複数プロセスで共有する機能。
  アプリケーション実行終了時にロードしたクラスを動的にアーカイブする
  異常系も含めて全パターンを網羅しておく必要がある。
  きしださんの「Javaの起動時間といかに戦うか」で、でてきたやつだ。

  • JEP 354 Switch Expressions(Preview)

  Switch文は、break、Switch式はyeild。
  breakからyieldに変わり見分けがつくようになった。
  他の言語だと遅延評価になるものあるが、Javaに関しては遅延評価ではない。即、値を返す。

  待望のヒアドキュメント
  stripIndentの動作は、え?あれ???と思った。

java 14

  • JEP 358 Helpful NullPointerExecptions

  a[i][j][k] = b.l のようなのでも、どこでnullが発生したのかを明確にメッセージがでるようになった。

  • JEP 359: Records(Preiew)

  乱暴に言うと構造化されたtuplesのようなもの
  Interface、Class、 recordの並びにくるもの

  • JEP 361 Switch Expressions(Standard)

  標準機能へ。現時点では大きな変更点はない。

OpenJDK Forks

  Eclipse OpenJ9のJDK部分、AdoptOpenJDK、Red Hat OpenJDK、CentOS、Shenandoahプロジェクト、Red Hat、icedtea、ubuntu、しっかりOpenJDKの本家に追随しいてることを確認できた。(Amazonは知りません。)

感想

いよいよJavaでもヒアドキュメントが使えるようになる!
けど、  "JJUG¥nCCC¥n"になるのはどれでしょう?を見事に間違えた。
stripIndentの動作を理解してないので、試してみよう。
補足をブログで書いてくれると言ってた気がするが、どこ見ればいんだろう?
sugarlife's blogLINE Engineering





11:00-11:45 Jakarta EE: Today and Tomorrow #ccc_i2

Oracle  Dmitry Kornilov @m0mus

Jakarta EE 8

  • release

https://jakarta.ee/release/

  • 仕様書

  https://jakarta.ee/specifications

  • 実装したプロダクト

  https://jakarta.ee/compatibility/

Jkarta EE 9の計画

  • 2019/12/9までにデリバリー計画が提出される
  • 仕様書の更新
  • javax.*からjakarta.* package名の変更

  Bigbang or Incrementalはまだ決まってない

  • Minimum Java SE version

  8 or 11はまだ決まってない

  • いくつかの仕様が非推奨になる
  • 新しい仕様は加えない

  例外としてJava SE 8から取り除かれた仕様

感想

Jakarta EE 8、Jakarta EE 9ともに新機能がないし、9の計画もまだだし、Jakarta EEの話を 聞くタイミングとしては寂しい時だったかな。
Jakarta EE 9でも、Java SE 8が最低バージョンになる可能性があるんだ。そこは11に上がるもんだと 思っていた。

13:30-14:15 運用を支えるためのログを出すにはどうするか? #ccc_m3

齋藤将也 https://twitter.com/wreulicke:title=@wreulicke
f:id:orangeclover:20191126232802j:plain

適切な量

  • ログは保持、検索コストが高いので、多すぎず、少なすぎず
  • INFOレベル以上で
  • 必要なところに仕込む
    • good
      • システム間通信のリクエスト、レスポンス
      • 業務の関心ごとの対する重要な変更   例えば決済サービスならその決済がどうなったか
    • 重要なロジックの分岐点やその分岐に至った条件

    • bad

      • 関数の入り口
      • AOPで出すと多くなりすぎるし、AOPだけだと業務観点が不足する

意図の伝わる内容

いつ、誰が、どこで、何を どういう動作を行ったか その時のシステムの状態

アプリケーションの特性、要件、コンテキストに併せて、トラブルシューティングに必要な情報

  • どのように対処するかも書くと良い
  • 横通しで検索できる情報

例えば、トランザクションに紐づくID としてリクエストIDを出す 最初のServletFilterでMapped Diganostic Contextを使って付与する レスポンスにもリクエストIDも含める

検索しやすいログ形式

エラーログだけ、特定のAPIのログだけ、1トランザクションのログだけを検索しやすい

より良くするために

感想

トラブルシューティングしてると、どうでもいいログはたくさん出てるのに 肝心なところでなぜ出さない!と思うことが多々ある。
自分で痛い目に合うと気をつけるだけど、痛い目に合わないために、ログのポイントをプロジェクトで 認識を合わせたほうがいい。
盲信せず、議論のたたき台としてはいいんじゃなかろうか。







14:30-15:15 CLRのValueTypeを起点にProject Valhallaを覗いてみる #ccc_c4

日本マイクロソフト株式会社 西川彰
f:id:orangeclover:20191126232826j:plain

値型

  • メリット

    • 間接参照ではないため、メンバーアクセスが高速
    • スタックを使うので、メモリ確保が速い
    • CPU近傍にデータを配置できる(可能性がある)
    • GCの影響を受けない
  • デメリット

    • 代入時には値の複製が生じる
    • 型のサイズが大きいとき、複数のコストが大きい
    • 継承や多態的な振る舞いを実装できない

Value Type(Inline Class)

  • 「class」と同じように「inline classs」で記述できる

  みんな大好きjavapすると見慣れないdefaultvalue、withfieldという新たなバイトコードを確認できる

  • Object Identityを持たないので最適化しやすい

  できるだけまとめて、CPUの近くのキャッシュに置きたい

  • Javaが.NETの知見を取り込んでValueTypeを検討してる

  例えば、ユーザー定義のデフォルト値は許可しない

マイルストーン

  プロトタイプの開発、検証を繰り返しているため

  • 今は、JDK14ベースのものなら遊べる

いつでるの?

次のLTS(Java 17)は難しそう、次の次のLTS(Java 23)ならどうにかなるかも!?

感想

先はまだまだ長そうだ。 デメリットよりもメリットを享受できるのはどのようなプロダクトだろう? .NETにも興味をもっと持ってみよう。
C# 8.0のnull許容参照型を学ぶならこれがよさそう。
https://www.slideshare.net/ufcpp/c-80-null
西川さんってマイクロソフトの人になってたのか。





15:45-16:30 Javaの起動速度といかに戦うか #ccc_g5

LINE Fukuoka きしだ なおき @kis

起動速度を求める理由

アプリケーションサーバであれば、起動しっぱなしだったので起動速度は求められなかった。 しかし、マクロサービスでの負荷に合わせた伸縮やサーバーレスでの使われ方だと起動速度が 重要になる。

アプローチ

  • 使いまわす
    • JITのためのプロファイル
      • Alibaba Dragonwell -JWarmup
    • JIT結果
      • OpenJ9
      • Azul Zing - Falcon JIT
  • あらかじめ行っておく

GraalVM

  • GraalVMの話のときは、JIT版なのか、AOT版なのかを区別しないと話が噛み合わなくなるので注意が必要。

まとめ

  • 起動時間、メモリの削減でNative imageが圧倒的に速いし注目されているが、まだ安定していない。
  • トレードオフとして、スループットの劣化、変更しやすさ、使いやすさを失ってしまう。
  • Javaに入っている標準機能でもある程度起動速度とメモリも削減できるので、こちらに着目してもいいのではないか

感想

Java 8と比較して、Java 13で起動速度早くなってるのね。 App CDSでさらに速くできる。 native imageはトレードオフとの兼ね合いだとなるので、当面使う場面には出くわさなさそうだ。





16:45-17:30 多言語対応の仮想マシンGraalVMが照らす未来 #ccc_i6

ヤフー株式会社 阪田浩一 @jyukutyo
f:id:orangeclover:20191126232851j:plain

GraalVMとは

  • あらゆる言語の実行環境となれる能力と機能があるユニバーサルVM
  • ビジョン:パフォーマンスを犠牲にせず、言語間の抽象化をする

GraalVMの構成

f:id:orangeclover:20191126232352p:plain GraalVM JITコンパイラ(以前はここをGraalと言っていた) 以前、GraalとGraalVMってどういう関係だっけ??混乱してた。

GraalVMで動作する言語

f:id:orangeclover:20191126232512p:plain

そうそうこのイメージ。

ネイティブイメージの生成

なんでネイティブイメージの生成が出てきのか? それは、Oracle Databaseのため。 GraalVMを組み込めば、Javaはもちろん他の言語も使える。 が、そのまま組み込むにはJVMのサイズの大きさ、初期化処理の遅さ、メモリ使用量の大きさがネックだった。 そこでnative image化。 Oracle Database MLE(Multilingal Engine) MySQLもMLE Pluginに取り組んでいる

ネイティブイメージが適切なケース

  • FaaS
  • クラウドで実行する大規模アプリケーションでのリソース削減
  • 頻繁にリリース(再起動)するマイクロサービスのようなアプリケーション

起動速度とビルド速度のトレードオフ

  • 万能な技術は存在しない、技術はトレードオフ
  • 起動時に行うことを生成時にに行うのでビルド時間が長くなる
  • Hello Worldで1分超かかる

感想

GraalVMがなんでネイティブイメージの生成と関係してくるのか結びついてなかった。 Oracle Database MLE(Multilingal Engine)は聞いたことあったけど、そこから生まれたのか。 なるほどね。





17:45-18:30 DIコンテナ入門 #ccc_g7

TIS株式会社 うらがみ @backpaper0
写真NG

https://backpaper0.github.io/ghosts/dicontainer/#1

まとめ

  • DIとはごく普通のクラス設計の手法
  • DIコンテナは依存関係を考慮したインスタンス構築を助けるもの
  • ボイラープレートなインスタンス構築コードを省略できる
  • ついでにスコープとAOPが付いてきて嬉しい
  • コンストラクタインジェクションがオススメ

感想

DIコンテナとはなんぞや!と言われたらこれ読んでで済むね。 裏面も気になる!





資料