try! Swift Tokyo 2017 に参加した&リンク集

3月2日から3月4日にかけて、try! Swift Tokyo 2017というSwiftの技術カンファレンスが開催されました。
タイミング的な問題で個人でチケットを買ったのですが、会社の業務として参加してきました。
https://www.tryswift.co/tokyo/jp

Swiftも昨年9月13日にバージョン3.0がリリースされどんどん改善が進んでいます。[Swift Programming Language Evolution](https://github.com/apple/swift-evolution)

多くのiOS開発者がSwift 2.3からマイグレーションを行う必要がありましたが、
今までのObjective-CやCocoa系フレームワークのルールをひきづっていた様々な規則などが削除されたり、swift standard libraryのように洗練されたりし、よりモダンになりました。

そんな中、世界中からSwift開発者が会場に集まり、言語仕様やアプリの話だけではなく、
機械学習やServerSide Swift、プロダクト作りにおけるモチベーションの話など多岐に渡る様々なジャンルの話を聞けました。

## try! Swift Tokyo 2017

前回のtry! Swift Tokyo 2016の時は渋谷でしたが、今回は新宿（最終日のハッカソンやワークショップは神田)で開催されました。

今回は732人が参加し、去年の536人より多いようです。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">去年より参加者が増えました！！ <a href="https://twitter.com/hashtag/tryswiftconf?src=hash">#tryswiftconf</a> <a href="https://t.co/MuVee3G6rQ">pic.twitter.com/MuVee3G6rQ</a></p>&mdash; にわタコ (@niwatako) <a href="https://twitter.com/niwatako/status/837103194316558336">2017年3月2日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

発表は英語もしくは日本語で行われますが、通訳用のレシーバーを受け取れば、同時通訳で問題なく聞くことができました。(どうやらIT専門の翻訳企業のようです)

また、朝食やコーヒー、昼食の弁当が振舞われました。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">Coffee and snacks are placed at the back of the hall. Feel free to have it!<a href="https://twitter.com/hashtag/tryswiftconf?src=hash">#tryswiftconf</a> <a href="https://t.co/uNP6ZynX7C">pic.twitter.com/uNP6ZynX7C</a></p>&mdash; try! Swift (@tryswiftconf) <a href="https://twitter.com/tryswiftconf/status/837083671148523522">2017年3月1日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

try! Swiftのキャラクター

これ聞き逃してたのですが、　名前 `Riko` に決まったそうです。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">try! Swift Bird の名前はどれがよいですか？What should we name the try! Swift bird?</p>&mdash; try! Swift (@tryswiftconf) <a href="https://twitter.com/tryswiftconf/status/837091147977629696">2017年3月2日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">Meet Riko 👏👏👏 Thank you <a href="https://twitter.com/yucovin">@yucovin</a> for the design &amp; <a href="https://twitter.com/zen_prog">@zen_prog</a> for the name! <a href="https://twitter.com/hashtag/tryswiftconf?src=hash">#tryswiftconf</a> <a href="https://t.co/P7Ukte8rl6">pic.twitter.com/P7Ukte8rl6</a></p>&mdash; try! Swift (@tryswiftconf) <a href="https://twitter.com/tryswiftconf/status/837493205495123968">2017年3月3日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

