技術書典4新刊によせて

はいどーも! atsushienoです。今回は技術書典4の新刊のお知らせです。

Xamarin Mythbusters / MonoDevelop Masters Book

技術書典4におけるサークルXamaritansはき01、新刊はXamarin Mythbusters / MonoDevelop Masters Bookです。

techbookfest.org

見本ページなどもサークル用のgithub.ioページで公開しています。

今回のサークルの方針

今回はサークルの方針をどうするか、とても悩まされる回になりました。わたしとしては個人としてとにかく音楽技術系のネタを出せるようにしたいので、これは自分だけになりそうだな…というか音楽系で書ききるネタ無いな…でも売り子さんいないと自分が当日イベントスタッフで狩り出されるからサークルとしてアウトになる…*1という事情から、サークル申込がFIXしてサークル名が確定する頃には「やっぱXamaritansとしての新刊は出すべ…」というモードになりました。

(「出ない」という選択肢もありましたが、Xamaritansの本がまだ割とあるので、もう少し売り出しておきたいなあという気持ちです。5月末まではboothでも販売するつもりなのですが、在庫管理費が爆上がりする予定なので、今後はオンライン販売もしなくなる予定です。)

それで執筆者を募集し始めたわけですが、それまでずっと「今回は(音楽で)自分だけで出そうかな〜」みたいなモードでtwitterなどにも書いたりしていたので、執筆者が集まる感じにはならず、とりあえずスタッフは何とかなるやろ…という感じで3月から1人で1冊書いて体裁が整うであろうMonoDevelop本を書くことにしました。これが、本書の大半が"MonoDevelop Masters Book"となった経緯です。

