try! Swift Pre Talks 2019 に参加しました

ディー・エヌ・エーで開催された try! Swift の前夜祭的なイベントについての報告です。
ほとんどの発表について資料を展開していただいているので、リンク集としてでもお役に立てば幸いです。

# イベント概要

ディー・エヌ・エーで開催された、コミュニティ有志による try! Swift 関連イベント。
try! Swift Tokyo 2019 に応募されたCfP（Call for Paper）では見送りになってしまったものの、聞きたかったトークをコミュニティ有志がお願いして登壇してもらうもの。

## イベント名
[try! Swift Pre Talks 2019][event]

## Twitter ハッシュタグ
[tryswift_pre][twitter]

## 発表テーマ／登壇者

| 発表テーマ | 登壇者 |
|:--|:--|
| [継続渡しと契約による設計][slide1] | [takasek][takasek] |
| [次世代の非同期処理はこうやって使い分ける！][slide2] | [Yuta Abe][Yuta Abe] |
| [iOS SDKの歴史からSwiftでのAPI命名について考える][slide3] | [Kento Nagata][Kento Nagata] |
| [Swift4.2で追加されたDynamic Member Lookupを使ってみよう][slide4] | [Tamappe][Tamappe] |
| [あなたはどう書き、なぜそう書くのか？][slide5] | [shiz][shiz] |
| Further tests - testing basics | [ha1f][ha1f] |
| [Xcodeの Debug Memory Graph を使った華麗なるデバッグ][slide7] | [po_miyasaka][po_miyasaka] |
| [Swift における経過時間の計測][slide8] | [Yuto Mizutani][Yuto Mizutani] |
| [アプリの起動速度と Dynamic/Static Framework の関係を紐解く][slide9] | [Shota Kashihara][Shota Kashihara] |
| [try! swift-sh][slide10] | [Satoshi Nagasaka][Satoshi Nagasaka] |
| [Implement P2P connection and stream your content][slide11] | [Yuki Yamamoto][Yuki Yamamoto] |
| [Swiftを利用したサーバレスアプリケーション開発の可能性][slide12] | [Yu Tawata][Yu Tawata] |
| [Developing Apple Pay In-App Provisioning With Sandbox App][slide13] | [kenmaz][kenmaz] |

# 詳細

詳細は資料を見ていただくとして、簡単な概要と所感だけまとめさせていただきます。

## はじめに
コミュニティを代表して、[d_date][d_date]さんによるイベントの紹介。

## スポンサートーク（DeNA）
勉強会に開催、スポンサーも積極的にやっていて、iOSDCに11名、try!swiftに4名の登壇者を出しているとのこと。
今年のtry!swiftではLLDBのチートシートを配ってくれるようです。

## スポンサートーク（twilio）
英語での会社の紹介に続けて英語でのデモンストレーションをしていました。
サーバー上のSwiftのコードにより、電話のコールをアプリに中継していたっぽいです。
コーディングから動作確認まで実演してくれました。

## 『継続渡しと契約による設計』
[発表資料][slide1]

[iOSアプリ設計パターン入門][ios_architecture]の著者の一人の[takasek][takasek]さん。
ざっとまとめると、継続渡しというのは関数の引数に処理を渡すことで、処理を渡された関数の実装の不備をコンパイルで気づけないので、非同期処理の続きの処理をクロージャで渡さずに（＝継続渡しせずに）Rxなどを使うことでコンパイル時にミスに気付けるようにしよう、という感じです。

継続渡しという単語を知らず、資料にある失敗例も見に覚えがあったので、参考にしようと思いました。

## 『次世代の非同期処理はこうやって使い分ける！』
[発表資料][slide2]

最近は皆Rxを使って非同期処理を簡単にかけるようになったが、果たして本当に簡単なのか、という流れから、Swift5で導入されるasync/waitの紹介へ。async/waitはPromise、RxはStreamと考えられ、単純な非同期処理ならStreamではなくPromiseで十分ではということでした。

