potatotips #52 (iOS/Android開発Tips共有会) 参加レポート [iOS]

potatotips #52に参加してきました。

potatotips.connpass.com

togetter はこちら
2018/6/21 #potatotips (iOS/Android開発Tips共有会) 第52回 - Togetter
発表数も多く長時間になる中、内容の聞き起こしを上げ続ける niwatako さん、すごいです。

ここでは主に iOS の発表の資料と概要をまとめます。

WWDCのセッションから、パスワードのAutofillの紹介

kishikawakatsumi さん

speakerdeck.com

  • パスワードの自動生成
    • 以前から safari 上ではできていた
      • アカウント作成画面でパスワード設定するとき safari 画面上で「強いパスワードを作って keychain に保存しとくよ」画面が出てくるやつ
    • アプリでもそれができるようになった
  • SMS からのオートフィル
    • アプリでもできるようになった
      • 認証コードが SMS に送られてきてそれを入力して先に進む画面にいる
      • 認証コードのメッセージを受け取る
      • 受け取った認証コードがサジェストされて Text field に入力できる (メッセージアプリに移動しなくても良い)
  • アプリでどう対応すれば良いか
    • Associated Domain を設定する
    • Text field の Content type を UserName か Password に設定しておくとログイン画面だと認識されるようになる
    • Keyboard type によってサジェストされるものが異なってくる
    • パスワードのルールが提供されているものに合わない場合

How to Manage Edge Gestures

TachibanaKaoru さん

speakerdeck.com

  • 画面の端からのジェスチャーは system に取られてしまうこと多い
    • ノーティフィケーションセンター、コントロールセンターとか出てくる
  • iOS11 から system のジェスチャーを阻害することができる設定がつけられる
    • preferredScreenEdgesDeferringSystemGestures
  • 一回だけブロックできる。もう一度続けてスワイプされたら通常通り system の操作が実行される
  • 標準の動作を変えることは明確な意図がないと行うべきではないけれど有用な場面はありそう
    • 例えば、ゲームでの誤操作を防ぐなど

enum as Option

r_plus さん

speakerdeck.com

  • OptionSet と enum それぞれで実装したときどうなるか
  • 表面上同じことを表現できる部分もあるけど、性質の違うものなので表現する対象によって使い分けると良さそう

GDPRについて

Yoichi Tagaya さん

speakerdeck.com

  • General Data Protection Regulation の略
  • 「ヨーロッパの住民の個人情報を適切に扱ってね」って要件
  • 2018/5/25 から適用 (すでに施行されてる)
  • レギュレーション破ると大きな罰金が課せられる
  • 対象者は EEA(European Economic Area) 圏内のユーザ => EEA に拠点がない会社も対象
  • アプリでユーザのログとってることが多いが、ユーザの同意を得てない状態で User name, ID, email, IP address などがログに含まれてると危険

Turi Createを試してみる

tattn さん

speakerdeck.com

  • Turi Create: Apple がメンテしてる OSS機械学習モデルの作成ツール
  • CoreML のモデルを出力できる
  • 用途によって調整済のパラメータ, アルゴリズムが提供されているので機械学習に詳しくなくても気軽に使える
  • モデルの学習に結構時間がかかる + 途中状態を保存できない ので注意 (時間に余裕を持って実行しよう)

見落としがちなVoiceOver対応

jkatayama さん

speakerdeck.com

  • VoiceOver: 画面上のものを読み上げる機能
  • 特に気にしなくても対応できてる部分はある
    • UILabel だと text が読まれる
    • UIButton だと label.text が読まれる
  • 気にしないといけないケース
    • ImageView -> 画像ファイル名が読まれてしまう
    • テキストなしの Button -> 画像ファイル名が読まれてしまう
  • Accessibility Label を設定しよう

Contributing to Swift in WWDC

kitasuke さん

(Slide 見つからず…!)

  • WWDC 中にある Swift open hours に行った
    • わりと空いてる
  • WWDC 中にコンパイラにコントリビュートした
  • 手順
    • バグっぽいとこを見つける
    • バグか聞く
    • こういう風に直して良い?と聞く
      • 方針を間違えたまま進めると PR 出してからのレビューでごたごたしてしまう
    • try!swift work shop で直した

Video decode on iOS

noppe さん

speakerdeck.com

  • 透過動画再生ライブラリ作った github.com
  • 今回はビデオのデコード部分の話
  • ビデオファイルの中身
    • メディアコンテナの集まり
    • 動画、音声、字幕などが入っている
  • ビデオファイルのデコード
    • メディアコンテナを再生できる形に復元
  • OS/端末のデコーダを利用
    • 同じ mp4 でもコーデックが違うとサポート状況が異なる場合がある
    • サポートしてるコーデックは Apple 公式サイトに書いてある
    • 対応するコーデックの情報をとるメソッドは見つからなかった
  • AVAssetReader, VTDecompressionSession

Swiftで高カインド多相

inamiy さん

speakerdeck.com

少なくとも私にとっては前提が難しかったので、理解できた範囲でですが補足します。

型コンストラクタ

型を引数として受け取り型が生成される関数です。
例えば、「Optional は型を引数として受け取ることで型を作れる」つまり「型コンストラクタ」として見ることができます。
OptionalInt を渡して Optional<Int> 型ができ、String を渡して Optional<String> ができるという考え方ができます。
Optional の他にも、Array なども同様に捉えられます。

カインド

値の世界では下記のようなコードの : の左側に宣言してあるものは型を示していますが

let v: Int
let f: (Int) -> Int

型の世界で考えたとき、その部分はカインドを示しています

Int: *
Optional: (*) -> *
Array: (*) -> *

高カインド多相

以上を踏まえつつ、スライド中の高カインド多相の例を見てみます。

class Functor f where
  fmap :: (a -> b) -> fa -> fb

これは例えば下記のように使えるはずです。

fmap (+1) Optional(2)  // -> Optional(3)
(!!: 擬似コード)

型に注目すると

fmap :: (a -> b) -> fa -> fb
fmap (Int -> Int) -> Optional<Int> -> Optional<Int>

a は Int
b は Int
f は Optional
fa は Optional<int>
fb は Optional<int>

f は型コンストラクタとしての Optional です。 例では Optional ですが f は抽象化されているので他の型コンストラクタを与えても適応できます。

fmap (+1) [1, 2]  // -> [2, 3]
// fmap (Int -> Int) -> Array<Int> -> Array<Int>

しかし、これを Swift で実現しようとすると簡単にはできません。 f = Optional ということはできず、Optinal<String> など型パラメータが定まっていなければ指定できないためです。 ではこのような機能をどう実現するか、という発表でした。