手続き型音楽の日常

関数型音楽に乗り換えたい

なごやで Xamarin 開発者と Xamarin 勉強会 に行ってきた話

先日 8/19、「なごやで Xamarin 開発者と Xamarin 勉強会」という勉強会に参加してきました。

jxug.connpass.com

Xamarin 経験者向けの、ちょっと踏み込んだ勉強会です。

たまたま connpass を漁っていたら引っかかって、「 名古屋じゃん! 」「 超有名なちょまどさん来るじゃん! 」「 Xamarin じゃん! 」というノリで参加を決定。

抽選枠も絶対参加したい枠も満杯で、かろうじて 立ち見枠 が1席(?)空いていたので、そこに滑り込ませていただきました。

というわけで、行ってみた感想や学んだこと含め、僭越ながらまとめさせていただきます。

私の Xamarin スキルレベル

実は私、 Xamarin の経験は 全くない状態 で参加させていただきました。

一応、募集要項には「Xamarin にすでに触れたことのある方向け」とありましたが、まあ私一人わからない人が行ってもいいかなぁと考えてました。

とりあえず前日には Visual Studio で Xamarin プロジェクトを作って、 Xamarin.Forms 製の電卓アプリっぽいものを途中まで作って うわぁ Xamarin ってすごいなー なんてはしゃいではいましたが、要はその程度だということです。

f:id:yuzutan_hnk:20170820161736p:plain:h300f:id:yuzutan_hnk:20170820161739p:plain:h300

ちなみに UI に3時間、ロジック(C, CE, 各数字, 演算途中まで)に2時間という多大な時間を割いてます。こんな低レベルなものなのに…泣ける…。

というわけで当日

f:id:yuzutan_hnk:20170820162126j:plain:h300f:id:yuzutan_hnk:20170820162212j:plain:h300

Microsoft中部支社に行ってまいりました!

21階という、超高い場所にきれいなオフィスがあって、やっぱり一流企業は違うなぁと感じました。

入って早々、名刺をお渡しして懇親会用のお布施を納め、会議室へ。

ドタキャンが相次いだようで普通に座ることができました。とはいえもともと立ち見の分際なので、一番後ろの机のないところに こっそり 座りました。

セッションは、ちょまどさん、くぅさん、えのさんの順。

私以外にも初心者の方が大勢いたようで、そこまで難しい話はしない方向でいきますよー、という感じで13時にスタートしました。

ちょまどさんのセッション

タイトルは「私は Xamarin が好きだ」です。異論は認める。

ちょまどさんはもともと Xamarin でアプリを作る会社に勤めていらっしゃって、その後 Microsoftエバンジェリストになられたという経歴をお持ちで、それ故 Xamarin 愛がすごいです。

終始 Xamarin 愛に満ちたセッションでした。

そして初めてエバンジェリストという職業の方のプレゼンを見させていただきましたが、さすがと言わざるを得ないような、初心者でもわかりやすいプレゼンでした。

プレゼン力つけなきゃなぁ…。

Xamarin についての紹介

Xamarin については予習していきましたが、やっぱり直に人から話を聞くと違うんだなぁと感じます。

ネットを見てもあんまり実感がわかなかった “共通化” というものが、ここにきてようやくわかってきた気がします。

普通にカメラが使えたり、普通にダイアログが出てきたりと、細かい制御が簡単に共通化で来ていて、しかも C# で。

実際に動いてる様子を見てみると、ネットに載っているコード例とか説明云々を読み漁ってもわからないような、感動を覚えました。

ちょまどさんは一番初めということもあり、本当に触りの部分しか説明されませんでしたが、これまで以上に Xamarin について理解ができたかなぁと思います。

名前空間の汚染問題

コミュニティ向けのネタセッションということもあり、初めからネタ満載で面白かったのですが、まさかこんな問題が出てきているとは思ってなかったです。

www.city.zama.kanagawa.jp

神奈川県座間市マスコットキャラクターの名前が「ざまりん」という、なんとも狙ったような名前…。