確かに、RxのSingleで書いていたところはasync/waitにするとわかりやすくなりそうですね。

## 『iOS SDKの歴史からSwiftでのAPI命名について考える』
[発表資料][slide3]

API命名についての参考として、Swiftの[API Design Guidelines][api-design-guidelines]は非常に重要、かつ実際の参考としてiOS SDKやCocoaが参考になり、最近のiOS SDKのアップデートでもガイドラインに沿ってAPI名が変更されているという紹介。

命名規則などもあったりしますが、Swiftらしい命名という観点は忘れがちなので、たまにガイドラインやSDKのコードを読まないと。

## 『Swift4.2で追加されたDynamic Member Lookupを使ってみよう』
[発表資料][slide4]

タイトルの通りDynamic Member Lookupの紹介ですがこれも知らなかったです。
コンパイル時に存在しないプロパティに対してドットでアクセスできるというもので、プロトコル拡張やPythonとの連携考慮など使い方がいろいろありそうです。

## 『あなたはどう書き、なぜそう書くのか？』
[発表資料][slide5]
[stzn/Analytics][analytics]

コードを改善していく中でenum,struct,protocolなど役割を考えて使っていきましょう、ということでしょうか。
サンプルも共有していただいているので参考にさせていただければと。

## 『Further tests - testing basics』

うろ覚えなのであまり参考にならないかもしれませんが、タイトルに有る通りテストコードのノウハウについてです。
Qiitaにも書いているというのは[こちら][xctest]と思われます。

## 『Xcodeの Debug Memory Graph を使った華麗なるデバッグ』
[発表資料][slide7]

Memory Graph でデバッグするためのLLDBコマンド[vinfo][vinfo]を作ったという紹介。
Memory Graph に表示される任意のオブジェクトのプロパティやメソッドにアクセスできるようになるというもので、コードを編集せずにいつでも呼び出し可能で、View Hierarchy でも使えるスグレモノです。
発表ではデモもあり、時間的な制約からスピード感もありかなり盛り上がっていました。

試しに使ってみましたが、実際にbackgroundColorを変更できたりして楽しいです。
デバッグ時の解析の手法の一つとして使わせていただきます。

## 『Swift における経過時間の計測』
[発表資料][slide8]

研究者の方ということで時間計測がテーマ。
反応時間計測とタイマー処理についての実装と遅延の関係とヒトの認識について。
タッチの検出レートというのはあまり意識したことがなかったですが（単純に処理の遅延くらいとしか）、精度が求められる計測ではハードウェアレベルでの遅延の考慮が必要ですね。

## 『アプリの起動速度と Dynamic/Static Framework の関係を紐解く』
[発表資料][slide9]

XcodeのでFrameworkの扱いの歴史に始まり、DynamicなものとStaticなものについてのg特徴や使い方をわかりやすくまとめてくれています。

環境変数「DYLD_PRINT_STATISTICS」をセットすることで起動時の各ロード時間が表示されることや複数のDynamic FrameworksをStatic LibraryにまとめてDyldのオーバーヘッドを少なくできるというのは興味深かったです。

## 『try! swift-sh』
[発表資料][slide10]

Swiftでスクリプト書いてますか？という問いかけに始まり、[swift-sh]の紹介をしてくれました。

まだまだiOS/macOSアプリ開発向けの言語としての認識がほとんどなSwiftですが、スクリプトもSwiftでかけるのならその方が便利ですし楽しいですね。

## 『Implement P2P connection and stream your content』
[発表資料][slide11]

ストリーミング市場の話とMultipeer Connectivityを使ったP2Pの実装、Google Castに関する発表でした。

最近はこの辺りの情報には疎いですが、かなり昔は組み込みでレコーダーを作っていたのでちょっと興味がわきました。

## 『Swiftを利用したサーバレスアプリケーション開発の可能性』
[発表資料][slide12]

