Xamarin最新情報2018 (de:code2018) の補足情報

de:code2018が何とか終わりました。イベント自体にいろいろ問題はありましたが、とりあえずそれはおいておいて、わたしのセッションに来ていただいた方はありがとうございました。

スライドはこちらで公開してあります(イベント事務局側でも録画とpptを公開するんだと思います)。当日に「期待していた内容と合っていない…!」みたいな事故を防ぐために数日前にプレビュー版を事前公開していましたが、そもそもtwitterで事前チェックの発言を発見した人がいたかどうかは不明…

speakerdeck.com

事前に軽くしゃべってみたら80分くらいかかってしまったので、いろいろ削って、でもストーリーラインは何とか残しておこうとなった結果こんな感じでしたが、いろいろ端折ってしまったので、ちまちま補足しようと思います。

Ooui.Wasm

デモの手順はほぼOouiのwikiに書いてあるとおりです。Webサーバはこれと同様にdotnet-serveをインストールして使いましたが、Webサーバであれば何でも良いので、たとえばWeb Server for Chromeなんかでもいけます。

中に入っているmono.wasmやらmono.jsやらは、Oouiがmonoのwasmサポートのビルド済みアーカイブをダウンロードして使っていて、その場でビルドしているわけではありません(monoランタイムはでかいのでかなり時間がかかるはず)。ちなみに.NET Coreコンソールアプリで、Linuxからでもビルドして実行できます(Workbooksを動かそうと思ったのでMacにしましたが、そうでなければUbuntuでセッションやるつもりでした)。

デモで使用したバージョンは0.10.222でしたが、この中で使われているXamarin.Formsは2.5です。せっかくWebなのでFlexLayoutを試そうかなあなどと思ったのですが、実装されているかを確認する以前の問題でした。

ちなみに、wasmを使うものではないのですが、HTML5ベースのCanvasを使ってブラウザ上にGUIレンダリングしようというプロジェクトは他にも、というか大昔から存在していました。gtk-broadwayというやつです。これはクライアント1つにつきWebアプリのセッションを1つ使うもので、あまり現実的に使えるものではなかったと思います。PoC (proof of concept)としては面白いというやつです。あとUnityのWebGL projectなんかは概念的には近いものになっているんじゃなかろうか。

あとOoui.Wasmがこれだけ動かせるんならControlGalleryくらい動かせるんじゃねーの…?と思って自分でプロジェクトを作って移植してみたりしたのですが、実行時に謎のエラーになり、冷静に考えたらFormsのmasterからとってきたサンプルであるところのControlGalleryが2.5のやつで動くわけねーな…!ということになりました。試すまでもなくlimitationsがどこかにまとまっていたのですがちと今すぐ見つからない…

Workbooks

Workbooks。2006年頃から存在していたC# interactive shellを中心としたツールの現在の姿であるといえます(当時はMono.CSharp.dllでしたが、現在ではRoslynです)。C# interactive shellがVSに載ったのが3,4年前くらいだと思うと、この方面のmonoのイノベーションはRoslynの7,8年くらい前には起こっていた感じです。

ASP.NET Coreで作られたWeb版ですが、Reactアプリです。まだ鋭意開発中のやつです。デモでも再現したのですが、いったんコードの文法ミスなどでREPL実行がエラー評価になるとどこかで非同期処理がバグっているらしくdotnet runを再実行しないといけなくなる状態です。ちなみにmasterブランチで出来ます。トップディレクトリでdotnet buildを実行した後、Clients/Xamarin.Interactive.Client.Web/ ディレクトリでdotnet runするだけです。

WorkbooksはC#オブジェクトを結果として表示するとき、デフォルトではプロパティリストのようなかたちで表示することになるのですが、これをカスタムレンダリングすることも可能です。この場合のレンダリングとはHTML文字列なのですが*1、この辺の仕様はドキュメント化されているものの、まだプレビュー状態で、しかも開発者と相談していたら「これからReactコンポーネントに書き換える予定だから今はやめとけ」と言われたので、この辺で遊ぶ予定だったのですがあきらめました。

