try! Swift Tokyo 2019 参加レポート（初日）

[try! Swift Tokyo 2019][tryswift]の初日の参加レポートになります。

[参加レポート（二日目）][day2]

# イベント概要

[try! Swift][tryswift] はSwift言語での開発における最新の応用事例について集まる国際コミュニティです（公式サイトより）。
iOSに関するものが多いですが基本的にはSwiftであればサーバーでも、当然macOSも対象になります。
Swiftに関して最も大きいイベントの一つと言ってよいイベントです。
[Twitter][tryswiftconf] にて最新情報が発信されています。

# リンク

[こちら][document]に発表資料や文字起こしの情報をまとめて頂いているので、資料についてはそちらを参照していただけると幸いです。

# レポート（初日）

## スケジュール

| Start Time | Overview | Speaker |
|:----------:|:---------|:-------:|
|10:00|[native macOS application、またはAppKitの世界][intro01]|[1024jp][speak01]|
|10:25|[⚡️🎤脱Swiftリテラル初心者][intro02]|[Yuki Aki][speak02]|
|10:35|[アクセシビリティのためのカラーコントラスト][intro03]|[Liz Marley][speak03]|
|11:30|[Swift Light][intro04]|[Jon-Tait Beason][speak04]|
|11:55|[⚡️🎤限定的なimportの明示とその効果][intro05]|[Tomoya Hirano][speak05]|
|12:05|[protocol/extensionにジェネリクスを入れたい][intro06]|[Hikaru Yoshimura][speak06]|
|12:30|[Keypath入門][intro07]|[Benedikt Terhechte][speak07]|
|14:30|[テストケースでMemory Leakを発見する][intro08]|[Nobuo Saito][speak08]|
|14:55|[⚡️🎤PixarのようなグラフィックをSwiftで実現する][intro09]|[Michael Petrie][speak09]|
|15:05|[ARKitのアプリを作ろう][intro10]|[Namrata Bandekar][speak10]|
|15:30|[⚡️🎤Introducing to SourceKit-LSP][intro11]|[Ryo Izumi][speak11]|
|15:40|[Swift Server Update][intro12]|[Tom Doron][speak12]|
|16:35|[SwiftのアプリでCやC++、Objective-Cのフレームワークを使おう][intro13]|[Cecilia Humlelu][speak13]|
|17:00|[⚡️🎤MachObfuscator][intro14]|[Kamil Borzym][speak14]|
|17:10|[Siri ShortcutsとNSUserActivityによるエンゲージメント推進][intro15]|[Nic Laughter][speak15]|
|17:35|[try Prototype!][intro16]|[Maxim Cramer][speak16]|
※「⚡️🎤」は Lightning Talk です（念のため）

## native macOS application、またはAppKitの世界

発表者は[CotEditor][coteditor]などを開発した方で、iOSが登場する前からmacOSアプリを開発してきたそうです。
iOSとmacOSのアプリの違い、ネイティブアプリとはどういうことか、というテーマでCotEditorの開発を実例に紹介してくれました。
ネイティブアプリとは、「特定のシステムに向けて設計・ビルドしていること」で、言語やフレームワークということではなく、OSの特性に合わせて、操作性は標準に準拠して作られているべきとしており、AppleのMazipanプロジェクトも単なるエミュレータと断じています。

最近はWeb系の言語でアプリが作れたり、AndroidとiOSでデザインまで合わせる場合があったりもしますが、あらためてネイティブアプリらしさということを意識し、Appleの[Human Interface Guidelines][hig]もチェックしてよいアプリを作るよう心がけねばと思いました。

<!-- ## ⚡️🎤脱Swiftリテラル初心者 -->

## アクセシビリティのためのカラーコントラスト

色は強力なコミュニケーションツールで、好きな色を使いつつもコントラスト比率を意識してよいアプリにしましょうという主旨の発表です。
[HIG][hig]にもコントラスト比率についての言及があるそうです。
[Color Contrast Checker][contrastchecker]というコントラスト比率を計算するツールも紹介してくれています。

Appleの最近の潮流としてダークモードを挙げていて、iOSにも取り入れられるのではないか、その際にはテキストやテーブルの背景色などのデフォルト定義についても変化があるのではないかとのことでした。

## Swift Light

[Glowforge][glowforge]という3Dレーザープリンターの会社の方で、プリントするデザインを編集するiOSアプリにてどのようにSwiftを活用しているかというものでした。
込み入った画像周りの処理なので情報がなくて苦労したようです。

