Sansan Tech Blog

Sansanのものづくりを支えるメンバーの技術やデザイン、プロダクトマネジメントの情報を発信

iOSDC Japan 2018 でLT登壇しました!

こんにちは。Sansan事業部で法人向け名刺管理サービスSansanのiOS / Androidアプリの開発を担当する栗山です。

去る 8月30日(Opening Party含めると8月29日!) から 9月2日の期間で、日本最大級のiOS開発者の祭典である iOSDC Japan 2018 が開催されました!

私もSansanエンジニアとして参加してきました。

さらに今回はただの参加ではなく、なんと最終日にLT登壇させていただきました!

まさに お祭り という言葉が似合うような、とても楽しい時間を過ごすことができました。

今回は、そんなiOSDC 2018の模様と私自身のLT発表についてレポートします!

会場・ブースの様子

Sansanも含む、入口付近にあるスポンサーブース周辺は静かな時間が一切なく、終日活気が溢れていました。私もブースに来ていただいた方や他のブースの方と楽しく談笑していました。

Twitter上に写真付きのツイートあったので、ツイートを交えながら当日の様子を紹介します。

こちらは実際に発表が行われた会場の一つです。こちらの会場が最も広いですが、こちらの会場を含め、当日は4つの会場を同時に使って発表が行われてました。

私が発表した最終日のLTでは、上記写真の部屋と隣の同規模の部屋の壁を取り払って一つの部屋にして発表が行われました。私は今年3月に開催された try! Swift Tokyo 2018 でもLT発表を行いましたが、そのときと同じくらいの大きさの部屋になっていて、部屋に入った瞬間から一気に緊張感が高まりました。

こちらがSansanブースになります! 遊びに来ていただいた方や両隣のブースの方とお話でき、とても楽しかったです。

ブースにお越しいただいた皆さま、ありがとうございました!

LT登壇について

ここからは、私のLT発表について紹介します。

テーマは グラフィックス以外の分野でのMetalの可能性 です。

MetalはiOSやmac OSでGPUを使うためのFrameworkです。Metalの主な用途としては3Dグラフィックスですが、本プレゼンは画像処理を題材にMetal (GPU) を活用方法について探るような内容でした。

また、発表ではOpenCV という、非常に有名な画像処理ライブラリのiOS版に含まれる画像処理と同等の処理をMetalで実装した上で処理速度を比較してMetalの有用性を検証しました。

発表時間が5分なので踏み込んだ内容を話せたわけではなく、またMetal初心者だったことから複雑な画像処理のシェーダ実装までたどり着けませんでした。このことから、途中から路線変更して Metal Performance Shader に含まれる画像処理の中でOpenCVに同等の処理があるものをピックアップして比較を行いました。

検証アプリのソースコードは下記にあります。Xcode 10 beta 6 を使ったので、Xcode 9 以下の場合はビルドエラーが発生するかもしれません。

github.com

なお、シェーダの実装やMetal Performance Shaderの実装していく上でいくつかの知見が得られたので、別途まとめ記事を作りたいと思っています。

なぜこのテーマで応募したのか?

一言で言うと リベンジ です。

実は、1年ほど前に開催された Power Apps 活動 という当社アプリエンジニアの技術研鑽活動 (ざっくり言うと社内ハッカソン的なイベントです) において、Metalを使って画像処理を実装することにチャレンジしたのですが、シェーダーを書いた経験がまったくなかったため、時間内にGPUに渡した画像データを加工するところまでたどり着くことができませんでした。

その後、色々とあってMetalを使う機会がありませんでしたが、堤 修一さん (@shu223 さん) が Metal入門 というMetalの本を今年出したこともあって、今回CfPを書くにあたって、Metalをテーマにする千載一遇のチャンスだと考え、思い切って応募しました。

booth.pm

ビギナーズLT練習会

他の方からフィードバックをもらいたいなと思っていたとき、運営の方からビギナーズLT練習会のお誘いがありました。メインはビギナーズLT参加者でしたが、枠が余れば通常LT登壇者も参加できるとのことだったので、思い切って参加してみることにしました。

結果的に参加して本当に良かったです。百戦錬磨のプレゼンエキスパートである、実行委員長の長谷川さんをはじめとする運営スタッフの皆さまにフィードバックをいただきつつ、内容のブラッシュアップをすることができました。

