iOSDC 2017 day 2 午後 参加メモ

iOSDC 2017 2日目午後の参加メモです。

コード生成による静的なDependency Injection

発表資料
コード

  • DIの概要について
  • ConstructorInjectionについて
  • DIなし密結合だがインスタンスの生成が簡単
  • DIあり疎結合だがインスタンスの生成が面倒
  • 疎結合インスタンスの生成が簡単にしたい
  • DIをサポートする仕組み
  • インスタンスを自動的に取得する方法
    • DI用のInitializerを登録する(各ノードの生成を定義)
    • DI用のprovider Methodを用意する(全体の生成を定義)
    • コード生成による依存関係の解決

Swiftでの実践

DI用のInitializerを登録する

  • protocol Injectableを用意
  • associatedtype Dependencyを持ち、Dependencyを受け取るinitを定義
  • 依存するものをDependencyにまとめる

DI用のprovider Methodを用意する

  • マーカー用にprotocol Resolverを用意(定義はなし)
  • protocol Resolverを継承したprotocol AppResolver(命名は任意)を用意し、provider Methodを記述

コード生成による依存関係の解決

  • SourceKittenを使う
  • Resolverのprotocol extensionにインスタンスを取得するメソッドを生やす
  • Resolverの実装を行うだけで、インスタンスの生成が可能になる
  • 自動的に取得できないdependencyについては、resolveメソッドに引数を渡せるようにしてある

Human Interface Guidelinesから滲み出る限界感を考える

  • sansanのiOSエンジニアの方
  • Human Interface Guidelines(以下、HIG)の限界について
  • 3つの違和感
  • Apple Storeアプリを例に確認してみる
  • ボーダーのついたボタン
    • 購入するボタンはボーダーがついている
    • Webも同じ
    • AppleStoreのサービスとしてWebとも一貫性がある
    • 一貫性というガイドラインに準拠
  • Toast
    • アラートを使わないためにToast
    • アラートの使用は最小限というガイドラインに準拠
  • セクションの文字がボールド
    • ボールドナビゲーション
    • 要素を明瞭に区別する工夫
    • 明瞭性を上げるためにボールドにする
    • 明瞭性を上げるというガイドラインに準拠
  • AppleStoreアプリ以外でも使われている角丸View
    • iPhoneXで画面が角丸になるのでそれに合わせたのではないか
  • ストアレビューガイドラインには独自のアイデアを生み出してくださいと書いてある
  • 狩野モデルからアプリ品質を考える
  • UIの軸と機能の軸で見てみる
  • HIGは当たり前品質として考えられる
  • UIに魅力的品質を求めるのであればHIGに書かれていないようなことを実装していく必要がある

iOSエンジニアのためのNLP基礎

発表資料

言語判定

  • 文字N-gramを活用して判定を行うことが多い
  • 言語判定は簡単ではないので、予め言語がわかっていれば指定したほうが良い
  • 例えば、HELLOは英語、イタリア語、ドイツ語ある

トークン化

  • 文を単語に分けるようなこと
  • 日本語の制度は微妙

品詞タグ付け

  • 単語に対して品詞をつけていく

レンマ化

  • 辞書の見出し語を抽出する処理
  • 過去形から現在形、複数形から単数形を取得するような処理

固有表現抽出

  • 固有名詞や時間表現をテキストから抽出する技術
  • テキストにおいて固有名詞は重要情報

まとめ

iOSと人工知能(AI) -GPU並列演算の仕組みと機械学習

人工知能とは

  • 生物の知能を模倣する技術
  • 強いAIと弱いAIがある
    • 強いAI:人の知能に迫るAI
    • 弱いAI:限定的な問題解決や推論
  • 弱いAIの利用例:画像処理、音声会話、文章の認識サウ性、機械制御、作曲絵画
  • 種類:機械学習遺伝的アルゴリズム、群知能、その他にもファジイ制御、エキスパートシステムなどある

機械学習とは

iOSの中のAI

  • CoreML訓練済みのモデルをアプリに導入
  • MPS GPUを用いたMetalの高い演算機能をアプリに導入
  • MetalはCoreMLより下のレイア
  • MetalはCPUとGPUのシームレスな連携
  • Metalを用いた学習のデモ

15分でわかるバックグラウンドアップロード

発表資料

  • バックグラウンアップロードはドキュメントが少ない、サンプルがしずらい、デバックがしづらい
  • iOS7以降の処理のBackgroud Transfer Serviceの話
  • 他のアプリを使っている時も自分のアプリで比較的大きなファイルをアップロードできる
  • ForegroundではないイコールBackgroudではない
  • SuspendedやNotRunningもある
  • SuspendedはBackgroundと行き来する
  • バックグラウンド以外にもSuspended, Not Runningもある