実際に画像検索を実演されてましたが、「ざまりん」で画像をbingると完全に浸食されきってる状態でした。

まあ後発とはいえ公認キャラクターのようですので、ちゃんと検索に引っかかるのはとても良いことなのですが、うーん、なんだか複雑な気分…。

ネタアプリ「松屋警察」

ネタアプリという名の宗教戦争ざまりんの扱い方…

松屋牛めし吉野家の牛丼かわからないときは、これで判別しようってアプリ。

吉野家の牛丼のときはちょまぎょが渋い顔してお知らせしてくれる機能までついてます。すごい。

iOS で実演されていましたが、Xamarin で作られているので、 これがソースそのままに Android でも UWP でも動くようになるのかぁと考えるとすごいことだなと思います。

1日で作ったというのですからなお驚き。マルチプラットフォームの(ネタ)アプリをたった1日で作れるなんて、本当に夢のようですね。

Custom Vision Service の紹介

松屋警察の正体、というか今回のサブメイン?いやサブメインは牛めしか…。

Microsoft が提供する、 画像分類の機械学習サービス の一つ。まだプレビュー版のようです。

https://customvision.ai/customvision.ai

画像をアップロードしてタグで分類するだけで、簡単に機械学習ができてしまうという、これもまた夢のようなサービス。

さらにすごいことに、最低 5枚 の画像があれば、機械学習ができてしまうというのです。公式には 30枚 程度あれば十分な精度が出るそう。

実際、松屋警察では松屋吉野家ともに15枚程度しか画像を学習していないのにもかかわらず、ほぼ百発百中で当てています。精度やばいっすね。

さらにさらに、画像のアップロードから学習結果のテストまで すべてブラウザ で行え、外部から使用するときは REST API を使うという、使い勝手が良すぎるサービスです。

機械学習が初めてでよくわからないという人でも、画像をアップロードして「 電車 (Train)」ボタンを押すだけで簡単に学習できるので、ぜひ使ってくださいね!という紹介でした。

ちなみに、REST API は 1日1000回 まで叩けるようです。画像も1000枚までだそうです。まだプレビュー版なので仕方ないですね。

WindowsVisual Studio の初耳機能

たぶんちょまどさんのセッションの中で、参加者に一番の驚きを与えたのはこれかと思います。

私も知らなかったのですが、 Windows 版の Visual Studio だと、 JSON の生文字列をクリップボードにコピー した状態で 形式を選択して貼り付け をすると、その JSONシリアル化可能なクラスを自動生成 してくれるそうなのです。

REST API の説明をしているときに「これ、帰ってくる JSON から作ることができるクラス…、あ、これ Windows 版の Visual Studio の機能なんですけど…」って切り出して、さらっと会場を沸かせました。

かっこいい。

本当にできるのかと、その場で早速試してみた画像を Twitter に流したら、結構反響がありました。

クラスを生成できることまで確認したはいいものの、肝心の 生成したクラスをスクショし忘れるという痛恨のミス を犯してしまい、なんだか微妙な感じになりました。はぁ。

第三の勢力(への対応)

松屋警察は松屋吉野家しか対応していませんでしたが、質疑応答で会場から「すき家に対応してほしい」という要望が飛び出しました。

まさかの第三勢力の登場に、会場がざわめく…。

そこでちょまどさん、試しに5枚ほどすき家の画像を登録し実行されたのです。しかし、なんと 吉野家と判定して誤認逮捕してしまいました

