iOSDC2017に参加してきた

オマエiOSやらないじゃん?というかそもそもモバイルアプリケーションを開発するやつじゃないじゃん?という感じだけど、iOS開発ツールやObjC/Swiftについては調べたり書いたりすることもあるし(今は技術書典3向けの原稿に書くためにいろいろ調べるフェーズ)、AndroidコミュニティはけっこうわかってきたけどiOSコミュニティはほとんど知らないので、飛び込んでいろいろ教えを請うべきだろうと思って参加してみた。

 

iosdc.jp

Ubuntu使いのAndroid使いのアプリケーション開発しないわたしはあらゆる意味でアウェイだったのだけど(あ、それ.NETクラスタでもそうですかね…)、面白いセッションがたくさんあったしLTもうまいのがたくさんあったし、次回もぜひとも参加したいと思えるいいカンファレンスだった。個人的にはなぜか台湾から来ていたグループとランチしていたり(わたしがセッションやったMOPCON2014のTシャツで来ているのがいて声をかけずにはいられなかった。あと残りはKKBoxの面々だったけど、昔なぜか台北に住んでいた時にCEOのChrisの接待トークをやらされたことが…)、懇親会で中国人クラスタと話し込んだりしていて、あんまりiOS感があったわけでもなかったけど、それはそれでいいんじゃなかろうか。何の業だろうな。

 

今回はいろいろ調べて面白かったAutoLayoutの話を書きたい。1日目のキーノート的なセッションだ。

speakerdeck.com

AutoLayoutを実装しているレイアウトエンジンのアルゴリズムについての解説で、内容はAutoLayoutの制約ベースのレイアウトを実現しているCassowaryというアルゴリズムの説明だった。前段から数式だらけだった(そのうちtwitterのiOSDCまとめとか出来るんだろうと思うけど、「あーそういうことね完全に理解した」(画像略)の流れである)のだけど、それは制約ベースのレイアウトというのが本質的に線形計画問題となるからだ。ということだ。

詳しくはセッション資料にわかりやすくまとめられているけど、AutoLayoutは、複数の「制約」を(優先度を考慮しつつ)最大限満たすレイアウトを自動計算するもので、これは線形計画問題として捉えることができる。線形計画法は日本の最初のソフトウェア特許訴訟(カーマーカー特許)というかたちで知財クラスタにはよく知られている。コンピューターの計算量を最大限に活用して数学の問題を解決する技術だ。今回のセッションでは「複雑な計算をしている(だから計算力のあるマシンが求められる)」という反応がよく見られたが、線形計画問題を高い計算力で解決するというのは伝統的なソフトウェア技術の応用だ。

Cassowaryアルゴリズムというのは、レイアウト問題を線形計画問題の応用として解決する解法と考えれば良さそうだ。そして、レイアウトの問題は特定のGUIシステムに固有のものではないので、さまざまな言語・環境向けのCassowaryの実装が存在しているようだ。AndroidにもConstraintLayoutがあるけど、これもCassowaryの実装だそうだ。

www.bignerdranch.com

もっとびっくりしたのは、Gtkにすら存在していて、それがDiaCanvasが使われていた頃から存在していた、ということだ。2001年なんてもしかしてみんな生まれていないんじゃないの…

sourceforge.net

ちなみにGtk向けにはもうちょっとモダンなやつがあるようだ。

github.com

以前から「AutoLayoutもConstraintLayoutもなんか似ているっぽいしクロスプラットフォームでそれっぽいものを実現できるんじゃないの」と思っていたのだけど、どちらもアイディアが同じアルゴリズムで(先にリンクしたページにあるように)実装の違いはあっても(VisualFormatはAutoLayoutだけのDSLだろう)、レイアウトエンジンが共通化できるというのは夢のある話だ。たとえば、Cで共通コードを書いておいて、それをXamarin.Formsにダイレクトに適用できるということだ。

twitterでは何度か言及しているのだけど、XamarinではCSSのFlexBoxのモデルをCで実装したコードが開発されている。コミットログを見れば分かるけどRubyMotionハカー(lrz)がうちに入ってきてから主に作っていたプロジェクトだ。

github.comFacebookにもyogaというプロジェクトがあって、そっちのほうが有名だと思うけど、Cでレイアウトエンジンを実装しておいて、それを全方面で活用するというやり方は、今後もいくつか出てくるかもしれない。Cassowaryも完全に同じ流れでいけるような気がする。P/Invokeで呼び出すプラットフォーム中立なライブラリを作ってから、それをFormsのレイアウトシステムに合わせるのが楽そうだ。

…とまあ、こういう思索がいろいろ出来た刺激的なセッションだった。わたしはGUIより他にやりたいことがありすぎてこっちまでやる時間は無いと思うので、GUIを作り込むのが好きな人がいたらおひとつどうですかね?

 

追記: 更にいろいろあることを教えていただいた:

 QtもAngularもある…! すごい。