ビギナーズLTというだけあって、LTをやるのが初めての方ばかりとのことでしたが、皆さんお上手でした! スライドのデザインも洗練されていて、見ていてとても勉強になりました。何より、LTを成功させようというモチベーションも高く、共通目標のもと集まった仲間と言っても良い存在で、自分自身とても良い刺激になりました。

余談ですが、実は練習会終了後に検証アプリの処理に一部誤りがあったので、再検証と結論の内容変更を行ったのですが、LT練習会の段階で結論以外の話の流れは決まっていたので、本当に助かりました。

発表当日

資料自体は発表2日前くらいにほぼ完成しましたが、LT練習会が終わってからは再検証のためのアプリの改修や資料の手直しに明け暮れたためにあまり発表練習できず、当日会場入りしてから時間ギリギリまで一人で発表練習を繰り返していました。

LTセッション開始直前に会場入ってからはとにかく緊張していましたが、休憩時間中に接続確認でステージに上がってからはLT練習会でお世話になった運営の方や同じくLT発表を行った仲間達の励まし、そして発表前に一口だけ飲んだビールによって、良い状態で発表に臨むことができました。

f:id:kotetuk:20180907205246j:plain:h400

f:id:kotetuk:20180907205305j:plain:h400

練習会では6分近くかかっていましたが、本番ではオーバーすることなく、無事5分以内に発表することができました。

発表を振り返って

VGAアダプタ相性問題

来年もし同じ会場で発表することになった場合に備えてTipsを一つ。

発表する機器の関係上、発表者はVGA接続できるアダプターを用意する必要がありました。

しかし、アダプターと会場の機器の相性の問題か、上手く接続できないケースが見受けられました。

相性は会場の機器・アダプター・そして発表者のmacとの掛け合わせとなるため、あくまで参考情報とはなりますが、下記のアダプターは私のMacBook Pro (15インチ, 2016) では問題なく接続できました。Apple純正ではありませんが、VGA, HDMI, DVI, DisplayPortにまとめて対応しているので、これ1台でどのような環境でも対応できるので、USB-C勢にはオススメです。

www.sanwa.co.jp

Deckset

Decksetは、Markdownを使ってプレゼンスライドを作ることができるツールです。iOSDCにおいても、Decksetを使って発表している方を見かけました。

www.deckset.com

私はLT練習会で運営の方に教えていただいて知ったのですが、Markdownなので変更履歴を残すのも容易ですし、シンタックスハイライトもあり、デザインも割とおしゃれなものが揃っているので、良さそうに思いました。

欲を言えば、Keynoteへ変換する機能があると良いですが、別に変換しなくても十分に使えるツールだと思います。

次回発表する際はDecksetを使ってみたいと思います。

Metalについて

今回の発表を通じて、昨年の自分がなし得なかった、Metalシェーダーを使った画像処理の実装に成功しました。

ただ、これはまだ通過点でしかなく、本来自分がやりたかったもう少し難易度の高い画像処理がその先にあるので、引き続きMetalによる実装の知見を深めていきたいです。

また、iOSエンジニアの方なら既にご存知かもしれませんが、iOS12以降OpenGLがdeprecatedになります。

applech2.com

Sansanアプリにおいても、GLKViewを使っている箇所があるため、将来的にMetalを使った処理へ置き換えるための先行投資になったのではないかと思います。

気になった発表ピックアップ

今年も興味深い発表ばかりでしたが、いくつかピックアップして特に興味深く感じたトピックスをご紹介したいと思います。

安定したチャットを実現するためのアプリとAPI設計 (Muukii さん)

Sansanアプリでもチャット機能が搭載されており、その意味でも大変興味深い発表でした。

Timeline Pagination

チャットのメッセージを取得するAPI設計に関する内容です。

発表中では、 メッセージ取得APIの方式として、Offset Pagination方式と、このTimeline Pagination方式が紹介されていました。

Offset Paginationの場合は、Offset(取得開始位置)とLimit(一度に取得する最大サイズ)を駆使してデータを取得していく方式です。スライドの図にあるような、リストの先頭に最新のデータを追加するようなデータ構造の場合は確かに向かないなと思いました。

対して、Timeline Paginationはユニークパラメータ(メッセージの場合は投稿日時のタイムスタンプを想定)を使って範囲指定する(oldestとlatest)ことによってデータを取得する方式です。

SlackもTimeline Pagination方式でメッセージを取得することができるようです

