try! Swift Tokyo 2019 の印象に残った内容覚書。（2日目、WS）

try! Swift Tokyo 2019 の印象に残った内容覚書。（1日目）
https://qiita.com/Takumi_Mori/items/8a0bd4bb11ac2e746d54

この記事からの、2日目。

## 魔法の法則
スライドが、おそらくtry!Swiftのslackでしか共有されてない予感。
和英両方でスライドの内容を書いてくれていて、分かりやすかった。

> SFとファンタジー小説にインスパイアされたルールに従って、
> 知的で没入型の体験を開発することを学びます。ソフトウェアと同様に、
> 複雑で魅力的な魔法のシステムもガイドラインを使用して具体的なユーザー体験を構築します。
> 
> この講演では、架空の世界構築をサポートするいくつかの思索的な法則を探り、
> これらの教訓を日々のアプリとコード開発に組み込んで同じ結果を生み出す方法を説明します。

参考にしたのは、ブランドン・サンダースン（Brandon Sanderson）がブログで紹介した３つの魔法の法則。

※おそらく以下の３記事
https://brandonsanderson.com/sandersons-first-law/
https://brandonsanderson.com/sandersons-second-law/
https://brandonsanderson.com/sandersons-third-law-of-magic/

**The First Law of Magic**
満足には理解が必要。作者はユーザーに理解を伝える責任がある。
ユーザーからの質問を予想し、解決策への適切なガイドを行う。

実現するために
Swiftの型システムを適切に利用し、安全な利用方法を担保すること。
ユーザーが慣れ親しんだパターンを使うことで、新しく覚えることを極力減らす。
有用なテストやエラーメッセージの提供、またドキュメントやユニットテストを完成させておく。

**診断によるユーザーの誘導**
fatalErrorでは実際に動かしてクラッシュさせてみるまでわからないが、
Swiftの機能を使えば診断によりユーザーの誘導ができる。

```swift
@available(*,
          renamed: "otherMethod()",
          message: "These are not the droids you're looking for")
func soundsRightButIsActuallyWrong() -> ReturnType {
    fatalError("This is not what you want")
}
```

もしくは、関数に対してドキュメンテーションを提供しておくことで理解できるようにしておくやり方もある。

・Markup Formatting Reference
https://developer.apple.com/library/archive/documentation/Xcode/Reference/xcode_markup_formatting_ref/index.html


**The Second Law of Magic**
Limitations > Powers
制限は権力よりも重要

できないことは、できることより面白いことが多い。
制約が創造性を掻き立てる。

問題につまづいた時には、ときには人工的に制約を加えることで、創造性が発揮できる。
それによって、場合によっては考えられなかった選択肢が浮上したりもします。

**The Third Law ow Magic**
Expend what you already have before you add something new.
新しいものを追加する前に、すでに持っているものを拡張してください。

知っていることでも、さらに調べることで他の人たちが絶対見つけていないだろうものを発見することがある。
その隠された深さを発見することはとてもエキサイティング。
物事には、常に別の秘密がある。

リファクタリングを行い、コードを進化させる。ユースケースを検討する。
今後実装する必要があるかどうか、常に奥行きを加える。


**Make It awasome.**
それを素晴らしいものにしましょう。


### 感想
上記は要約が多いですが、素晴らしいセッションでした。
1日目の try Prototype! と言い、考え方を整えてくれます。

基本的にここで言う「ユーザー」は自分をframework開発者としたときの利用ユーザー、または
自分の書いたコードを使うプロジェクトチームのメンバーなどに近いような気がします。
WWDC感のあるセッションだったと感想がよくtwitterに流れていました。

## ポートレートモードを自作しよう
https://speakerdeck.com/koooootake/making-portrait-mode-yourself
https://github.com/koooootake/Portrait-without-Depth-ios

Depthの無い二次元画像に対して、背景をぼかして二次元映えさせるアプリを作る。

写真ならば、Mask R-CNNなどを使ってうまくdeep learningさせてやれば
できるかもしれないが、二次元画像ではうまく境界を判断することはできない。

そこで`GrabCut`アルゴリズムを使って大まかにカットする
`Inpainting`で正面の人物だけを消した背景レイヤーを作ることで、髪周りなどの色漏れを防ぐ
`Depth-of-Field（被写界深度）`を設定し、背景の奥行きを表現する

### 感想
10分のライトイニングトークだったんですが、出てきた成果物の完成度がすごい。

ポートレートモード自体、現在自分で作っているアプリにも組み込めるものならば
入れてみたら面白いかもしれない、という技術が使われているのでこれは別途公開されている
サンプルアプリを見て、また別のエントリにまとめるかもしれない。


## FirestoreやSwift, Typescriptでアプリをつくろう
https://codelabs.developers.google.com/codelabs/firebase-cloud-firestore-workshop-swift/
このcodelabに沿って実装していくだけ。

### 感想
これだとURLだけわかっていれば自分でやれたかな、というところはある。

## まとめ
書いては無いけど、他にも面白いセッションがいくつもありました。
参加したあとで重要なのは、やはりこのあとに興味を持ったセッションについて
自分なりに復習すること、またそれを今後に反映していくことですね。

海外のカンファレンス、特にWWDCなんかに興味はあるんだけど
行くことにためらっている居る人は、まず近くの東京で行われているこのtry!Swiftに参加して
多少なり雰囲気を味わってみることがおすすめ。 英語こわい。
WWDCなら渡航費など込みで50万くらいかかりますが、こちらは４万円くらいですからね。

あとはこの規模のカンファレンスに参加するなら、小さめの集まりなどに参加して
多少なり開発者同士のコミュニティを作るなどしておかないと、
なかなか交流取るのも難しいと思います。 せっかくなら楽しめる準備をしてから参加しましょう。

もうちょっと知り合い作るとか、アウトプット増やそうと思った感想でした。