いやまあ、逮捕したことには変わりないので良かったとは思います(

質疑応答の時間が十分にとれたのでその場で対応されたのだと思いますが、それにしても、ものの10分程度で機械学習をつかったアプリを仕様変更できてしまうなんて、本当にびっくりします。

それも、 Xamarin をつかっているのでマルチプラットフォームでの改修。本当にすごい技術ですよね…。

まとめ

初心者向けの内容でありながら、実演を交えてとても奥の深いセッションでした。

Xamarin についての知識だけでなく、実際に動くという実感が何よりも大きかったと思います。

さらに、改修という普通では見ることができない作業があったので、なんとなくではありますが、利便性やメリットを感じることもできたかなぁと思います。

くぅさんのセッション

タイトルは「AIをアプリに取り込む!」です。

くぅさんは 大同大学 の 情報学部 2年生、東京の某社でインターン中の Microsoft MVP 。何という豪華な肩書き…。

自作アプリ「 Keya Lens 」

熱烈な欅坂46のファンだそうで、欅坂46の誰とどのくらい似ているかを判定するというアプリを自作されたそう。

写真を撮ると、何%の確率でこの人と似てますよっと教えてくれるみたいです。

飲み会とかで盛り上がりますよねってさらっと言っていたのですが、やっぱりあのレベルになると 怖い 大人の人達と一緒に飲み会に行ったりするんだなぁと遠い目。

同年代なのになんだろうこの格差って痛感しました、始まって早々。

やっぱり時代は機械学習! Cognitive Services!

時代はモバイルを通り越して、もはや AI! 機械学習!

私も機械学習やってみたいなーと思いますが、家にある GPU はメインPCについてる GeForce 1050 だけだし、サブPC用に買っても非力だし…。

というか、理系とか文系とか隔たりなく趣味の範囲でしか基本的にやってないので、詳しいことは全くわからない。

そんな私でも簡単に機械学習できるような、Microsoft が提供する 機械学習サービスのブランド (ここが当日よく理解できてなかった) があるみたいです。

azure.microsoft.com

ちょまどさんが紹介された Custom Vision Service もこの内の一つで、他にも顔を読み取る Face API や Emotion API機械翻訳を行う Translator Speech API や Translator Text API など様々なサービスがある模様です。

あの有名な、 How-Old.net には、男性を逆鯖読みする機能を強化して使われているみたい?

how-old.net

Intelligent Kiosk

github.com

GitHub に公開されている UWP アプリプロジェクトで、 Cognitive Services でどんなことができるかを体験できるアプリだそう。

主に画像認識系の API を利用しているようで、カメラで撮った写真を使っていろんな機械学習成果を試すことができるみたいです。

帰ってから実際に試してみましたが、 Cognitive Services のキーを入力する必要があるのでちょっと保留。

でもすごくわかりやすい設計になっているので、 Xamarin プロジェクトにも簡単に移植できそう。

Custom Vision Service の紹介 (再登場)

この API 、 Cognitive Services の中でも特に注目されているようで、くぅさんもこれを紹介されてました。

「 Keya Lens 」もこれで実装しているみたいで、各メンバ 30枚 ほど写真を用意して登録しているみたいです。

ただ、メンバーの人数が人数なので、1人30枚も手作業で入れると相当な苦労を強いられることになる。そこを Cognitive Service の Bing Image Search API で半自動で登録されたそう。

qiita.com

Cognitive Service だけでこんなに自由に機械学習が扱えるんですね…素晴らしい。

まとめ

Xamarin のセッションのはずが、ほぼ終始 AI や Cognitive Services の話で埋め尽くされていた感があります。

これはこれで、今流行りの2大ワードである、 モバイルAI っていう、素晴らしい活用方法を勉強できてよかったと思います。

えのさんのセッション

タイトルは「Embeddinator-4000 から学ぶ Xamarin の基礎」。基礎ですよ、基礎。

speakerdeck.com

えのさんは Xamarin の開発に携わっている、いうなれば Xamarin の第一人者。もはや Xamarin のことを知らないわけがない人物。

後から見直してみたら、ネットで調べて読んだ Xamarin の文献のほとんどがえのさんのものだった…。恐るべし。

Xamarin のセッションで C言語

まずはじめに、 Embeddinator-4000 とは何をするもの何かの概要の説明。

Xamarin (C#) の DLL ライブラリをネイティブから利用できるよう、 C や JavaObjective-C のライブラリを生成する技術、だそうです。

ほぼすべてのコードを変換することが可能で、スライドにもあるように Xamarin.Forms でさえもネイティブから呼べるようになるということです。

えっ、急に難易度高くなりすぎじゃないですか

わからない単語が次々に出てくる…

NuGet で Embeddinaor-4000 をインストール後、コマンドポチポチ…。

引数によってプラットフォームを分けることが可能で、 Android の場合は aariOS の場合は dylib が生成される……。

aar には monodroid ランタイム が含まれ、 Hello World! プログラムでだいたい 10MB ほどのサイズになる………。

というのが、スライドからの抜粋なのですけど、そもそも aar って何? monodroid って何? と会場でハテナばかり浮かんでくる。

丁寧に解説してくださるえのさん

今回の勉強会に参加しているのが初心者ばかり、それもネイティブ関連は全く分からない人が大勢いるということで、わかりやすいように解説してくださるえのさん。

  • 実際にビルドした DLL を参照するよう指定して Embeddinator-4000 を実行すると、それを元に DLL の中身を呼び出せるクラスライブラリを生成してくれる。
    • 基本的には C 言語のライブラリが生成される。どのプラットフォームでも C 言語ライブラリを使える環境はあるから。
    • Java を出力する指定にすると、 C# で書かれたクラス構成そのままのライブラリが生成される。 C#Project1.Common.AppTitle と呼び出せるものは、 Java でも Project1.Common.AppTitle で呼び出せるようになる。
  • aar とは、 jar や Assets などを含むアーカイブ。というか、 Android Studio で作る Android プロジェクトの生成物をそのまま zip 圧縮したもの。
  • monodroid は、ビルドした C# の実行コード (MSIL) を解釈する JIT コンパイラや、クラスライブラリなどを含めた Mono のランタイム本体。組み込みコンパイラ

ほかにもいろんなことを説明されていたような気がするのですが、タイピングが遅いのでメモれず。無念。

そして話は Xamarin の 基礎

Embeddinator-4000 の動作原理を理解するためには、 Xamarin の動作原理も理解する必要があるとのこと。もはや中級者でもついていけない気がする。

スライドにもあるとおり、ネイティブアプリの理解ができればなんとなく理解できるそうなのですが、私は作ったこと無いのでさっぱり。

とはいえ、「 Android NDK って知ってる?」とか「 iOS 向けの Xamarin プロジェクトは AOT コンパイルされるの知ってる?」とかの質問には大体の人が手を上げていたので、多分断片的に理解されてる方は多いんだろうなぁと。

私は全く理解できなかったよ。とほほ。

詳しいことまとめ

学校で全く未知の授業受けてるかのような状態に陥って会場全体もそこまでなごやかなムードでもなかったので、勉強できたところをまとめていきます。

Embeddinator-4000 は一体何なのか

上記にもあったとおり、 DLL の中身を呼び出せるクラスライブラリを生成してくれる もの。

そもそも、 C# を普通にビルドすると (Xamarin に限らず) MSIL と呼ばれる仮想マシン用 (.NET Framework 用) のアセンブリ が生成されます。いわゆる中間言語ってやつですね。

AndroidiOSmacOS も MSIL は解釈できません。そこで、 Embeddinator-4000 は MSIL を解釈し、中の機能を呼び出せる C/Java ライブラリを生成 するというわけです。

Xamarin と何が関係するのか

Embeddinator-4000 の GitHub には次のような文があります。(投げやり)

github.com

It is a tool that takes a .NET assembly and generates the necessary glue to surface the .NET API as a native API. The goal is to surface .NET libraries to all ecosystems where Mono/Xamarin run, and for each platform we provide an interface that is native to that platform as well as the tools needed to turn a .NET library into something that can be consumed on that platform.

そもそもなぜ Xamarin は .NET ライブラリを各プラットフォームで動かせるのか

Xamarin は Mono というシステムを使って、 MSIL を各プラットフォーム上で実行できるようにしています。

Mono はオープンソースで開発された .NET Framework 互換技術の総称です。もともと Linux 上で MSIL を実行できるようにしていたものです。

えのさんは、各プラットフォーム別に MSIL を実行する手順を解説してくれました。

Xamarin.Android の場合

Android の すべてのアプリは Java VM で実行します 。例外はないそうです。

アプリが VM で動くということは、実は Android のアプリは常にもっと低レベルなネイティブバイナリに JIT コンパイルされながら動いているということになります。

C/C++ で直接これを呼び出せる技術が、 Android NDK として確立されています。

一方で、 Mono はかなり前から MSIL を実行するための JIT コンパイラを含む VMLinux 上で実装しています。C言語で。

AndroidLinux ベースですから、ちょっと手直しすれば動くようになります。

そこで、 Android NDK を使って、 MSIL の VM とその他のランタイムをすべて含んだ monoランタイム を作成 し、それを Xamarin で作成する Android アプリに直接埋め込んでいる そうです。

これが、スライドで解説されている Embedding Mono のことだそうです。

Android アプリを実行するとまず Java のエントリポイントから実行が開始されますが、 Java/C 相互運用技術を使って monoランタイム のコードを呼び出し、それが MSIL を実行する、という流れになっています。(スライドの図参照)

Xamarin.iOS の場合

iOS の場合はそんな簡単にはできないみたいで、 動的なコード生成が禁止 されているため JIT コンパイラが使えまません

例外的に、 Safari に使われている JavaScriptVM なんかは JIT が認められているそうですが、サードパーティでは無理だそうです。

そこで、 AOT コンパイラを使い事前にネイティブコードにコンパイルしておくという仕組みが採られています。

すべてネイティブコードに変換されるということは、わざわざ JIT コンパイルする VM を必要とせず、 ガーベジコレクションなどの機能を実装すれば良いことになります。

スライドにある

embedded mono は Mono.framework になっている

というのは、リンクするだけでそうした VM の機能を利用できるようになっている、ということだそうです、

Embeddinator-4000 はどうなっているのか

Xamarin が MSIL を実行する手順を応用しただけのようです。

MSIL で書かれたライブラリを呼び出すように mono ランタイムを操作できる C 言語 API を作成 するのだそう。

スライドの図には e4k C API から直接 C# コードを呼んでいますが、多分 mono ランタイムも C 言語のためコンパイルすると Embeddinator-4000 の API との境目がなくなる、という認識でいます。間違ってたらご指摘ください。

何がすごいのか、何がわかるのか

Embeddinator-4000 も Xamarin も、実は同じ技術の応用をしているだけ。

というか Mono を使って MSIL をコンパイルして、各プラットフォーム対して最適な API を自動で生成している。

Xamarin の場合はそれを一つのアプリとして、実行可能な形式にしてくれる (実行できるような Java コードなどまで自動で生成する)。

Embeddinator-4000 の場合は、 C# で書いたクラス構成そのままの API を公開して、ユーザ (開発者) がそれを自由に使うことができる。

感想まとめ

本当に詳しく解説していただいたおかげで、本筋から外れたことでも勉強になることはたくさんあったし、そもそも Xamarin の動作原理を概念的でありながら理解できたと思います。

もっと詳しく突き詰めていくと、たぶん実際のコードを見たほうが早いってことになりそうですし、もっとわからないことがたくさん出てくると思います。

マルチプラットフォームで動かすためにいろいろな方法を採って最適解を模索して、そしてそれを地道に実装する。そうした作業をがあるからこそ、 Xamarin は手軽にアプリを開発できるんだということを、なんとなく感じることが出来たと思います。

個人的には、とてもぐっと刺さる内容でした。永遠に Xamarin のことについてえのさんからお話を聞いていたい。うん。

勉強会全体を通じて

この記事書くの 本当はスプラトゥーンにうつつを抜かしてて 時間がかかってしまいましたが、なにはともあれお疲れ様でした。そしてありがとうございました。

本当にたくさん勉強することがありました。同時に勉強することが増えました。

初めて勉強会記事なんて書くし、そもそもこうした勉強会自体、参加するのが初めてで、なんか大げさかもしれませんが。

もっと頑張らなきゃな、とつくづく感じました。