Timeline Paginationは頻繁にレコードの追加が発生する場合にはOffset Paginationよりも効率的、かつ漏れなくデータを取得できると思いました。

発表では触れられませんでしたが、既に投稿済みのメッセージ内容の変更やメッセージ自体の削除が発生する場合のプラクティスについてもぜひ聞いてみたいなと思いました。

・・・と言いつつ、色々と考えてみましたが、SlackのReal Time Messaging APIのようなWeb Socketを使ったAPIを使うのがやはり良いのかなと思いました。

ただ、技術面やシステム構成的な制約からRESTfulなI/Fで実現しないといけない場合もあるので、その場合はメッセージの更新については投稿日時と更新日時の組み合わせ、削除の場合はアプリ側のデータと取得したデータを照合するか、または削除フラグのようなものを使うことで上手くいきそうな気がしました。

Growing TextView

チャットにおけるテキスト入力UIの話です。興味深いというよりは、思い出深いトピックでした。

Sansanアプリにおいても、Growing TextViewのようなテキスト入力UIがあります。発表で紹介されていたUIと同じく、改行に応じた伸縮と伸縮上限があり、実装が大変だったことは記憶しています。

Slackはもちろんのこと、LINEや「Workplace Chat by Facebook」などの似たようなUIのチャットアプリを参考に実装しました。

ちなみに、Slackが SlackTextViewController というライブラリを公開しています。

github.com

私も、Growing TextViewの開発に入る前にこのライブラリのことは調べていたのですが、表現したいUIとは異なっていたことや、Objective-C実装であったことなどから、あえなく見送りました。

iOSマイクロインタラクション入門 (kiwi さん)

マイクロインタラクションの概要や他社アプリの事例を交えてマイクロインタラクションを解説しており、非常にわかりやすかったです。

※ 発表者のkiwiさんがこちらの発表に関するブログ記事を執筆されているので、併せてご覧いただければと思います。

iOSDC2018で「iOSマイクロインタラクション入門」というタイトルで登壇しました | ニフティものづくりブログ

ユーザが行った操作に対するアプリ側からのフィードバック(インタラクション) が発表のテーマです。ユーザの操作に対して、操作の邪魔にならない程度 (程度の差はアプリのジャンルや用途によって変わるのかなと) に心地く感じてもらえるようなフィードバックを付加することによって、アプリの使い心地 ( 使い勝手 ではなく 使い心地 であることがポイント) を向上させていこう、という話だと私は受け取りました。

マイクロインタラクション

マイクロインタラクションは ユーザが操作を行った際のシステム側からのちょっとしたリアクション のことです(発表資料の内容から意訳)。

発表では、マイクロインタラクションの例として、ユーザがボタンを押した際にボタンが伸縮するようなアニメーション(Instagramのいいねボタン)や、次の画面に合わせて位置の変更や拡大・縮小を行いながらの画面遷移(Pinterestやminneの画面遷移)を一例として紹介していました。

アプリ側から適切にフィードバックすることの意義

下記のマイクロインタラクションについての解説記事では、 そのようなインタラクションは条件反射のようなもので、ユーザーはインタラクションに対して何かご褒美をもらっているように感じます。 という一説があります。この ご褒美 というのが、 操作に対する心地よさ = マイクロインタラクション にあたります。ある操作に対するインタラクションがユーザにとって心地よいと感じてもらうことができれば、そのユーザがもう一度同じ操作を行うための動機付けとなるかもしれません。

uxmilk.jp

ちょっとしたリアクション とあるように、マイクロインタラクションはアプリの本筋の機能ではなく、本筋の機能の補助的な役割や、飾り付けの意味合いが強いのではないかと思います。ですが、だからといって疎かにして良いというわけではなく、アプリを長く使ってもらうためには重要な概念なのではないでしょうか。

終わりに

1日目に子供が高熱を出すアクシデントがあり(最終日には無事熱もおさまりました)、懇親会やスピーカーディナーには残念ながら参加できませんでしたが、それでも自分にとっては本当に楽しいひとときを過ごすことができました。

これまでのiOSエンジニア人生でお世話になった方と再会できたこともそうですし、スピーカーの皆さんから良い刺激を受けることもでき、長丁場でしたがあっという間でした。

運営のみなさまには、このような貴重なカンファレンスを主催していただいたことに心から感謝申し上げます。

来年も iOSDC が開催されることを心から願いつつ、来年の iOSDC でまたお会いしましょう!

© Sansan, Inc.