デスクトップ側も動かそうとして失敗したわけですが、agent側のアプリも終了しないとクライアント側だけ切って再起動とかやってもそのクライアント セッションでは二度と立ち上がらなくなるようなので、この辺の接続状態の試験シナリオが足りていないのでしょう(まあ普段agentを落とす必要は無いのですが…)。

ちなみにデスクトップ版ではFormsも試せるのですが、これはバージョン2.5固定です。3.0のnugetパッケージなどに更新したら期待通りには動作しません。これはWorkbooks agentが固定バージョンを想定して作られているためです(そうしないと挙動をうまく制御できなかったらしい)。WorkbooksでFlexLayoutのデモをやろうと思っていたのですが、これもあきらめました。ただ開発チーム的には2.5でないと困る理由はなく3.0にしたいと言っていたので、そのうち上がるでしょう。

FlexCSS

ReactNativeでyogaが使われていて云々については、Cheap Dive into React Native (booth)に書かれていた話で、これがR/Nの中身を知るのにはよさみがあるので、興味がある人は読むといいでしょう。

CSSをサポートに対してXAML至上主義者がネガティブだという話、具体的にはこういうのを見てもらえればわかると思います。わたしは今後一切XAML至上主義者を助けまいという気持ちになりましたが、これはあくまでわたしの意見なので、壇上ではそこまでは言いませんでした。ちなみにBuildのForms 3.0のセッションでも「否定的な意見も出てくるのだが…」くらいのニュアンスでそういう話を紹介しています。

XAMLまわりもWPFもそうなんですけど、Windowsチームが作っているものって、.NETチームが作っているものと違って、2018年になっても何もオープンソース化されないんですよね。.NET Core 3.0に追加されるというWindows desktop packもバイナリ配布ですし。VS/VSMac d15.7におけるXAMLサポートの拡充も、そういう状況のもとで行われているんだ、ということは、もっと知られてもいいのかも。

XAMLに生き残らせる価値があるのか、よく考え直す時期に来ていると思います。

LiveReload

hot reloadの類型である、という話をして紹介したのですが、stateとviewの分離が重要である、という話をもっと強調しても良かったかもしれません。FlutterのHot Reloadのページにも、"sometimes described as stateful hot reload,"と書かれているように、実行中のstateを維持したままviewの変更を反映する、という意味合いの強い機能であり、だからXAMLのLive Reloadなのであり、MVVMに準ずるviewとstateの分離が重要なわけです。

現状XAMLのみのサポートですが、理想をいえば、Elmish.XamarinFormsのようなXAMLAPI呼び出しもコード分析して反映できるとうれしいでしょう。まだコードを読んでいませんが、flutterのhot reloadはそういうDartの実装が含まれているのだろうと理解しています。

Android StudioにはInstant Runという機能があり、これにはcold swap / warm swap / hot swapという3段階の機能レベルがあるのですが(最近の状況はわかりませんが、hot swapまで行くとだいぶ動作が怪しかったものでした)、レイアウトリソースの更新はwarm swapのレベルで実現しています。これがhot reloadに近い存在です。ちなみにhot swapは実行中のコードの差し替えも行うもので、これはVisual Studio使いにはedit and continueと言えばわかりやすいでしょう。XamarinにもLive Playerという機能があります(de:codeでは川合さんのセッションで紹介されていたもの)。

所属とか組織とか

最後におまけですが…Xamarinは合併直後はAzureというかGuthrieの下に雑に統合されていたものが、VS/mobileチームということになって、グループとしてはVSということになったみたいです。それに伴って、Test CloudやらApp Centerやらといったサーバー関係のチームはXamarinからサーバー製品のチームの下に再編成されたようです。もともとtest cloudはless painfulを買収して成立したチームですし、独立性は高かったので、あまり違和感はないですね。

そういうわけで、App Centerなどのサーバー製品はXamarinとは無関係になり、個別に発展していくことになるでしょう。われわれは本来のXamarinとしてMonoを中心としたフレームワークの開発に注力していくことになりそうです。

*1:ちなみにこれはWeb版だけでなくデスクトップ版クライアントでも同様です。表示しているのはInspectorと同じWeb UIなので