第1章(Xamarin.iOS

3月も後半になってきて、いよいよ売り子がいなくてヤバいしどうにかしないと…となっていたところに、ひらのさん @ailen0ada がひとつiOSネタで書いて売り子もしてくださるというので、お願いすることにしました。それで上がってきたのが、第1章のXamarin.iOS に翻弄されないために ̶̶ その傾向と対策です。

技術書典の新刊の案内を出す時に、いつも各章の内容を広告過剰気味に(!?)まとめるのですが、この記事は掛け値なしに、ひらのさんレベルの開発者が開発中の問題に遭遇した時に、どうやってxamarin-maciosのソースコードまで踏み込んで問題を解決するか、というやり方が文字で読めるようになっている貴重なものです。

残り(MonoDevelop

そういうわけで、残りは全てMonoDevelopのコンセプト・アルバムのような内容です。MonoDevelopを素の状態で使っている人は多くないかもしれませんが、Xamarin StudioやVisual Studio for MacはUnityも含めて幅広く使われているはずなので、これらを使ったことがあって、何となくどんなものか分かるという開発者が第一の対象読者ということになります。

ただ、MonoDevelop本といっても、MonoDevelopの使い方みたいな誰でも書ける(?)話を書くつもりは無かったので、今回の内容はMonoDevelopは何で/どのようにIDEなのか?という観点で、機能と仕組みを解説しています。IDEはアドイン機構を使って自分の好きなように機能追加できるし、何ならC#テキストエディタデバッグサポートだってアドインなんだし、それらはこれこれこういう感じで実現しているんだ、といったことが分かるように解説するようにしています。あと、何より、MonoDevelopの開発スタート当時から観察しているわたしだけしか知らなそうな話をまとめたりもしているので、歴史記録係(?)としての役目をひとつ果たしたような気持ちになっています。

当初は「少なくとも30ページ、がんばって50ページくらいは書いて1冊の本としての体裁が整うようにしたい…」というローなテンションで書いていたのですが、最終的にはこの部分だけで100ページ弱になってしまいました。

本編は以前の執筆メンバーでもある中澤さん(@muo_jp)と杉田さん(@toshi0607)のおふたりから神レビューをいただいて、読み進め方に難のあった部分などを多々修正できています(本当にありがたいです)。

表紙

当初、今回も絵師に表紙をお願いしていたのですが、依頼して慢心していたら直前になって「本業が忙しくなって描けなそうだ」ということになってしまい、やべえ…と思いながら無理やりフリー素材*2をこねくり回して乗り切りました。

f:id:atsushieno:20180419085023p:plain

英霊召喚したつもりだったのですが、絵師に「猿が感電している」と言われてかなしい思いをしました() 絵師にはその後裏表紙をでっち上げてもらってpsdへのレイアウトもお願いできたので、この方面は助けていただきました。

MMLコンパイラmugeneによる音楽制作ガイ ド(あるいは、1週間で作るオンデマンド同人誌)

さて、実は今回もう1冊新刊があります(!?) 自作のMMLコンパイラのガイドブックです。

Xamaritansの入稿を終えた先週の後半から「もともと音楽技術系の本を出したいって言っていたのに、蓋を開けてみればXamarinサークルじゃん…これ自分が一番やりたかったことじゃないし何か間違ってる…!」という気持ちになり、それならせめてコピー本でもいいからなんか音楽ネタを出そう、と思ったのでした。とはいえ、いま着手しようと思っている方面はコードを書いてからでないと書く意味がなく、それならMML打ち込みまわりで現状をまとめたほうが良いだろうと、金曜の晩に腹づもりを決めて、土日の空いている時間で書くことにしました。

いざ書き始めてみると、土曜1日で20ページくらい上がって、しかし内容は予定の半分くらいしか出来ておらず、日曜も他の用事をこなしつつ集中して書いたら30ページくらいになってしまい、それでも7割方しか書けていなかったので、これはもう1日使おう、と決めて火曜に休みをとって、サンプルや画像を取り込んだら最終的に3日で48ページの本になってしまいました。

3日目は表紙をでっちあげる作業もしていました。こんな感じです。自分のUbuntu環境でCMYKなpsdを編集できるのはKritaしか知らないので慣れないKritaでやっています(しんどい)。表面はMIDIプレイヤーのスクショ、裏面はvscodeで開いたMMLのスクショというらくらく構成()です。まあでっち上げにしては悪くないのでは…(!?)

f:id:atsushieno:20180419082929p:plain

コピー本にするつもりだったのですが、こんなページ数ではホッチキスで止めるのも無理だし、電子版でいいか…とおもっていたのですが、中綴じのオンデマンド印刷で何とかなりました(印刷所に入稿できる本としてもギリギリのページ数)。間に合わないだろうと思っていたのですが、印刷所にも送れるタイミングで終えられたし、イベント4日前でも何とかなるもんですね。こんな短期間でできるとは。

いざとなったらこのペースで書けるのか…と思いましたが、これは単に「書ける」ネタで「やりたかったこと」だったからですね。人間、やっぱり一番やる気のある作業に着手させるのが一番生産性が高い、「仕事」なんかしているバヤイではないな、と改めて思った次第です(落合陽一っぽさある)。

内容は、MIDIMMLで作曲というびみょいジャンルの作業で拙作コンパイラをどう使えばいいのか、ギターとかベースとかドラムとかどうやって打ち込むの?という、ドキュメントとしてそのままgithubに放り込むのは妥当では無さそうな方向性で書いたガイドブックとなっています。2018年にMMLの本はさすがに売れねーだろ…!と思って、20冊だけ用意してありますが、まあ売れ残ると思うので(慢心)、ほしい方はのんびり来ていただければと思います。特にわたしがブースにいない時は誰にも説明できない内容の本ですので…

技術書典4での出展体制

今回は後半からわたしもイベントスタッフ業を離れることができることになったので、ブースに在籍することにしました。これまで自分が書いて回しているサークルなのに当日の内容説明なども全く出来ずに申し訳ない気持ちだったのですが、今回は(ちょっとですが)正常化されたかたちです。

理想としては、今後も出展するなら、当日スタッフ業は一切やらないというかたちで参加しようと思っています。準備期間も重なって、今なかなか厳しいものがあります*3。自分だけのサークルなら自分が売り子に立たないといけないし、自分がまとめるサークルでは無責任に回すわけにもいかないし…とか、そういう本筋ではないことで悩みたくはないですよね。

そんなわけで、今回までは流されっぱなしでしたが、今後はもう少し確たる方針でやっていこうと思います。

*1:イベントスタッフには他にも自分だけのサークルを持っているメンバーもいるのですが、TechBoosterのメンバーに売ってもらえるという恵まれた体制なので、事情が全く異なるんですよね

*2:Googleでlicensing filterかけた画像検索

*3:これも、必要だから書いているのに「遊んでいるのかな…」みたいな気持ちになってホントよくないんです

NuGetパッケージが不要なnetstandardパッケージをずるずると追加する問題

Xamarin.AndroidやXamarin.iOSでNuGetパッケージを追加していると、たまに膨大な.NET Standardのパッケージが追加されて「は?」ってなることがあると思います。具体的にはNewtonsoft.Jsonとか。

無駄に縦に長いNewtonsoft.Jsonの依存パッケージリスト

こいつら実のところゴミなんです。いらないんです。しかもゴミなのに消せないんです。Newtonsoft.Jsonが依存しているからちゃんと消せないようなかたちで追加してあげたのねん! ボンビー!

これが原因で、ビルド時になると、MSBuildがこんな警告を出してくるようになります(原典はxamarin-androidのgithub issue)。

2> "Microsoft.CSharp, Version=2.0.5.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" was chosen because it was primary and "Microsoft.CSharp, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" was not.
2> References which depend on "Microsoft.CSharp, Version=2.0.5.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" [C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\ReferenceAssemblies\Microsoft\Framework\MonoAndroid\v1.0\Microsoft.CSharp.dll].
2> C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\ReferenceAssemblies\Microsoft\Framework\MonoAndroid\v1.0\Microsoft.CSharp.dll
2> Project file item includes which caused reference "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\ReferenceAssemblies\Microsoft\Framework\MonoAndroid\v1.0\Microsoft.CSharp.dll".
2> Microsoft.CSharp
2> References which depend on "Microsoft.CSharp, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" [].
2> C:\Users\mml\Development\test_app\packages\Newtonsoft.Json.10.0.3\lib\netstandard1.3\Newtonsoft.Json.dll
2> Project file item includes which caused reference "C:\Users\mml\Development\test_app\packages\Newtonsoft.Json.10.0.3\lib\netstandard1.3\Newtonsoft.Json.dll".
2> C:\Users\mml\Development\test_app\tes_app\bin\Debug\netstandard1.6\test_app.dll
2> Newtonsoft.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL

何だそりゃ、ってなりますよね。これは全てNuGetの出来が悪いせいです。NuGetがやっつけ仕様で出来ているためです。正確に言えば、NuGetの実装が悪いわけではなくて、NuGetで運用されるパッケージ管理システムがきちんと設計されていないことに起因します。

Newtonsoft.Jsonのnupkgには、さまざまなプロファイルのアセンブリが含まれています。

無駄に横に長いNewtonsoft.Jsonのプロファイルリスト

Xamarin.Androidのプロジェクトにこれが追加された時に、実際にプロジェクトで利用されるプロファイルはどれでしょうか? netstandard1.3? portable-net45+win8+wp8+wpa81 (Profile259) ?

これ、実際にパッケージ解決に使われているのは、netstandard1.3なんです。ちなみにここでProfile259に解決されていれば、この問題は生じなかったんですね。Profile259には依存関係の列挙が無いのです。

ところでこの「正解」はどうすれば選べるのでしょうか? NuGetパッケージの開発者には、Profile259のサポートとnetstandard1.3のサポートを両方含める理由があります。それぞれのTFM (target framework moniker)で示されるフレームワークのサポート対象が異なるからです。(netstandard1.3とPCL Profile 259の関係は包摂的かもしれない。その検証を全てのPCLプロファイルとnetstandardのバージョンについて実施できますか?)

そして、どちらのTFMがより「優先」されるかを判断することはできません。なぜならライブラリ開発者によっては、PCL側により多くの機能を実装しつつnetstandard側は限定的な機能のみを提供しているかもしれないし、逆かもしれないからです(たとえば、bait & switchなPCLあるいはnetstandardなライブラリの有無によって幅広い実装を一方でのみ実現している場合)。

いずれにしろ、netstandard1.3でTFMが解決されると、NuGetは次にそのgroupのdependenciesを取得しにかかります。

  <group targetFramework=".NETStandard1.3">
    <dependency id="NETStandard.Library" version="1.6.1" exclude="Build,Analyzers" />
    <dependency id="Microsoft.CSharp" version="4.3.0" exclude="Build,Analyzers" />
    <dependency id="System.ComponentModel.TypeConverter" version="4.3.0" exclude="Build,Analyzers" />
    <dependency id="System.Runtime.Serialization.Primitives" version="4.3.0" exclude="Build,Analyzers" />
    <dependency id="System.Runtime.Serialization.Formatters" version="4.3.0" exclude="Build,Analyzers" />
    <dependency id="System.Xml.XmlDocument" version="4.3.0" exclude="Build,Analyzers" />
  </group>

これらのパッケージが(a)NETStandard.Libraryの内容から、あるいは(b)Microsoft.CSharpの内容から、実際にダウンロードされてプロジェクトに追加されるのかはわかりませんが、追加された時には netstandard1.3の文脈で追加されているようです。Microsoft.CSharp(4.3.0)について具体的な挙動を見てみると、このパッケージにはMonoAndroidのダミーTFM(実装がないやつ)と、netstandard1.3の実装ありTFMが含まれており、Newtonsoft.Jsonを追加したXamarin.Androidのアプリケーションには(残念ながら)正しいダミー側ではなく間違った実装側が追加されます。

いずれにしろこれらのパッケージが順次解決されていき、.csprojには大量の無関係な参照が追加されていくのです。衝突するふたつのTFMを解決する定性的なやり方は存在しないので、解決策はありません

もっともNewtonsoft.JsonのNuGetパッケージングもいささか怪しいものです。Newtonsoft.Json.nuspecの一部を見てみましょう。

  <group targetFramework=".NETStandard1.3">
    <dependency id="NETStandard.Library" version="1.6.1" exclude="Build,Analyzers" />
    <dependency id="Microsoft.CSharp" version="4.3.0" exclude="Build,Analyzers" />
    ...
  </group>

targetFrameworkは1.3なのにNETStandard.Library 1.6.1を依存関係として引っ張ってきているのっておかしくないですかね? .NET Coreランタイムが古いと動かないような実装かもしれないのに。この辺Newtonsoft.Jsonのやり方は軽率だと思います。とはいえ、だからといってこれを解決しても衝突するふたつのTFMが解決できない問題が解決するわけではありませんし(とわたしは理解しています)、問題は開発者が軽率であることよりも、こういうパッケージングが出来てしまうことではないか、とも考えられます。

ちなみに、 https://docs.microsoft.com/en-us/nuget/reference/target-frameworks からリンクされている Get Nearest FrameworkツールでProject Frameworkにmonoandroid、Package Frameworksにnetstandard1.3 portable-profile259 を渡して診断させると netstandard1.3 が返ってきますが、その判断を支える正当な理由はどこにもありません。

.NET Standard Library 2.0とNuGetまわりでは、「仕様レベルでちゃんと解決できていない問題がある」みたいなmeta issueがあり、とりあえず長すぎて読む気もしないのですが、見切り発車だったなという感想を持たざるを得ない感じです。

そんなわけで現状では「これが仕様上想定される動作だ」ということになるのですが、わたしの予想では、Newtonsoft.Jsonのパッケージングを修正することで問題を解決することができるのではないかと思っています。具体的にはこんな感じです。

<dependencies>
  <group targetFramework="MonoAndroid1.0" />
  ...
</dependencies>

ただhttps://github.com/JamesNK/Newtonsoft.Jsonにはnuspecファイルが無いし、パッケージングはめんどくさいps1で実装しているっぽいんですよね。ちょっと追いかける気がしない。まあ気が向いたらコメントするかもしれません。ここで書いたことをひと通り英語でもう一回書くのは面倒だなあ…

DroidKaigi 2018 Embeddinator-4000セッションの事前資料

2/6追記: スライドも事前公開した。

speakerdeck.com

DroidKaigi 2018でEmbeddinator-4000のセッションをやることになったので、セッションスライドを書きながら、どんな話をして、どんな話をしないか、どのへんがまだ検討中なのか、といったことを、一般参加者のみなさんがセッションを聴講するかしないか判断できるように、事前公開しておこうとおもう。あくまで興味ある人が読んでおいてもいいかなーっていう内容であって、当日はもっと簡単な内容で済ませるかもしれない。なおセッション資料はまだ完成していないのでまだ公開できないのだけど、少なくとも直前には公開しておく予定だ。気が向いたら作りかけを週明けくらいに公開するかも。しないかも。

(コレは何なのかというと、セッションタイトルに「Embeddinator-4000でAndroid Studioから.NETのコードを利用する」とあるように、これはXamarinとは違ってAndroid Studioで作れるJava/Kotlinアプリケーションで.NETのライブラリを使いまわせるものだ。DLL群からaarを作ってついでにmonoランタイムもパッケージして、実行時はmonoでDLLのコードを実行するやつだ。)

セッションの内容の大まかな内容については、現時点でもざっくり書いておこう。

  • e4kとは? Xamarinとは違う?
  • Background: Mono, NDK, JNI
  • demo2つ(どちらもHello Worldレベルのシンプルなやつ)
  • e4kでできること: 完成度と課題
  • e4k以外のバインディング機構の評価軸。特に
    • ランタイムの堅牢性
    • 明確なバインディング仕様
    • IDEのサポート
    • ライブラリ エコシステムの構築

最後の項目はまだ煮詰まっていない。他のバインディング生態系として、Kotlin、Swift、RubyPythonJavaScript/TypeScriptあたりはちょっとでも言及しておきたいとは思っている(ただ、多分深く触れる時間は無い)。

逆に以下は今回は話さない方向性でまとめている:

  • e4kの使い方の説明
  • e4kのツールチェインを実現する仕組み(Clang, CppSharp, JNA)
  • Xamarin.Formsの埋め込み方のstep by step解説
  • .NETに由来するe4kの事情(正直自信ない。何が「出来ない」かをきちんと筋道立てて説明するためには、ここは省けない気もしている)
  • React Native(RNはそもそも今回議題にするバインディング機構ではなく、2日目にRNのアーキテクチャのセッションがあるのでそちらを見るべき。あと自分が詳しくない)

e4kの最新情報(?)

2017年夏期からの差分(ない)

Embeddinator-4000…と書くと長いのでスライドではe4kと書いている…については、実は昨年8月に行われたJXUG名古屋でも90分くらい(!?)しゃべっている。普段は同じ話題を扱うセッションを2回も行うことはしないのだけど、今回は地域から参加者がかぶらなそうなのと、オーディエンスがガチのXamarinユーザーと生粋のJava/Kotlin系のAndroid開発者で、根本的にターゲットを変えて内容も変えるべきなのと、e4kはまだかなりmoving targetだから半年もあればいろいろ変わって実装もいい感じに整理されてくるだろう…という楽観的な考えがあったためだ。

名古屋ではもともと50分程度だったものが、時間が余っているというので引き伸ばして話してしまったものだったので、今回はシュッとこなさなければならない。そういうわけで、前提知識としてe4kの基盤にあるもの(monoとか)について話す部分は、10分程度に圧縮することにした。大圧縮だ。ここをしっかり説明したところで、その後の内容と関わることは少なく、生粋のAndroiderに響くものもたぶん小さいと思って削った。

さらに、いつもなら事前に長大な資料をまとめてからスライドを書き始めるのだけど、e4kについては、既にExtensive Xamarinに30ページ近い文章をかいてしまっていて(この内容はJXUGの内容にそれなりに近い)、今さらまとめ直すことといったら最新情報と、もう少し踏み込んだ調査くらいだ。

「半年も経てばいろいろ変わる」という読みは完全にアテが外れた。新バージョンのリリースが無く、リリース版を前提として考えると、状況は全くと言っていいほど変わっていない。主に変化していたのはObjective-Cサポートまわりで、Android/Javaまわりは実のところ荒野といっていい状況だ。e4kは米国のMSのイベントのキーノートでも取り上げられる程度に本気度高めでコミットしているプロジェクトだけど、プレゼンテーションのためにXamarin.Formsのライブラリを組み込んだデモまで行ったところから、まるで満足したかのように動きがない…というと言い過ぎだが、コードはゆっくり進捗している。

Formsを動かそう→やめとこ

ともあれ、それならそれで現状に基づいてしゃべるしかない。

e4kでXamarin.Formsが動くなら(まあe4kを使いたいような状況でもXamarin.Formsを使うというのは、わたしは筋悪だと思うけど)、他もいろいろ何とかなって使い物になるだろう、と期待してみると痛い目にあう(あった)。e4kは.NETのライブラリをAndroidiOSのネイティブプロジェクトで「使える」ようにするためのものだ。「使う」ためにはライブラリで提供するAPIは使える状態になってくれないと困る。しかしXamarin.Formsのライブラリ…のうちのAndroidプラットフォーム固有のやつ…をバインドしようとすると失敗する。まだe4kはそこまで完成していないのだ(!)

おかしいじゃん、デモでは動いていたのにバインディングの生成に失敗するなんてありえなくない?…と当然思うわけだが、ここで悟らされた。「ライブラリのコードが動く」のと「ライブラリがバインド出来る」のは完全に別の問題なのだ。Formsを使ったアプリケーションとなるライブラリに「バインド」するのは、Formsの膨大なAPI全てを問題なく「バインド」するより、はるかに簡単なのだ。イベントのデモで動いていたe4kの実体はこれなのだ。

今Formsのようなbait & switchのライブラリをバインドして動かすためには、

という作業が必要になる。これをやる価値があるのは、e4kのデモを見せる時くらいだろう。日々の開発でやるようなことではない。

FormsはUIなので、動くものを見せると見栄えがする。だからFormsを見せたい、というのはわかる。ただ、わたしは、自分で使いたい用途で使えないようなものを無理やり動かしてデモで見せても、あまり意味がないと思っている。

ライブラリの異言語バインディングを問題なく生成するのは非常に難しい。Xamarinでも特に難しい作業のひとつだ。e4kでも難しいのだが、e4kの状況はさらに厳しく、Xamarin.Androidなら可能なAPIメタデータの操作が、e4kではサポートされていない。

再利用可能なエコシステムを構築する(あるいはそれなしでやっていく)ということ

ともあれ、バインド出来ないものがあるのは仕方ない。利用可能なAPIの口だけを用意したライブラリを作って、アプリケーション上ではそれを再利用して組み込めば良い…と思うと、そこにも罠がある。ひとつのAPKに含めることができるe4k由来のaarはひとつだけなのだ。アプリケーションに必要なDLLは全てひとつのe4k呼び出しで生成されるaarにまとめなければならない。この時点で、単独のaarとしての再利用性はほぼ無くなった。単独でMavenに上げて役に立つようなものは、まだ作れない。あくまで自分のアプリケーションの中で使うしかない。

逆に、そこまで割り切っても、ついFormsで実装してしまった複雑なUIを使いまわすことは可能そうなので、技術的にはやはり相応の価値はある。わたしのとりあえずの目的はmscorlib.dllをバインドできて、ろくにリンクしない状態でもaarに含められるようになることだが(と言っても実装は他のエンジニアが仕切っているので、わたしはせいぜいissueを報告したりたまにパッチを書く程度にとどめている)、そこまで出来るようになって、あとライブラリの依存関係と再利用性の問題が解消できれば、それなりにエコシステムを築く土台にはなると考えている。

あと、今回はそんなわけで応用ライブラリのバインディングには手を出さなかったのだけど、e4kで使えるようになってほしいライブラリ群として一連のXamarin Pluginsがある。Xamarinを知らない人向けにひとことで書くと、クロスプラットフォームAPIで、実装側ではプラットフォーム固有のAPIを使えるようにしてくれるという仕組みなので、同じコードがiOS向けのe4kでサポートされるようになれば、きっと楽になるはずだ。ただこれを実現するためには、きちんとbait & switchの仕組みをEmbeddinator-4000.exeが解決できなければならない。今はそこまで出来ていない(はず)。

…という話を本当は踏み込んでやりたいのだけど、多分これは生粋のAndroiderを置いてきぼりにするだけなので、この辺は軽く触れる程度にとどめておこうと思う。

e4kの外側

ここから先はe4k以外のエコシステムに敷衍して話せるような、一般化した話をしたいと思っているのだけど、正直現時点でもどういう議論の方向性にするかは決めていない。あと話の性質的に「オチ」がつかないので(e4k自体については↑の通りで十分にオチがついていると思っている)、最後がgdgdになる可能性がけっこうある。まあ、でも各論で終わるなら避けられないだろう…

隣の芝生は青く見える? 青臭く見える?

ここまでe4kについてだいぶ客観的に評価してきたつもりだけど、e4kはまだemerging technologyであり、ここから何をやっていく必要があるかは見通しておきたい。幸いわれわれはXamairnをゼロから構築してきたので、どういうものが必要になってくるかはだいたい分かっている。

そしてこれは似たような言語間のバインディング機構を構築しようとしている人々にとっても、きっと役に立つ話だ。

プラットフォームAPIへのアクセス: やりたい? やりたくない?

swiftを素材に話を始めよう。今、SwiftをAndroidに持ってきて動かそうとしている人は何人かいる(Swift for Android、SwiftJava、Silverなど、プロジェクトが複数ある)。SwiftをAndroidで動かす目的が、Swiftでアプリケーションを全部書くことだとしたら、今あるものでは全然足りない。AndroidのアプリケーションはJavaAPIを駆使しなければ書けない。SwiftはAppleLLVMエコシステムで発展してきた言語だから、同じLLVMに根差すことになったAndroid NDKとは親和性が高いけど、Xamarinが「全てをC#で」書くのと同じ意味で「全てをSwiftで」書こうと思ったら、Java APIとの相互運用は避けられない。逆にAndroid APIにアクセスしなくてもいい、Swiftの標準ライブラリだけ使えれば良い、というのであれば、現状で十分だろう。

プラットフォームAPIにアクセスしなくてよいのであれば、Pythonなどは確か2010年頃にはもう動いていたし(黒いターミナルもどきが出るやつだ)、V8は動くのだからJSエンジンを使った機構を作るのは(相対的には)簡単だ。

プラットフォームAPIをサポートすると決めたら、バインディングを用意してやる必要がある。手作業でバインドするやり方と、ツールで自動化するやり方だ。後者はとても難しいのだけど、どこかの時点で必ず必要になる。いずれサードパーティのライブラリをサポートする必要が生じるからだ。頻繁に更新されるAndroidサポートライブラリを手作業でメンテする労力を考えてみてほしい。自動化して生成されたパッケージをメンテするだけでも大仕事だ。

そこまでやるのはしんどいので、バインディングを自動化して提供しない、という生き方もアリだ。React NativeやTitanium Mobileはそうやってきた。同じJS/TSに根差すフレームワークでも、NativeScriptはバインディングを提供する途を選んだ。Kotlin/Nativeもそうだ(KotlinはたかだかC APIinteropしか自動化しないので、難易度は相対的には低い。といってもそれも簡単ではないけど)。

バインディング自動化機構: やっていき

バインディング ライブラリは、オリジナルのライブラリがもつ階層的な依存関係を反映した階層的な依存関係をもつことになる。そうしないことも可能ではあるけど、依存関係はたいがい問題が生じないようにオリジナル側で慎重に設計されていることが多い。バインディングでこれをそのまま反映しないと、ユーザーがオリジナルと同様の依存関係に基づいてアプリケーションを構築できなくなるケースが出てきてしまう。必然的に、プラットフォームAPIバインディングも、サードパーティ ライブラリのバインディングも、同じ俎上に載せることになるだろう。

最初から全てを用意しない場合、プラットフォームAPIを呼び出す口は大概どのフレームワークにもあるので、ネイティブAPIを呼び出したいという需要にどれだけ答えられるかは、「使いたいものが最初から(あるいは既に)あるか」「どれだけ簡単に作れるか」にかかっている。最初から無くても、コミュニティが十分に大きければ、コミュニティの誰かがメンテしてくれるかもしれない。そのためには、ライブラリのエコシステムが機能していることが重要だ。gem、pip、npm、nuget、maven、cocoapods…

バインディングの自動化は、注文する側は「自動的に全部バインディングできるようにしてほしい」と気軽に言うだけだけど、そんな夢みたいなものが出てくることは有り得ない。言語間の相違を意識して、なるべくそれらのギャップを吸収できるようにしてやる必要がある。言語間の違いは、およそ開発者が思っている以上に大きい。better JavaC#からJavaを呼び出すのすら大変なのだ。ジェネリクス情報とか消えて無くなってるし。逆向きなんて無理ゲーにもほどがある。

無理ゲーなので、何をサポートして何をサポートしないか、サポートしない場合にどんな回避策やデメリットがあるか、といった事項を細かく気づいて対応できることが望ましい。設計重要。この点e4kはいささか危うい。設計議論も無ければ意思決定も無いように見える。逆にKotlin/Nativeのcinteropを見てほしい。素晴らしい。問題になりそうなコーナーケースはだいたいここに集まっている。

Xamarin.Androidは吸い出したAPI定義に変更を加えてからバインディングを生成するアプローチを採った。Xamarin.iOSは逆で、完成形のコードのスタブを作って、それらにAttributeを付けることで、コード生成時のヒントをそこから提供できるようにした。Kotlin/Nativeではコードを追加したり、バインドするメンバーをツール引数で調整できるようにしたり(ツール引数は設定ファイルからも指定できる)、さらにサポートできないメソッドについても、対応コードを生成した上で「これはサポートできない」というエラーを投げるようにしている。「バインディングツールが期待通りに動かない」という問題は、「期待されたコードが生成されない」と「間違ったコードが生成される」に大別される。サポートされないコードの生成を無視するよりは、生成されたコードに埋め込んでおくほうが妥当だ。

e4kにとっての「入力」は.NETアセンブリだ。アセンブリの内容を自由にカスタマイズするものとしては、mono linkerがある。メンバーの追加は無理だが、削除はできる。e4kはlinkerを内部で呼び出すことはしていないので、e4kに食わせる前にアセンブリをリンクするのが現状では妥当な解ということになる。ツールが分離独立していたほうが良いのかどうかは、正直まだ判断できない。

ビルドツールとIDEによるサポート: 仕上げ

ツールチェインの機能が充足してきたら、そろそろIDEで省力化したい。省力化というのは具体的には

  • 一般的なパラメータ集合のテンプレート化、簡易指定オプションの追加、設定ダイアログなどの追加
  • IDEからのビルド指示(ツールの実行)

くらいだろうか。こういうのをIDEでサポートする場合は、間違いなくアドインで実現することになる。もしIDEの必須機能になることがあったとしても、内部的には必ずアドイン機構を使用して実装する。monodevelopC#エディタなんかがそれだ。C#エディタの無いmonodevelopなんて考えられないけど、IDEそのものはC#エディタが無くても動くし、アドインを無効にすればC#編集サポート機能が無くてもよい。

ただ、IDEサポートは本当に必要だと考えられる場合にのみやったほうがよい。ビルドツールの拡張が先だ。.NETなら(残念ながら)MSBuildAndroidならGradleの拡張によって、ビルドツールをプロジェクトファイルで記述したとおりに呼び出して実行できるようにする。この時、ツールチェイン側も頻繁にコマンドライン オプションの変更があると、追従するのが面倒になる。だからある程度落ち着いてから着手したほうがよい。

IDEAPIを用いた拡張の作り込みは、実のところあまり望ましいとは思えない。GUIで作業したほうが効率的なのであれば、単独で動作するツールを構築したほうがよい。IDE側にも、それなりにGUIを組み込んでホストする仕組みが用意されているので、常に単独で動かさなければならないのか、という心配はあまりしなくてもよい。

機能によっては「IDEでやらざるを得ない」場合もあるが、それは主としてIDEの操作と密着した要件がある場合だ(たとえば、編集中のコードエディタのテキストバッファにアクセスするとか。この辺もlanguage-server-protocolや.NETのomnisharpなどを使うと必須でもなくなってくるが)。バインディングツールの支援機能に、そのようなものが求められることはあまりない。あるとしたらIDEしかプロジェクトの依存関係を提供してくれないような場合だ(e4kはアセンブリの参照解決を自前でやっつけているのでそのような問題はない)。

なぜIDEAPIを使用しないほうが良いかというと、APIの安定性がアテにならないからである。さらに、IDEも含むプラットフォームの開発者としては、一般の開発者にはおよそIDEAPIに安定性を求めないでほしいという気持ちがある。IDEAPIの安定性を過剰に求めると、IDEの進化が止まり、またAPIの互換性を維持するために内部で無理のあるスパゲッティ実装がなされ、実装が不安定になる。変化を嫌うなら一生古いものを使い続けていたほうがよい。

セッションの主な対象者(最後に)

こんな感じで、最後はまとめにくい論考になってしまったので、当日どこに落としどころをもっていくか決め兼ねているのだけど、フレームワークを作る側…あるいはそれにちかいところ…でいろいろ考えて発表する人はDroidKaigiでもほとんどいないと思うので、そういう話に興味をもってくれそうな人にはぜひ参加していただきたいと思っている。もちろんセッション後にも会場をフラフラしている予定なので、e4kに限らず議論したいことがあれば声をかけていただければと思う。

1/27: .NET Fringe Japan 2018(新年会)をやります

今週末、1/27なのですが、2016年以来の.NET Fringe Japanの勉強会を行います。

dotnetfringe-japan.connpass.com

前回みたいなガチガチの深いセッションばかりにはならないので*1「新年会」というゆるふわな名前を鈴木さん @yukitos が設定されたのですが、ただの飲み会かな?という感じにも見えてしまうので、ハッキリ書いておきますが「勉強会」ですw *2

わたしは、今回は2週間後にDroidKaigiもあるので*3、残り少ない人生の時間をセッション詰め込みで費やすわけにはいかないと思い「今回はしゃべらない」と明言してきたのですが、今日の時点で30分セッションが3本の状態だったので*4、さすがに時間がちょっと余りすぎるから15分くらいのショートセッションくらいはやって時間を稼いだ場を繋いだほうがいいかと思い、イベント管理グループの皆さんと相談して、軽くやることにしました。

「.NETプログラムからアセンブリ名が消えるまで」という仮題で、.NET Core 2.0時代のクラスライブラリの設計に関する議論を出すつもりです。あんまり考えがまとまっていないので皆さんと議論できればと思います。入念に事前準備する余裕は作れないので(すみません)、デモなどは最初から考慮せずにしゃべる予定です。既に15分でしゃべれない量になっている気がするのですが気づかなかったことにします…

勉強会自体はまだけっこう席の余裕があるので、.NET方面に関心があってお時間のある方は是非おいでくださいませ。

*1:って書いてしばらく経ってから気づいたけど、長丁場で消耗しないだけで濃さは多分そんなに変わらないな…?

*2:新年会、って付けないと今年の後半にガチ勉強会やるかもしれないから付けているという話もありますね。

*3:こっちはこっちで告知書かないと…

*4:ちなみに正確には4本なのですが、当時1行抜けていたのでした…

2017年とは何だったのか

気がついたら2017年ももう終わろうとしています。1年間、ずいぶん自分の意図とは違うことをやっていたような気がしていて、違和感の正体を探る意味でも振り返りが必要であるように思いました。

Xamarin系同人誌(と商業出版)

自分でも振り返っていて驚いたのですが、技術書典(2)の開催に合わせて自分でXamarin同人誌をやろう、と言い出したのは今年の初頭でした。2回(超を入れたら3回)の技術書典に合わせて、幸いにも延べ10人ほどの執筆者に集まっていただいて、Essential Xamarin 陰/陽、Extensive Xamarinの3冊を出すことが出来ました。

特に当時まだXamarin本インフレ(!)が起きていなかった頃に頒布したEssential Xamarinは大成功で、さらにインプレスR&Dさん経由で商業出版のかたちでもリリースされ、達人出版会さんでも購入していただけるようになりました。実は技術書典3で出したExtensive Xamarinも同様に商業化の作業が進行しています。正式に決まったらまた告知するつもりです。

どちらの書籍も、同時並行で同人誌版が販売されている状態で、実際技術書典3ではブースで商業版も紹介しているにもかかわらず、同人誌版がある程度売れていました。Essential Xamarinは超技術書典に合わせてかなり多く刷ってあり(超書典は参加者が同人誌を見に来たイベントではなかったので単に売れなかったわけです)、Extensive XamarinはXamarin本インフレの渦中で頒布したこともあって前回ほど売れていないので(印刷代がぎりぎり回収できていないライン)、在庫が豊富にある状態です。

xamaritans.booth.pm

基本的にこの活動は赤字前提で進めているのですが、今のところ割ともったいないなーと思っているのが輸送費で、イベントで段ボールふた箱を往復すると数千円かかってしまうので、ちゃんと数を調整しないとなあと思うところです。赤字前提と言っていますが、コストは予測できている範囲ではそれなりに考えていて(印刷所の早割が使えるように締切も設定してあるし…!)、まあ赤字になっていたのは知識・経験不足ゆえですね。

頒布数については、商業版がどれくらい売れているのか、まだ数字を受け取っていないのでわからないのですが、同人版が余っている中で商業化もするという、販売戦略としては悪手を繰り返しているので(商業化とくにオンデマンド出版に関しては、プロフェッショナルの編集が入るというのと著者を商業プロデュースできるという以外のメリットは無いです)、これはアンチパターンなので真似しないほうがいいと思います。利益を出す目的で活動をしたいなら、原稿料をもらえるオンライン記事でも書いていたほうが良いでしょう。

わたしの場合さらに特別な事情として、技術書典当日はイベント本体の運営側スタッフとして稼働しないといけないこともあって、ブースに来ていただいたお客さんと話をする機会が無いんですよね(そこはサークルでお手伝いいただいた共著者他の皆さんに助けていただいています)。来年4/22には技術書典4が開催されますが、どう対応するかまだ決めかねているところです。

Xamarin.Forms訳本と監訳読書会

今年一番自分のリソースを吸い取られたのがこの作業でした。昨年の後半から取り掛かっていたことを考えると、たかだか1600ページ程度(!)の本にとんでもない時間がかかっていますね…(後編が未だに出ていないのはそれなりの理由がありますが、監訳作業自体は9月にはほぼ終わっています)。監訳作業と並行して「監訳読書会」を行ったのが、特筆すべき活動だったと思います。

監訳読書会は、開催して良かったと思っています。毎回10人max程度で募集して、5人以下で進めたり10人を超えたりもたまにありましたが、きちんと議論できる場面が多々あり、かなり読み込んでコメントしてくださった方も数名いらっしゃったので、とても助かりました。

監訳読書会にはさらにチャレンジがあって、原則としてさまざまな勉強会会場としてオフィス等にお邪魔させていただいて開催する、というルールを自らに課していました(上巻と下巻それぞれについてなので、上巻でも下巻でも会場に使わせていただいた会社さんはいくつかあります)。これは特定企業と癒着するようなXamarinのPR活動にならないよう気をつけてのことです。ただ、この縛りは割と厳しくて、毎回どこにしよう…と悩まされる問題でした。幸い多くの方から「うちを使ってもらってかまわない」というお申し出をいただいたので、開催に困るということにはなりませんでした。後半は何度か貸会議室を使っていたのですが、「早く決めないと来週開催できない…! 開催場所で迷って時間を浪費していられない…! 自分で会議室を借り早く募集しよう…!」となっていたためです。

また、勉強会を開催すること自体の負荷とは別に、毎回日経BPさんから訳本の草稿を印刷していただいて送っていただいていたのですが、これが膨大な紙の量になっていて(1000ページ弱の本を10人分刷ることを考えてみて下さい)、これを印刷して送っていただくというのはけっこうな労苦とコストだったはずです。可能なら電子データで進めたいところですが、未出版の本で出版社から見たら得体のしれない参加者に配布となると、なかなか難しいところでしょう。

監訳作業自体には、藤原さん(@yfakariya)に加えて途中から猪股さん(@matarillo)にも参加していただいて、後半特になかなか動けなかったわたしの手が及ばなかった部分を多大に助けていただきました。監訳メンバーとしては外れていますが、田淵さん(@ytabuchi)にも勉強会の開催などでお助けいただきました。

この本に関する詳しい報告は、下巻が出たらまた改めて出そうと思います。いろいろ明らかにしてかなければならない話もあります。

勉強会等のセッション登壇

今年は前年に「しゃべりすぎた」と思っていたこともあって、あまり勉強会に出てしゃべることはしない予定だったのですが、結果的に4回しゃべっていました。

Xamarinを支える技術2017 - これはde:codeという日本マイクロソフト(そろそろ半年くらい出社していない)のカンファレンスの一室で行われたチョークトークとは名ばかり()のセッションだったのですが、これまでmonoのランタイムにきちんとフォーカスを当てた話をしてこなかったので、Xamarin製品に使われている技術がどういう歴史を経て実現できたのか(インタープリタJIT、AOT)、これからどういう展開が期待できるのか(特にwasmまわりなど)、といった話をしました。これは割とアリだったかなと思っています。有償イベントだし社員としてしゃべるセッションでもあったので、ちゃんと前向き()な話にして、それなりにストーリーを用意していった記憶がそこはかとなくあります(チョークトークとは何だったのか…)

Generics on Xamarin products - 6月のジェネリクス勉強会、アツかったですね。クロスボーダーな勉強会で、Xamarinにもいろんな印象をもって参加してきた人が多かったはずで、きちんといろんな言語のバックグラウンドの人に価値のある話を提供できるようハイリョしながら(ホントか?)今年一番気合を入れて用意したのですが、.NETクラスタ以外から「面白かった」という反応が得られたのが嬉しかったですね。この時はランタイムのコードの細かいところまで読みながら資料を書いたので、自分でもめっさ勉強になりました。

シンガポールのmonkeyfestは主にひらのさんと観光に行ってきましたという感じですね。無事海外セッション登壇デビューできてナニヨリだと思いました(!) わたしは台湾COSCUPやMS台湾のカンファレンス以来でちょくちょく英語でしゃべっていたので、まあちょっとひさしぶりかな?という感じでした。内容も昔の仕事プラスちょこっと今の仕事という感じでライトだったし。イベント自体は…まあ技術指向のイベントにならない限り、二度と行かないと思いました。

名古屋ではEmbeddinator-4000の話をシュッとする予定だったのですが、時間が余っていたということもあって結果的にだらだらと説明してしまったので、来年DroidKaigiで最新情報に合わせてシュッとした話をしようと思います。客層が全然違うので、内容はだいぶ違うものになると思います。名古屋の方とお話できたのは良い機会でしたね。(12月にも行ったのですが、即日帰らないといけなくてちと残念でした。)

2018年に向けて

2017年は(主に米国の事情を見つつ)全世界的に高潔に生きようとする者を嘲笑するような1年だったと思いますが、なんとか人としての道を違えずに、筋を通して生きて来られたと思います。

2017年はまわりに無職が増えて(まあ摩擦失業が大半ですが)、わたしもはよ引退したいと愚痴りながら過ごす1年だったのですが、来年こそはできるだろうか、と考えながら過ごすことになると思います。年金暮らししたいなあ。(できません)

引退前にいろいろ自分だけが知っていて伝えるべきことを、きちんと伝えていかないとなあ、と思うのですが、そのためにリソースを費やしていると、次に向けて本来自分が行うべき活動ができなくなってしまうというジレンマがありますね。

いずれにしろ、来年は主軸を音楽ソフトにシフトしていくつもりです(毎年言っている気がする)。何だかんだで素人ですし、目立たない活動になっていくかなと期待しています。技術書典もできればそっちの方向で出していきたいと思っています。今のサークルというか既刊をどうするかというのが当面の問題ですね。

そんなわけで来年もどうぞよろしく。

Kotlin/Native解説 -at- C93:Androidモダンプログラミング

最近twitterなどでもKotlin/Nativeについていろいろ発言していたので何となく察していたという人もいるかもしれませんが、C93(冬のコミックマーケット)のTechBooster新刊「Androidモダンプログラミング」に、今年の春にリリースされて秋にkotlinconfで注目を浴びたKotlin/Nativeについての解説記事を35ページくらい書きました。

techbooster.github.io

たぶん世界で公式サイトに次いで2番めに詳しい解説になっていると思います。

Kotlinプログラミングに関しては素人だし、Kotlinそのものについての解説は1ミリもありません。Kotlinでネイティブアプリを作れるとはどういうことなのか、という部分にフォーカスした内容になっています。これAndroidプログラミングの本ということになっているけど、Android開発についてはKotlin/Nativeはほぼ関係ないと思っていいです。(詳しくは本編で)

詳しく書いていないのはXcodeを使ったiOSプロジェクトの開発方法などですが、年末に日本語で詳しく書かれた記事がいくつか出てきたので、うまい具合に補完し合えていそうに思います。

Kotlinのような「言語から作られた開発エコシステム」が先にあるような状況から、ネイティブアプリケーションを作れる仕組みを用意する、というストーリーラインは、たぶん割といろんな言語開発環境で共通していて、われわれも普段monoをその用途で使っているので、近いところにいるわけですね。とは言ってもKotlin/NativeはLLVMそのもののマナーに乗っかっていて、うちはmonoランタイムをLLVMの流儀に合わせたり、そもそもLLVMを使わずにランタイムとDLLを実行時に解凍してロードするだけ、みたいな仕組みもあったりと、その具体的な手法は一様ではないところです。

Kotlin/NativeはKotlin/JVMからある程度うまいこと切り離されていて、コンパイラJava VMで動作するものに、KotlinのIRからLLVM IRを生成する(そのためのKotlinコードがJVM上で動作するコンパイラプラグインできるように容易されている)のが、われわれ仕組みを眺めたい側としては面白いポイントのひとつですね。

Kotlin/Nativeでわたしにとって一番印象的だったのは、cinteropツールを使ったC APIの自動バインド機構ですね。JavaCPPやJNAeratorのようなものですが(わたしがPInvokeGeneratorでちょっとやってみようとしていることでもある)、仕様が詳しく解説されており、生成されるコードがわかりやすくなるように出来ています。

Kotlin/Native、まだIDEを使ってちゃんと開発できる状態にはなっていないですが、荒削りで勢いがある分野に飛び込んでコントリビュートしたり広めたりするというのはとてもいい経験になると思うので、興味があるという人はぜひチャレンジしてみるといいと思います。(わたしは来年はもっと別の方面に進む予定なので、興味深く眺める程度にしておくつもりです。)

2017年の終わりに感謝する作品集

クリスマスから年末にかけて書いている恒例のエントリです。atsushienoが今年よく聴いた・見た・使った作品を書き連ねて感謝の念を示すものです。例によってatsushienoが「今年知った」ものであって「今年公表された」作品とは限りません。(2016年版

音楽から。

www.youtube.com

今年はたまたま今まで未チェックだったdiverse systemで、とくにFeryquitous作品を聴いていた1年でした。曲提供されているSennzaiアルバムArrêter le tempsは綺麗に作られた曲が多くて、よく流していました。

Feryquitous/Sennzaiどちらの方も冬コミ(C93)1日目に新作が出るようなので買いに行こうと思っています(1日目は技術系同人誌と同じ日)。なんかRayark作品でよく見かけた作曲陣だなーこういうところに集まっているんだなー、というのが見えた1年でもありました。

irui.diverse.jp

www.nicovideo.jp

diverseで出たアルバムで他に印象に残った曲はAD:HOUSE 6のIndigo Coralとかですね。l8 r2..ed.c.<b> c4.c<b.>c.<f g4.gf.e.e^ 4.ed.g.<b^ 8.>cree.f.g f4.fe.b.a^ 8.e.d.cg.f^ f4f.e.e^ e1みたいなメロディとか好物ですね(追っかけていて気づいたけど構成音が全部cdefgabだこれ)

UTAUカバーですげぇ…!ってなったのがNumber Bronseの薄ら氷心中ですね。

www.nicovideo.jp

UTAU方面を真面目に追いかけていなかったので(そんな慣習は無かった)、ここ1,2年ほどでどのように人間らしく歌う打ち込みが簡単になってきたのか分かっていないのですが、けっこうこういう作品が出てきているようですし、シンセサイザーが生楽器の制約を解消したように歌唱合成が肉声の制約を解消する時代が来るのを楽しみにしている勢です。まあそれはそれとして人間のほうを好んで聴いていますが。

次は音楽ではなく動画として…隠された物語が明かされたDeemo 2.0のエンディング。これについては1月に詳しく書いたので繰り返すことはしません。この動画のえらい再生回数とコメント数…(なお、音楽はずっと前から知っていたので選外です)

ソフトウェアの分野では、GPL化したVSTですね。

https://sdk.steinberg.net/viewtopic.php?t=282sdk.steinberg.net

Linux環境でも他の環境と遜色なく音楽制作しようと思ったら、もうWebAudio/WebMIDIにシフトするかVSTを滅ぼすしか無いじゃない!…と思っていたのですが、VST3.6.7から?GPLとのデュアルライセンスになり、自由なソフトウェアからは自由に利用できるようになったのです(そのへんの話は前回のpostで書きましたね)。まだろくに使っておらず、正直まだ使える環境やVST pluginはあまりないんじゃないかとも想像していますが(主に試しているTracktionのVSTプラグインが全然使えていないので)、この辺の意識を転換できたことはかなり嬉しく思っています。これでWindowsに戻らなくても何とかやっていけるようになるかもしれん…

VST3がGPL化されたことを受けて、JUCEコミュニティでもLinux版を出してほしいというリクエストが出ていたりします。JUCEとTouchDesignerはわたしが使ってもいないけどLinux版が出てほしいなあと思っているツールof the year賞受賞作品です(!?)

音楽ソフト関係はlibsoundioとかWaveFormとかいろいろ新し目のものを知ることが出来て、これまではMIDIでしか考えることが出来なかったのが、オーディオまわりもちゃんと勉強する準備が出来てきたかなあという気持ちになってきました。腰を据えて勉強するならやはり退職するしかないかなあという気もしていますが来年も少しずつ詳しくなっていきたいと思います。

…時間的にこんなところでしょうか。来年もまた素晴らしい作品に出会えることを楽しみにしています。

12/25追記: 書籍について書こうと思っていたのをすっかり忘れていた! 今年はダントツでこの2冊でしょう:

gihyo.jp

gihyo.jp

Androidの内奥について、世界でも最先端レベルの書籍だと思います。これ、今年の初頭に独立エントリで書いて載せようと思っていたのですが、途中から多忙になってすっかり機を逃してしまったので、このタイミングで載せておきます。文体変わっちゃうから切り取り線の後は別物だと思って読んで下さい。


非常に刺激的な本で、わたしのようにAndroidアプリケーションをほとんど書かなければそもそも技術書も滅多に読まないAndroid開発者でも、楽しんで読むことが出来た。これを肴に勉強会というか雑談会をやったら面白いんじゃないか、と思っていたのだけど、先日わたしが参加しているまったりAndroid Framework Code Readingに行ったら、案の定この本を楽しんでいる人がたくさんいたので、いろいろ語りたい人がいたら次回参加して語ってほしい(次回がいつになるかはわからないが)。

この本がどういう位置付けなのかは、著者の有野氏が冒頭で自ら明かしているが、Androidのアプリケーションのライフサイクルや、Viewのコードやリソースから描画までの処理モデルといった、フレームワーク部分の詳細を理解することで、実際のコーディング上の問題を解決するためのものだ。一方で、Androidフレームワークについて、ここまで詳細かつ親切に解説している書籍は無いだろう。(日本語で読めるものとしては、邦訳が出版されている「Androidのなかみ - Inside Android -」がある。原著はAndroid 2.x時代のもので、邦訳で追記された内容も4.x時代で、やや古い。)

http://www.personal-media.co.jp/book/comp/288.html

これが中国語圏まで探索範囲を広げるといろいろある。中国語圏には、HTC、AsusHuawei、Xiaomiなど、多数のAndroidハードウェア企業が存在し、低レベルの開発に関心の大きい開発者が多いというわけだ。わたしの手元にある書籍だとこういったものがいくつかある。

ただ、これらの書籍の内容は(わたしは中国語はネイティブからは程遠い話者であることを考慮してもらいたいとして)、かなりの割合で雑な「AOSPからのコードの引用と追跡」が含まれていて、自然言語の解説は時としてびっくりするほど薄い。「ここを追いかければいいよ」というレベルのポインタで終わっているところも少なくない(濃密な解説が書かれている部分もあるだろうけど)。

そこまで考慮すると、この本はコードが少なめになっており、そのぶん各部分の意図が丁寧に説明され、それらが明確な意図(たとえば「どうやって60FPSでListViewを描画するのか」といった目的)を導線として読み進められるようになっている。これは有野氏が自ら「同じレベルの内容を扱う類書に比べると、本書は極めて平易に詳しく解説が書かれています」(P. iv)と書かれているとおりだ*1

第I巻はGUIシステムに、第2巻はActivityとアプリケーションのライフサイクルを中心にまとめられている。GUIに興味のない人は第2巻だけ読むことも多分できるだろう。

この本のもうひとつの魅力は、解説の内容がAndroidにとどまらないところだ。もともと著者の有野氏はMicrosoftWPF関連の開発に携わっていたようだが、GUIシステムにはプラットフォームやフレームワークを問わず共通している部分が少なくない。「他所を見ておく」「他の実装アプローチの可能性を探っておく」ことは、歴史から学ぶという観点でも有意義だ。

法律学に関する書籍が「現行法の解釈」だけを「アレはOK、コレはダメ」みたいに書かれていたら、それは学問として失格である*2。アプリケーションの設計方法について、さまざまなアプローチがあり得るのに「MVVMというのがある」「MVVMではこうする」「コレを使えばいい」とか書いているだけの文章が、退屈でエンジニアの知性を刺激しないのも同様だ。さまざまな部分で「なぜ」Androidの仕組みはこうなっているのか、という説明が含まれているのを見れば、「なぜAndroidはこうなっていないのか」ということも理解できるようになる。かもしれない。なぜGUIシステムはQtやGtk+を使わず独自に構築されたのか。なぜpure Javaなのか。この本は、われわれが「何でだろう?」と思うことにいろいろ答えてくれる。

第1巻の内容は、GUI以外の部分のざっくりとした解説(そのいくつかは第2巻の内容になっている)、タッチイベントの伝播の仕組み、UIスレッドといわゆるメッセージループの挙動、レイアウトリソースからの論理的なViewツリーのモデル構築とそのレイアウト、レイアウトされたViewからOpenGL ESの描画命令表現に変換する処理、OpenGL ESからハードウェアコントローラーへの命令出力…という流れで、グラフィックス処理を行うために必要な処理の大部分を解説し、最後にDalvikバイトコードの実行環境(ART)についても説明してある。

第2巻の内容は、AndroidのActivityはどのように生まれそして死んでいくのか、そのライフサイクルを追うために、アプリケーション開発者も意識するActivityのインスタンス化と複数のActivityをスタックに積む仕組み、それらを生成するためにやり取りされるIntentとその解決のために必要なアプリケーションのパッケージ情報の処理、逆にアプリケーションをkillするために生存優先度を計算するOOM Killerの機構、それらを踏まえた上でひとつのアプリケーションを開始から終了まで実行するZygoteプロセスやその中で動くActivityThread(のmain()メソッド)の流れ、そしてfork元のZygoteプロセスを立ち上げるまでのAndroid(というかLinux kernel)のブートプロセス、などが説明されている。

*1:氏が中華圏の書籍まで目を通していたかは知らないが

*2:山形浩生氏も「CODE」の訳者あとがきで書いているように