今年も、 [id:niwatako](http://niwatako.hatenablog.jp/about) によるまとめがあります。ありがたいです。

http://niwatako.hatenablog.jp/search?q=tryswift

## tl;dr

* スライドへのリンクは、公開されているもののみ挙げてます。try! SwiftのSlack等参加者にのみ公開されているものは除いてます。
* Android/Linux/Raspberry Piなど様々なプラットフォームで動作する事例が紹介されていた
* クライアントサイドだけでなく、機械学習、コマンドラインツール、サーバサイドなどの事例も増えてきた
* Swiftは型システムが強力で安全性に寄与し、表現力豊かに実装できる
* 色覚異常のカラーフィルターは、iOS 10の設定で実は用意されている！
* ドキュメントに書かれていることを鵜呑みにせず試してみるのは大切(マイナーバージョンの違いでも)
* レイヤードアーキテクチャや実装などの発表で、反論があることを織り込み済みで説明してるのはすごい
* C言語の資産をSwiftから扱える。必要であれば移植することも考えられる。
* コマンドラインツールとして作成する場合、コンパイルして実行することの他に、スクリプト言語のように実行することも可能
* 技術以外に、チームの生産性の話やプロダクトづくりのプロセス、体験談なども聞けた
* 関数などの動作確認で、依存対象をグローバルな `strut Environments` で定義してまとめるのは副作用やco-effectも減らせるし、差し替えられるし良い
* Swift Enumの様々な活用事例が多くのセッションで挙げられていた
  * 値も格納できる(Associated Values)
  * indirectで再帰的にenumを格納できる(LinkedListの事例)
  * 処理の状態管理(ViewやAPIのリクエストなど)
  * まとまりのないフラグ管理を減らせる
  * Result型の成功ORエラーの表現(APIレスポンスなど)
  * 返り値をわかりやすく(Emailのドメイン部分の分割結果の返り値の事例)

ネームプレート

![IMG_0017.jpg](https://qiita-image-store.s3.amazonaws.com/0/2197/7bb7f07a-d3d0-151b-c90e-5b56037c9178.jpeg)

カンファレンスバッグ

![IMG_0018.jpg](https://qiita-image-store.s3.amazonaws.com/0/2197/6f504d24-da0d-4720-bbf8-91f9f7d918ee.jpeg)

## 1日目

8時30受付開始で、会場に入りネームプレートや翻訳用レシーバーを受け取りました。
9時45から開会しました。
ちなみに会場の前の方の席は机がありましたが、後ろの方の席は椅子のみしか用意されてませんでした。

### [Swift開発者が知りたかったけど聞きにくい機械学習のすべて](https://www.tryswift.co/tokyo/jp#machine-learning)

最初のセッションとしてスタートしました。
機械学習はUI Designと似ていると話していたのが印象に残っています。

* 何がワークするか証明できない
* 直感で始まる
* Refined through experiment(経験を通じて洗練される)
* 98%正しければ成功

### [SwiftのPointy Bits](https://www.tryswift.co/tokyo/jp#swift-pointy-bits)

Swiftの安全性とは、クラッシュからの安全性とかではなく予期せぬ挙動を防ぐためのものと説明されてました。
言語の安全性サポートの恩恵を受けずに自分でコントロールするには、UnsafeAPIで直接メモリアドレスを扱うようにもできます。
直接アドレスを扱うケースとして2通り挙げられます。

* C言語のライブラリを扱う
* パフォーマンスの向上

### [アプリを新次元に導く3D Touch](https://www.tryswift.co/tokyo/jp#3d-touch)

機能対応するとAppStoreのフィーチャーに乗る可能性があると言っていました。(3D Touch 対応 App)

簡単に実装できるので、よく使われる機能のショートカットとして最適で、アイデア次第では有効に活用されると思われます。

* Home Screen Quick Actions
* Widget(Today Extensions)
* Peek & Pop
* Custom UIPreviewInteractions
* Notification Content Extensions

### [SwiftのWeb APIとアプリをともに構築する](https://www.tryswift.co/tokyo/jp#kyle)

* [Building a Swift Web API and Application Together // Speaker Deck](https://speakerdeck.com/kylef/building-a-swift-web-api-and-application-together)

ネイティブアプリを運用する上でのWeb API設計の話をされてました。

* APIバージョニング
* 呼び出すべきアクションをAPI側でコントロールする [RFC 5988 - Web Linking](https://tools.ietf.org/html/rfc5988)
* APIの仕様書

### [Realmを使ってコラボレーションアプリを作る](https://www.tryswift.co/tokyo/jp#realm)

* https://speakerdeck.com/marius/craft-collaborative-apps-with-realm-jp-plus-en

ユースケースを介してRealm Mobile Platformsの紹介がありました。
話の内容も有意義だったのですが、スライド表紙の英語日本語両対応のレイアウトが素晴らしかったです。

![image](https://qiita-image-store.s3.amazonaws.com/0/2197/be5a6610-9140-a970-b98b-7519bcd55f1f.png)

### [独自のツールを構築する](https://www.tryswift.co/tokyo/jp#build-tools)

ReactNativeを導入した背景やどのような場合にReactNaviveを使うのが良いか説明されてました。

* Web開発者とエッセンスを共有できる
* 凝ったアニメーションなどないアプリで、APIから取得したデータを表示するアプリに導入するのが良い

## 2日目

9時受付で、机のある席を確保したかったので早めに会場入りしました。

### [テスト可能なコードを書くということの２つの側面](https://www.tryswift.co/tokyo/jp#testable-code)

興味深い発表の一つでした。

出力のテストは、実行した後の状態を確認する必要あり、
実行した時の副作用よって状態を確認するのが難しくなります。戻り値を返すなど副作用をコードの境界付近に移動することが必要となります。

入力において、実行するために特定の状態を必要とするのを、co-effectと呼ぶのだが(≒DI)、これを扱う良い方法に、それらをstructにまとめてしてしまうという方法を紹介していました。
これによって一箇所にまとめられ動作確認しやすくなります。

```
struct Environment {
  let apiService: ServiceProtocol
  let cookieStorage: HTTPCookieStorageProtocol
  let currentUser: User?
  let dataType: DateProtocol.Type
  ...
  let mainBundle: BundleProtocol
  let scheduler: SchedulerProtocol  // Reactive.Scheduler
  let reachability: ReachabilityProtocol  // 通信状態のシグナルはグローバル
  let userDefaults: UserDefaultsProtocol
}
```

### [iOSにおけるDocument IndexingとApp Search](https://www.tryswift.co/tokyo/jp#indexing)

アプリ内部への誘導、CorespotlightやUniversal LinksのAssociation、Mobile Safari検索の有用な知見を聞くことができました。

### [スタートアップのSwift](https://www.tryswift.co/tokyo/jp#startup-swift)

* [Startup Swift // Speaker Deck](https://speakerdeck.com/mokudekiru/startup-swift)

メディアに掲載されて多くのユーザに使われるようになった時の大きな変化を、どのように対応していったかの知見を聞くことができました。Parse.comからの移行をどのようにしたかコードベースで説明されていました。
下記のエピソードはプロダクトを作る時にとてもためになる話でした。

* ユーザーの声を聞くためにSlackを使ったり、TestFlightでベータテスト
* ユーザーに会って実機デバックしてエラーを直す
* さっさと作って、Swiftの機能によってどんどん改善していく(guardキーワードの利用やProtocolの利用など)

### [きちんと型付けされたメッセージ](https://www.tryswift.co/tokyo/jp#typed-message)

* [A Neatly Typed Message // Speaker Deck](https://speakerdeck.com/siejkowski/a-neatly-typed-message)

コードの可読性についての話で、可読性についてのベストプラクティスというのではなく、色々な視点ややり方があるというのを示してとても考えさせられる話でした。

### [チームの生産性を改善するために決断疲れを最小化する](https://www.tryswift.co/tokyo/jp#team)

* [Minimizing Decision Fatigue to Improve Team Productivity](https://www.slideshare.net/DerekLee/minimizing-decision-fatigue-to-improve-team-productivity)

チームの生産性を改善する方法を、Pivotal Labsでの日常の働き方を通じての話で説明されてました。
ペアプロやランチ時のテックトークなどを行なっているなど試みなどの話から、ファイルをどこに置くべきかやコードの分割方法などの細かい方法の話まであり、
個人的には仕事のやり方などにすぐに取り入れられるものが多いなという点で学びが多い発表でした。

### [Client-Side Deep Learning](https://www.tryswift.co/tokyo/jp#deep-learning)

* [Client-Side Deep Learning](https://www.slideshare.net/t26v0748/clientside-deep-learning)

このセッションでは、取得済みの学習データ(Trainingは基本的にCloud側)を元に、ユーザの手元で高速に、オフラインでも動作するというデモを見せていただきました。
昨年の木製のネームプレートをかざすとSwiftと認識されてました。

## try! Swift iOS アプリ

今回も [公式アプリ](https://itunes.apple.com/jp/app/try!/id1083944488?l=en&mt=8) が配信されていました。
Apple WatchやWidget、3D Touchなどの機能も使われています。
ソースコードはgithubにあります。
画像や講演・セッション、タイムテーブル情報などのリソースデータをアプリとは別々に管理していて、
コードから扱いやすくするエクステンションともに、CocoaPodsでアプリから利用できるようにしているのはアイデアとして良いなと思いました。

* https://github.com/tryswift/trySwiftAppFinal
* https://github.com/tryswift/trySwiftData

## 感想

* 可読性のあるコードを書いたりテストしやすいコードを書くための考え方などのポイントを聞けたのはよかった
* 人によって流儀・主義主張が違うものだなと思った
  * UIはコードで書くかとかStoryboardでとか(チーム作業でコンフリクト辛いとかコード読み解くのが辛いとか)
  * View側ではモデルレイヤーの詳細を漏れなくする(DTO, POSOs)
  * 責務を分ける・レイヤが増える
* 定期的にカンファレンスに参加すると自分の考えが更新・洗練されるので参加してよかったなと思いました
* 同時翻訳すごい(IT専門の翻訳業者らしい)
* After partyの会場が、貴族の仮面舞踏会のような感じの会場でした。

## Slides

* [20170302 tryswift tasting_tests](https://www.slideshare.net/KazuMatsu/20170302-tryswift-tastingtests)
* [Building a Swift Web API and Application Together // Speaker Deck](https://speakerdeck.com/kylef/building-a-swift-web-api-and-application-together)
* [Craft Collaborative Apps with Realm (JP 🇯🇵 + EN 🇺🇸) // Speaker Deck](https://speakerdeck.com/marius/craft-collaborative-apps-with-realm-jp-plus-en)
* [Providing Better Feedback in Real-time Object Detection Apps // Speaker Deck](https://speakerdeck.com/_shingt/providing-better-feedback-in-real-time-object-detection-apps)
* [UXエンジニアとしての働き方 // Speaker Deck](https://speakerdeck.com/akatsuki174/uxenziniatositefalsedong-kifang)
* [Swift Outside the Box // Speaker Deck](https://speakerdeck.com/yusukeito/swift-outside-the-box)
* [Startup Swift // Speaker Deck](https://speakerdeck.com/mokudekiru/startup-swift)
* [A Neatly Typed Message // Speaker Deck](https://speakerdeck.com/siejkowski/a-neatly-typed-message)
* [忙しい人のためのApp Transport Security | try! Swift Tokyo 2017 #tryswiftconf Day2-8 - niwatakoのはてなブログ](http://niwatako.hatenablog.jp/entry/2017/03/03/162543)
* [Color Me Surprised! Architecting a Robust Color System in Swift // Speaker Deck](https://speakerdeck.com/lauraragone/color-me-surprised-architecting-a-robust-color-system-in-swift)
* [Server-Side Swift as a Live Example // Speaker Deck](https://speakerdeck.com/tnantoka/server-side-swift-as-a-live-example)
* [SwiftMocks.pdf](http://qualitycoding.org/files/SwiftMocks.pdf)
* [Minimizing Decision Fatigue to Improve Team Productivity](https://www.slideshare.net/DerekLee/minimizing-decision-fatigue-to-improve-team-productivity)
* [Client-Side Deep Learning](https://www.slideshare.net/t26v0748/clientside-deep-learning)
* [Scaling Open Source Communities trySwift Tokyo // Speaker Deck](https://speakerdeck.com/krausefx/scaling-open-source-communities-tryswift-tokyo)
* [Lessons In Swift Error Handling And Resilience // Speaker Deck](https://speakerdeck.com/christopherrogers/lessons-in-swift-error-handling-and-resilience)
* [👾&⌚️ // Speaker Deck](https://speakerdeck.com/giginet/and)

## 参考・言及されていたリンク等

* [try! Swift Tokyo 2017をもっと楽しむために](http://blog.kishikawakatsumi.com/entry/2017/03/01/135430)

### Swift開発者が知りたかったけど聞きにくい機械学習のすべて

* [TensorFlow in 5 Minutes](https://www.youtube.com/watch?v=2FmcHiLCwTU&list=PLdegGmGvvQaz7Ifc_rwCMkJlLmfliWywt)

### Swift on Android

* [platform/bionic - Git at Google](https://android.googlesource.com/platform/bionic/)
* [IUP - Portable User Interface](http://webserver2.tecgraf.puc-rio.br/iup/)
* [Blurrr SDK Open Beta | Blurrr SDK](http://blurrrsdk.com/)

### アプリを新次元に導く3D Touch

* [UITraitCollection - UIKit | Apple Developer Documentation](https://developer.apple.com/reference/uikit/uitraitcollection)

### Pixcels、プロセスと情熱

* [Steps: Overcome social anxiety on the App Store](https://itunes.apple.com/jp/app/steps-overcome-social-anxiety/id1185312069?l=en&mt=8)

### Unsafe Swiftの安全性

* [Unsafe Swift: Using Pointers And Interacting With C](https://www.raywenderlich.com/148569/unsafe-swift)

### クックパッドアプリのテストを味わう

* [The Complete Guide to the Kano Model - Folding Burritos](https://foldingburritos.com/kano-model/)

### データレイヤを分離する

* [Architecting iOS Apps with VIPER · objc.io](https://www.objc.io/issues/13-architecture/viper/)
* [The Clean Architecture | 8th Light](https://8thlight.com/blog/uncle-bob/2012/08/13/the-clean-architecture.html)

### UIをSwiftyに書く

* [GitHub - antitypical/Result](https://github.com/antitypical/Result)
* [GitHub - robb/Cartography: A declarative Auto Layout DSL for Swift](https://github.com/robb/Cartography)

### SwiftのWeb APIとアプリをともに構築する

* [RFC 5988 - Web Linking](https://tools.ietf.org/html/rfc5988)
* https://github.com/kevinswiber/siren
* [GitHub - kylef/WebLinking.swift: Swift implementation of web linking (RFC5988)](https://github.com/kylef/WebLinking.swift)
* [GitHub - kylef/Frank: Frank is a DSL for quickly writing web applications in Swift](https://github.com/kylef/Frank)
* [GitHub - kylef/heroku-buildpack-swift: Heroku build pack for Swift](https://github.com/kylef/heroku-buildpack-swift)
* [Kyle Fuller](https://fuller.li/speaking)

### 楽しく便利なSwiftチャットボット
* [Google Translate API - 高速で動的なローカリゼーション  |  Google Cloud Platfor](https://cloud.google.com/translate/)
* [Line bot](https://line.me/R/ti/p/htHsiFCK5l)

### 独自のツールを構築する
* [Retrospective: Swift at Artsy - Artsy Engineering](http://artsy.github.io/blog/2017/02/05/Retrospective-Swift-at-Artsy/)

### テスト可能なコードを書くということの２つの側面

* [GitHub - kickstarter/ios-oss: Kickstarter for iOS. Bring new ideas to life, anywhere.](https://github.com/kickstarter/ios-oss)

### 誰もが知りたいSequenceとCollectionのすべて

* [AnySequence - Swift Standard Library | Apple Developer Documentation](https://developer.apple.com/reference/swift/anysequence)

### Swiftで堅牢なカラーシステムを構築する
* [XCode Tip: Color Palette](https://www.natashatherobot.com/xcode-color-palette/)
* [iPhone、iPad、iPod touch で「ディスプレイ調整」を使う - Apple サポート](https://support.apple.com/ja-jp/HT207025)
* [GitHub - lauraragone/Stranger-Themes: A try! Swift Tokyo 2017 sample project illustrating how to update an app's theme](https://github.com/lauraragone/Stranger-Themes)

### サーバサイドSwiftの実例

* http://nsurl.serversideswift.net/
* http://sssaale.herokuapp.com/

### モックオブジェクトをより便利にする

* http://qualitycoding.org/tryswift2017

### チームの生産性を改善するために決断疲れを最小化する

* [GitHub - git-duet/git-duet: Support for pairing with git](https://github.com/git-duet/git-duet)

### Client-Side Deep Learning

* [GitHub - shu223/iOS-10-Sampler: Code examples for new APIs of iOS 10.](https://github.com/shu223/iOS-10-Sampler)
* [MetalPerformanceShaders | Apple Developer Documentation](https://developer.apple.com/reference/metalperformanceshaders)

### オープンソースコミュニティをスケールさせる

* [Danger - Stop Saying "You Forgot To…" in Code Review](http://danger.systems/)
* https://github.com/fastlane/fastlane/issues
* [GitHub - fastlane/issue-bot: This bot is responsible for commenting on GitHub issues that haven't had any activity](https://github.com/fastlane/issue-bot)

### 👾 & ⌚️

* https://github.com/giginet/NESEmulator-watchOS