<!-- ## ⚡️🎤限定的なimportの明示とその効果 -->

## protocol/extensionにジェネリクスを入れたい

Scalaエンジニアで型システムを研究していたとのことで、その辺りがテーマになっています。
リストに任意の型を詰め込みたいが、Anyのリストでできるものの型が失われてしまう。
そこで、異なる型を格納できるリスト（＝Heterogeneous List（HList））の実装方法について検討したというもの。
HListは中の値と型を対応付けて覚えておくことができるというもので、プロトコルエクステンションでは型を拡張できるので実現できるようですがSwiftの型推論がまだ途上で込み入った実装になってしまうとか。

高度な内容で中盤からほとんどついていけてなかったです。。
しかしながらこういう言語仕様をハックするような話題はワクワクします。
ちなみに、[こちら][hlist]にScalaでの実装についてもまとめているのを見つけました。

## Keypath入門

Swift4で追加されたKeypathの紹介。
例として、アプリの設定用structが２つあり、型もそれぞれ異なるがprotocolで編集処理をまとめたい。これをKeypathを用いて解決することをゴールとして話を進めるという流れ。
前提としてKeypathの仕様についての説明をした上で、上記の課題についてコードで順を追って説明して、最後に関連オープンソースライブラリとして[Kuery][kuery]、[KeyPathKit][keyPathKit]を紹介してくれました。

Keypathについては知らなかったのであとから調べて何となくは理解できたものの、今回紹介されていたコードは多少消化不良です。。
機会を見つけて使ってみたいです。

## テストケースでMemory Leakを発見する

よくクロージャでselfを使う際にweakをいれてなくて循環参照参照してしまう場合があるが、これを規約やコードチェックで防ぎ切ることは難しい。
これをMirror（リフレクション）とweakを使って検出できるようにしようというものでした。
出来たのが[XCTAssertNoLeak][xctassertnoleak]で、ユニットテストでリークを検出できるようになります。

Swift4.2については言語側の問題で機能しなかったり、Mirrorを使いこなすための工夫など難しい部分がありますが技術的に学びがありました。
例ではViewContorollerを使用していましたが、これはメルカリのMicroViewContorollerの考え方が前提になるのかなと思いました。
（FatViewControllerではXCTestを書くこと自体が厳しいのでは）

<!-- ## ⚡️🎤PixarのようなグラフィックをSwiftで実現する -->

## ARKitのアプリを作ろう

ARKitを使ったアプリの紹介です。
平面を検知して門を作って表示してくれる「PORTAL」、道路にお絵かきする「ARSKETCH」。
（ストアにはなさそうなのでサンプルかもしれません）
基本的な機能や実装上の注意点だけでなくパフォーマンスについても言及していました。

興味はあるものの実装したことはなかったので面白かったです。
やはりパフォーマンスが重要で、アンカーの制限、フレームレートを落とすなどチューニングが必要になるようです。

<!-- ## ⚡️🎤Introducing to SourceKit-LSP -->

## Swift Server Update

Swiftでのサーバーアプリケーション開発の近況について話してくれました。
IBM、Vapor、Amazon、Appleなどで使われていて、[Kitura][kitura]、[Vapor][vapor]などのライブラリがあります。
データベース周りはまだ混在していて、ロギングの一貫性というところにも課題があるようです。
The Swift Server Work Group（SSWG）がIBM、Apple、Vaporにより発表され、DBやネットワーク処理などのライブラリの開発を進めているとのことです。

Kotlinも同じような動きがあったり、スマホアプリ開発にサーバー系の言語の適用する流れもあったり、技術が広がっていて面白いですね。ライブラリも充実してきているとのことで、ちょっとしたサーバーアプリケーションの開発にSwiftを使ってみるとかはやってみたいです。

## SwiftのアプリでCやC++、Objective-Cのフレームワークを使おう

C、C++、Objective-Cで作られたライブラリを用途に応じてうまく使っていこうという話です。Swiftから直接C++は呼べないのでObjective-Cを中継するとか、Cのヘッダーが読めないのでmodulemapを作るなどの実践的なテクニックを紹介しています。

アプリの開発を生花に例えて使用する各種言語やライブラリを枝や花に例えていたのが印象的でした。以前C++のライブラリをさらにObjective-Cでラップして部品としてフレームワークを作っていたことがありますが、いろいろな背景やしがらみがある中でギリギリつながって、それでもちゃんと動いているところはすごいなと思ってました（言語仕様やコンパイラ、互換をとる仕組みなどが）。