AWSのDynamoDB・LambdaとSwift5の組み合わせでサーバーレスなシステムを構築するという話ですね。
UbuntuにSwift5を入れたDockerコンテナを呼び出すようです。

理解しきれてはいませんが、新たな可能性を見たような気がしました。

## 『Developing Apple Pay In-App Provisioning With Sandbox App』
[発表資料][slide13]

Apple Pay In-App プログラミングとSandboxアプリでの開発について。
発表したのはメルカリの方で、Sandboxアプリというのはメルカリの個々の機能を単独で動くフレームワークに分割し、それぞれのフレームワークだけを組み込んだミニマムなアプリということのようです。
すべてをビルドしてテストするよりも効率がよく、TestFlightにアップロードするにもバイナリが小さい方が処理が早くて待ちが少ないのだとか。

Sandboxアプリが作れるようなアーキテクチャになっている事によるメリットは他にもありそうでもっといろいろ聞いてみたいところ。

#### おわりに

まさにライトニングトークというべきか、勢いのある発表が多く、try!Swift 向けの資料というのもうなずけるものだったと感じました。
正直なところ理解しきれていないものも多いので興味を持ったものから調べて習得していきたいと考えています。

[event]:https://tryswifttokyo-aftertalks.connpass.com/event/120987/
[twitter]:https://twitter.com/hashtag/tryswift_pre?src=hash

[d_date]:https://twitter.com/d_date
[takasek]:https://twitter.com/takasek
[Yuta Abe]:https://twitter.com/yutaabe200
[Kento Nagata]:https://twitter.com/ngtknt
[Tamappe]:https://twitter.com/tamapppe
[shiz]:https://twitter.com/stzn3
[ha1f]:https://twitter.com/_ha1f
[po_miyasaka]:https://twitter.com/po_miyasaka
[Yuto Mizutani]:https://twitter.com/expensive_man
[Shota Kashihara]:https://twitter.com/oakland76
[Satoshi Nagasaka]:https://twitter.com/satoshin21
[Yuki Yamamoto]:https://twitter.com/redryerye
[Yu Tawata]:https://twitter.com/yuta24
[kenmaz]:https://twitter.com/kenmaz

[slide1]:https://speakerdeck.com/takasek/20190319-number-tryswift-pre
[slide2]:https://speakerdeck.com/yutaabe200/ci-shi-dai-falsefei-tong-qi-chu-li-hakouyatuteshi-ifen-keru
[slide3]:https://speakerdeck.com/ngtk/swift-api-design-learning-from-cocoa-api-changes
[slide4]:https://speakerdeck.com/tamappe/swift4-dot-2dezhui-jia-saretadynamic-member-lookupwoshi-tutemiyou
[slide5]:https://speakerdeck.com/shiz/anatahadoushu-ki-nazesoushu-kufalseka
[slide7]:https://speakerdeck.com/miyasakakazutoshi/xcodefalse-memory-graph-woshi-tutahua-li-narutehatuku
[slide8]:https://speakerdeck.com/expensiveman/swift-niokerujing-guo-shi-jian-falseji-ce
[slide9]:https://speakerdeck.com/shotakashihara/static-frameworks
[slide10]:https://speakerdeck.com/satoshin21/try-swift-sh
[slide11]:https://speakerdeck.com/redryerye/implement-p2p-connection-and-stream-your-content
[slide12]:https://speakerdeck.com/yuta24/try-serverless-app-with-swift
[slide13]:https://speakerdeck.com/kenmaz/developing-apple-pay-in-app-provisioning

[ios_architecture]:https://peaks.cc/iOS_architecture
[vinfo]:https://github.com/po-miyasaka/LLDB
[analytics]:https://github.com/stzn/Analytics
[api-design-guidelines]:https://swift.org/documentation/api-design-guidelines/
[xctest]:https://qiita.com/_ha1f/items/3d4a4b9c18d1461cab50
[swift-sh]:https://github.com/mxcl/swift-sh