仕様

  • 簡単な特徴
    • アップロードはiOS上のキューに積まれ制御される
    • パフォーマンス最適化のためにシステムの都合でスケジュール
    • 失敗したら自動リトライ
  • 制約
    • NSURLSessionはクロージャではなくDelegateを使う
    • Dataではなくファイルで渡す必要がある
    • ユニークなIDを生成して渡す必要がある
  • 呼び出せれるDelegateは2つ
  • エラーについてはアプリ起動時にAppDelegateに用意されているメソッドで検知できる(はず)

役立ツール

  • Network Link Conditioner(通信状況を悪くできる)
  • Charles(Proxyツール)
  • Swiftybeaver(ログライブラリ)
    • 反映に遅延があるのでその想定でつかう必要がある
    • バックグラウンドに入るログを確認する時に使える

ハマりどころ

  • timeoutが難しい
  • timeout関連のプロパティは2つ
    • timeoutIntervalForRequest
    • timeItervalForResource
  • forRequestは検証が難しくあまり理解できていないがサーバでの処理時間だと思われる
  • forResourceの方はリトライ含めたタイムアウトなので、望まないリトライはこれで制御できる
    • デフォルトは7日で長めに設定されている
  • iOS11からAPIが増えた
  • プロセスは別で動く

サポート効率を上げるログ収集環境の構築

発表資料

  • トレタでiPad担当をしている方
  • アプリが成長していく中で・・・
    • 再現性のない不具合問い合わせが増えてきた
    • コミュニケーションコストが増大
    • ハードウェアも使い始めてさらに複雑化
  • アプローチ
    • クラッシュ以外の通信エラーなどを検知できる体制
    • 調査に必要な情報をなるべく増やす
    • 問い合わせ時のコストを減らす

クラッシュ以外の通信エラーなどを検知できる体制

  • クラッシュ以外でもログを送れるサービスを選定
  • 今まではHockerAppを使っていた
  • Bugsnag, sentry, crashlyticsを比較
  • Bugsnagを採用することに
  • パンくずログが非常に便利なのでそれが使えるものを選んだ
  • パンくずログはエラーが発生するまでの道標を残す
  • iOS標準でもActivityTracingでパンくずログを確認できる(クラッシュ時のみ)

調査のヒントになる情報をとるように

  • どういう操作を行ったか、どういう状態、環境だったかを取る
  • どういう操作を行ったか
    • ViewControllerの遷移ログ
    • その他UIイベント
    • これらをパンくずに入れていく
  • どういう状態、環境だったか
    • ユーザの端末状態
    • 多くのサービスは自動収集
  • その他、Reachabilityのイベントをパンくずに追加している
  • コンソールのログ(AutoLayout崩れなど)を吐き出し場所を変更することができ、それも送っている

問い合わせ時のコスト

  • 課題
    • 調査に必要なログがそもそも取れてない
    • 日本語で的確に伝達するのが難しい
  • ロジックエラーも詳細に列挙すると良い
  • どういうエラーが発生したかを詳しく呼び出し側に渡す
  • エラーコードが大事
  • エラーコードをユーザにも表示して問い合わせしてもらうようにする

カンファレンスアプリを作ったぞ!!

  • BuildersConのアプリ
  • タイムテーブルについて

アプリ開発アンチパターンを踏み抜きながらアプリをフルリニューアルした話

  • sansanアプリをフルリニューアルしている話

5分でわかるServer-side Swift Vaporの魅力

  • vaporの紹介

関数を引数として渡す書き方のポイント

発表資料

  • 関数を引数に渡すところを少し書き方を帰るだけで、より宣言的に書ける方法を紹介

自分が欲しいとアプリを作った

発表資料

  • Typeというアプリを作った話

Fun with Swift 4 KeyPaths

  • Swift4の強力なKeyPathsについて

地方在住iOSエンジニアの生存戦略

  • 地方でどういう生活をしているかやどんなふうに情報をキャッチアップしているかなど

UIテストの実行時間の短縮に挑戦する

発表資料

  • bluepillや複数のMacを使ってUIテストを並列にして短縮した話

翻訳のススメ

発表資料

  • 翻訳作業を行っている方の翻訳のススメ

2017年におけるiOSアプリ開発のCI事情

  • CIそのものの紹介
  • CIサービスの比較

xcconfigの落とし穴

  • ビルド設定をconfigファイルに書くためのツール(xcconfig)の紹介

fastlane Contributorだけど何か質問ある?

  • fastlaneの運営の話やOSSの運用の話

拝啓 皆様。iOSチームの1人として伝えたいこと。

  • デザイナのポテンシャル発揮できていなくないか?と疑問に思い体制を変えた話。

いつかどこかで使ってみたい「着せ替えアイコン」を実装してみた

  • バックグラウンドで変更できない
  • 60x60を用意したらうまくいった
  • iPad用には専用のプロパティがある
  • キャッシュが強めに効くことがある

iOSDC Japan 2016 の賞金を放置しておくと1年でどうなったか?!