<!-- ## ⚡️🎤MachObfuscator -->

## Siri ShortcutsとNSUserActivityによるエンゲージメント推進

iOS12から追加された、Siri Shortcutsの導入方法についてのチュートリアルの紹介です。
簡単に導入できるということを伝えつつ、Tipsを示してくれていました。

Siri関連はいままでまったく食指が動かず知識もなかったので改めて調べてみましたが、これはなかなか面白い機能ですね。ただ、導入紹介の記事などをみてもあまり利用者はいないようで、もともとSiriが日本人に合うのかというところが課題になりそうです。

## try Prototype!

プロトタイプを開発するデザイナーの方による発表で、いくつかの質問から各々が自身のデベロッパーとしてのマインドセットを再構築しましょうというものでした。

- あなたはなぜデベロッパーなのか
- 誰のためにコードを書いていますか
- テクノロジーが変化したときあなたはどうしますか
- コードを書くときどれくらいの期間使用されるものと考えますか
- あなたのコードをリリースする際の阻害要因はなんですか
- どれくらいの頻度でテストしますか

組織やプロダクト、自身の考え方によっても変わってくると思うのでたまには立ち止まって上記の質問について考えを巡らせることも必要と感じました。

[try! Swift Tokyo 2019 参加レポート（二日目）][day2] に続きます。

[day2]:https://qiita.com/takayuki/items/455fdad655bb993c24af
[tryswift]:https://www.tryswift.co/events/2019/tokyo/jp/
[tryswiftconf]:https://twitter.com/tryswiftconf
[document]:https://qiita.com/mishimay/items/32e59b589c49e21702b9

[intro01]:https://www.tryswift.co/events/2019/tokyo/jp/#macOS
[speak01]:https://twitter.com/1024jp
[intro02]:https://www.tryswift.co/events/2019/tokyo/jp/#literal
[speak02]:https://twitter.com/___freddi___
[intro03]:https://www.tryswift.co/events/2019/tokyo/jp/#accessibility
[speak03]:https://twitter.com/emarley
[intro04]:https://www.tryswift.co/events/2019/tokyo/jp/#light
[speak04]:https://twitter.com/bugKrusha
[intro05]:https://www.tryswift.co/events/2019/tokyo/jp/#import
[speak05]:https://twitter.com/noppefoxwolf
[intro06]:https://www.tryswift.co/events/2019/tokyo/jp/#generics
[speak06]:https://twitter.com/_yyu_
[intro07]:https://www.tryswift.co/events/2019/tokyo/jp/#keypath
[speak07]:https://twitter.com/terhechte
[intro08]:https://www.tryswift.co/events/2019/tokyo/jp/#testcase
[speak08]:https://twitter.com/tarunon
[intro09]:https://www.tryswift.co/events/2019/tokyo/jp/#graphics
[speak09]:https://twitter.com/kapsy1312
[intro10]:https://www.tryswift.co/events/2019/tokyo/jp/#arkit
[speak10]:https://twitter.com/NamrataCodes
[intro11]:https://www.tryswift.co/events/2019/tokyo/jp/#lsp
[speak11]:https://twitter.com/izm256
[intro12]:https://www.tryswift.co/events/2019/tokyo/jp/#serverside_swift
[speak12]:https://twitter.com/tomerdoron
[intro13]:https://www.tryswift.co/events/2019/tokyo/jp/#framework
[speak13]:https://twitter.com/CeciliaHumlelu
[intro14]:https://www.tryswift.co/events/2019/tokyo/jp/#MachObfuscator
[speak14]:https://twitter.com/kam800
[intro15]:https://www.tryswift.co/events/2019/tokyo/jp/#sirishortcuts
[speak15]:https://twitter.com/nictheawesome
[intro16]:https://www.tryswift.co/events/2019/tokyo/jp/#prototype
[speak16]:https://twitter.com/mennenia

[coteditor]:https://coteditor.com/
[hig]:https://developer.apple.com/design/human-interface-guidelines/
[contrastchecker]:https://webaim.org/resources/contrastchecker/
[glowforge]:https://glowforge.com/
[hlist]:https://qiita.com/yyu/items/4941417ec555ea5ab590
[kuery]:https://github.com/kishikawakatsumi/Kuery
[keyPathKit]:https://github.com/vincent-pradeilles/KeyPathKit
[xctassertnoleak]:https://github.com/tarunon/XCTAssertNoLeak
[kitura]:https://www.kitura.io/index.html
[vapor]:https://vapor.codes/