iOSDC Japan 2016 参加レポート #iosdc

logo-eyecatch

こんぬづは、iOSDC前夜祭前日はわくわく(と登壇資料が出来上がっていない焦り)で眠れないほど楽しみだった田中です。

8/19 - 8/20とiOSDC Japan 2016という、日本のiOS開発者の大きなカンファレンスが練馬にて開催されています!

メインとなる本日8/20はライブレポートとして随時更新していきます。

乞うご期待!

オープニング

14044990_1089462321138837_98479553_o 14075163_1089462331138836_1327986500_o 14075192_1089462317805504_1432692704_o 14059969_1089462334472169_1873636323_o 14075223_1089462354472167_1046175906_o 14059931_1089462351138834_852351744_o14045496_1089462421138827_1451192586_o

主催の長谷川さんからのスピーチ。
14060119_1089462417805494_1793795297_o

Track B - 10:20 「海外のカンファレンスに登壇する - 完全版」堤 修一 @shu223

14075035_1089475001137569_810801251_o

14045320_1089474987804237_1234252306_o

  • 三つの海外のiOSカンファレンスに登壇しました。
    • UIKonf(ベルリン)
    • iOSCon(ロンドン)
    • AltConf(サンフランシスコ)
  • 英語できるんですね!と思われがちだけど英語できません!
  • 実際に話している様子を聞いてみましょう
    • (英語での会話が流れる)

なぜ応募したのか

1. 海外から仕事がくるようになりたい

  • 日本では面白い仕事の話をいただけている
  • 海外カンファレンスに出ると英語でググって見つかる「入り口」になる

2. 英語力を鍛えたい

  • 英語力を鍛えるには場数を踏むしかない

3. スピーカーの方々と友達になりたい

  • 著名な常連スピーカーの方々に自分の話が届く

Proposalを書くコツ

トークテーマを決めるポイント

  • ハードウェアプロジェクトに関わった経験数は多い方

  • キャッチーさを足すために"IoT & Wearable"というタイトルをつけた

  • 共感・興味をもってもらうための「つかみ」
  • 経験豊富さのアピール

海外のカンファレンスに向けて

三つのカンファレンスで採択された!

  • UIKonf(ベルリン)
    • チケット代66,000円!
    • だけど有名なので価値がある
  • iOSCon(ロンドン)
    • ロンドンは物価が高いのでチケット代12万円
  • AltConf(サンフランシスコ)
    • 無料。
    • WWDC落ちちゃった人向けのカンファレンス

ネイティブの先生による指導を受けた

  • 1.5h * 7回
  • プレゼンターノートに発表のポイントとなる箇所を記述

成功体験!

  • 準備したこともあって緊張もほぼなかった
  • 期待していなかった人にも楽しんでもらえて大成功!

失敗!

  • Q&Aは大失敗だった!
  • チケット数万円もするQ&Aで英語が聞き取れないのは失礼だと思った

公演後

  • ネイティブでも聞き取れないことあるし気にしなくていいよというアドバイス
  • あとでフォローする形をとったが、それも普通のことだったようだという知見

海外のカンファレンスで話をして結果どうだったか?

仕事につながった件数

  • 0件
  • むしろ減った

英語力どうなった?

  • 講演
    • Transcriptを用意すればおk

100%行ってよかった

  • 失敗多かったけれど、得難い経験・実績ができた。

Track A 11:00 - 11:30 「RxSwiftは開発をどう変えたか?」 ishkawa @_ishkawa

14087753_1089487687802967_1840013869_o

14037777_1089487274469675_1624075255_o

RxSwiftの概念

  • イベントストリームを抽象化するライブラリ
    • ボタンタップ
    • textfieldの文字列が変更された
  • Observable
    • イベントストリームを表す型
    • let text = textField.rx_text // Observable
    • UIKitに関わるものはRxCocoaから提供されている
  • subscribe(_:)
    • イベントごとにクロージャを実行
    • イベントごとに値を出力
    • text.subscribe { print($0) }
    • イベントを個別に受け取れる
  • bindTo(_:)
    • Observer(概念)に自動反映する
    • ObservableとObserverは入出力の関係
    • textField.rx_text.bindTo(label.rx_text)
    • UITextFieldのtextからUILabelのtextに自動反映
    • イベントストリームを接続できる
  • Operator
    • Observableの変換・絞り込み・組み合わせ
    • 変換:map,flatMap
    • 絞り込み:filter,take,skip
    • 組み合わせ:zip,combineLatest,merge
    • アプリにおいては苗字と名前を結合して出力するなどの例
  • Rx vs 従来方式
    • Rxは水道にホースをつなぐイメージ
    • 従来方式のTargetActionの方式はバケツに水を入れるイメージ
  • Rxと従来方式の違い
    • Rxはそのまま直繋ぎで水を送る
    • 従来方式は貯められたバケツの水を取りに行く

天気情報取得アプリの実装例

なにが嬉しいのか

  • 処理の流れが負いやすい
  • どういう順序で何が起きているのかがわかりやすいという点で、delegateで実装していたところに対するアドバンテージ

まとめ

  • イベントストリームを宣言的に扱えるようになった
    • 複雑でも全体を把握しやすくなった
    • ストアドプロパティによる状態管理を減らせる

Track B 11:40 - 11:55 「360°写真、動画を用いたVR対応アプリの開発方法」 Yukinaga Azuma @yuky_az

14045221_1089510754467327_756251405_o

バーチャルリアリティ(VR)とは?

  • 五感や想像力を刺激し、「そこにないもの」を作り出す
    • 広い意味だと映画とかも含まれるかもしれない
    • 今日は狭い意味でのVR

VRに必要な要素

  • 臨場感
  • 快適性
    • 快適性がそこなわれるとVR良いが起こる

スマートフォンによるVR

  • 二眼ヘッドマウントディスプレイにスマホを装着
  • デバイスの向きと映像の向きを一致させる

スマートフォンVRの特徴

  • ハイエンドデバイス
    • Oculus Rift, HTC Vive, Play Station VR
  • スマートフォン
    • iPhone, Android

アプリへの要求

  • 臨場感&快適性のために高いフレームレートを維持する必要がある
  • リソースの無駄遣いを抑える
  • 距離の見地はほぼ不可。体を固定する必要がある

360度ライブストリーミングアプリの開発例

実装方法の選定

  • Google VR SDK
    • お手軽だが、カスタマイズがきかない
  • Unity
    • デバイスに特化した機能を引き出すのは難しい
  • SceneKit
    • 高フレームレートを維持するのが難しい
  • Open GL ES + GLKit
    • 難易度は高い
    • パフォーマンス&カスタマイズ性が高い
    • 最終的にこれを採用した

頭の向きの検出

  • CoreMotionを利用してデバイスの向き(= 頭の向き)を取得

マルチスレッド処理

  • モーションセンサと同期、スクリーンに描画:シリアルキューの優先度高
  • ピクセルバッファの処理、テクスチャの貼り付け、通信データの同期:シリアルキューの優先度低
  • 冒頭で述べるVR酔いを防ぐためにこの優先度となっている

まとめ

  • パフォーマンスの向上
    • CPU, GPUの最適化
  • マルチスレッド
    • 複数の処理を並列して行い、特定のボトルネックになるのを防ぐ
  • 3D描画
    • 描きたいイメージを数式化する

Q&A

  • Q. スマホかぶっていると操作できないけど、そこのインターフェースはどうするの?
    • A. 今回はゴーグルを外して操作する実装にした。世の中には視線で操作するものもある

- 13:25 お昼休憩

marty-suzuki氏とのモスバーガー
14034698_1089553461129723_2347051222462593322_n

会場設置の無限コーヒーとオリジナルチロルチョコ
14012041_1089570277794708_398826226_n

14101785_1089570341128035_1372594725_n

Track B 13:35 - 13:50 「「まりも」とiOSの6年間」 Kosuke Ogawa @koogawa

14045464_1089576424460760_1786854637_o

14037605_1089576421127427_1362320324_o

まりもの特徴

  • たまに水を換えるだけで勝手に成長
  • iphoneの練習用に作ったアプリ
  • 2010年10月リリース
  • 70万DL突破
  • テレビでも紹介されました

まりもを支える技術

  • 加速度センサー
  • 輝度センサー
  • 物理エンジン
  • シェイク見地
  • ジェスチャー検知
  • UIKit Dynamics
  • iAd
  • などなど

まりもの進化とともにiOSの歴史を振り返る

iPhone OS 3

  • UIAccelerometer
  • 衝突判定時前実装
  • タップ判定もUITouchで自前実装

iOS 4

  • iPhone OS -> iOS
  • 壁紙が設定可能に!
  • マルチタスク対応!
  • アプリをバックグラウンドに置くことが可能に

iOS 5

  • UIAccelerometerがdeprecated
  • CoreMotionに乗り換え
  • Storyboard, ARCが使えるようになる
  • Twitter.frameworkが登場
  • これまでは自前でOAuth認証必要だった

iOS 6

  • Twitter.frameworkがさっそくdeprecated
  • Social.frameworkに乗り換え
  • Facebookへのシェアも楽になる
  • AutoLayoutが使えるようになる

  • まりもが突然リニューアル!

    • リアルな感じに。
    • 荒れないか怖かったけど、好評で良かった

iOS 7

  • UIKit Dynamicsが使えるようになる!(iOS芳醇物理エンジン)

iOS 8

  • iPhone 6/6 Plus
  • 幅320px神話が崩れた
  • 広告のサイズが合わずに苦労した
    • 広告配信業者の対応を待った
  • Swiftが発表された
    • まりもアプリはまだObjective-C運用です

iOS 9

  • UIKit Dynamicsがパワーアップ
  • 円形の衝突判定にも対応!
    • まりもの衝突判定がリッチに!

iOS 10

  • 何をしようかな

まりもはiOSと一緒に進化していきます

まりもから学んだこと

Appleとの戦い

  • 初期リリース時、何度もリジェクトされ続けた
  • 最終的にレビュアーから国際電話がかかってきた!
    • 電話代はこちら持ち
    • 年会費払ってるのにリリースできない理不尽さ
  • 3ヶ月に渡る戦いの末、ようやくリリース

競合との戦い

  • こちらがリリースした機能を丸ごと真似されることも多くなった
  • 真似されるくらい良いものを作ったんだ!と考えるようにした

Track A 13:55 - 14:20 「メモリー管理の嬉しいバイキング料理」 Ray Fix @rayfix

メモリー管理

  • swiftのメモリ管理はほとんど勝手にやってくれる
  • でもその内容を知っていると良いことがあるので発表します

スタックvsヒープ領域

スタック

  • スタックはとにかく速い!
  • 構造体など値型はスタックでメモリを割り振る

ヒープ領域

  • 参照型はヒープを使います
  • initするとヒープ領域を確保します
  • すると参照カウンタが+1されます

循環参照の問題

  • letを使おう
  • weak(弱参照)を使おう
  • クロージャの中でのメモリリークの話

キャプチャクロージャを使う

  • [unowned self]
  • [weak self]

まとめ

  • 美味しいswiftを書くにはメモリとの相性を把握する必要がある

Track A 14:55 - 15:10 「iOSアプリのリモートサポートツール「ミレタ」の作り方 #WebRTC #Swift #PrivatePod」 Yuichiro Masui @masuidrive

  • 風呂グラマーの人
  • Apple Watchを一番最初に買ってテレビにも出た
  • IT芸人

Miretaについて

  • iPhoneの画面をブラウザで同期して写す
  • 電話サポートで意図が伝わらない辛い思いから開発した
  • WebRTCというプロトコルで実装しています

WebRTC

  • Web RealTime Communication
  • 主にビデオチャットなどで使える
  • Safariでは未対応
  • iOSとAndroidのSDKもある

WebRTCの技術について

  • ファイアウォールが問題
  • WebRTCではシグナリングサーバーによって
  • シグナリングサーバーによってファイアウォールに穴を開ける技術がある

実装

  • スクリーンショットを定期的に取り
  • WebRTCでブラウザに送信
  • ブラウザの手書きをiOSに送信

Mireta SDK for iOS

  • 接続部分のコードをパッケージ化
  • 画面と一緒に送るデータを設定
  • シグナリングサーバ部分を抽象化

SwiftでCocoaPod

  • SwiftでPodを作るとPrivate frameworkが正しく認識されない問題
    • CocoaPodsのissueに上がっているがなかなか解決されない
  • Monkey patch的に対処
  • 全行程で一番大変だった

React + Redux

  • Redux慣れられない
  • 同じような宣言をActionとReducerで繰り返す
  • タイマーやWebRTCはmiddlewareで処理

WebRTC != Video chat

  • WebRTCはブラウザ間のビデオチャット以外にも使い手はある
    • だいぶ大きなサイズの容量を送受信しても大丈夫!
  • 正直なかなか思いつかないけど
  • これで余ったiPhoneで動くビデオカンファレンスアプリ作りたいな

TORETALAB

Track A 15:20 - 15:35 「Swift で JavaScript 始めませんか?」 熊谷 友宏 @es_kumagai

  • JavaScriptがSwiftで使える!
  • WKWebView? いいえ、JavaScriptCoreでできます!

JavaScriptCoreといえば

  • JavaScriptを実行できる閑居う
  • コードはランタイムで走る
  • Swiftとの相互利用ができる

JavaScriptCoreの使用例

  • 再ビルドせずに実装を差し替える
  • アプリの動作カスタマイズのためのカスタムスクリプト環境を提供できる
  • Web経由でアプリの実装を変更できる

ちょっと強力すぎない?

  • アプリの審査通るの?
    • ぜんぜん考えてませんでした

JavaScriptCoreの基本的な使い方

  • JavaScriptCoreをインポートする
  • JSContextを生成する
  • context.evaluateScript

JavaScriptCoreの変数の扱い方

  • JSValue型で扱う
  • toTypenameメソッドを使う

Track A 15:40 - 15:55 「Xcode で快適なデバッグライフを追い求める」 Toshihiro Morimoto @dealforest

クラッシュしたらAppDelegateだった問題

  • もしくはアセンブラだった問題
  • Exception Breakpointを追加
    • Exceptionが発生した時に止めてくれる
    • うまく動かないケースもある
  • Diagonosticsを設定
    • 不正なメモリ操作を検知
    • dynamic library関連のロギング

どのViewControllerがわからない問題

  • 新しいプロジェクトに関わり始めた時
  • 転職した時

解決方法

  • Symbolic Breakpointを設定する
  • viewDidLoadとviewWillAppear、どちらかは存在するはずなので両方設定してたりする

起動時に特定のViewControllerにしたい問題

  • デバッグの時に遷移がめんどくさい問題

Environment Variablesを使う

  • DF_STORYBOARD_NAME = Main: setting
  • Xcodeから起動した時のみ有効
  • 一時的な分岐を使いたい時に便利
  • 強制ログアウト、ローカルホストなどの実用例

端末のログやファイルを取得したい問題

  • DBからデータを取得したい時など

解決方法

  • LLDBを使ってログをSlackに送信
  • こちらを有効にするとslackコマンドが使えます。 send to slack in LLDB

LT 「エラーと警告でコードをデザインする ~赤と黄の輪舞曲~」 ezura @eduraaa

  • errorはお好きですか?
  • warningはお好きですか?
  • 処理の異常や誤りを教えてくれる大切な存在
  • 記述したタイミングで、実行前に知りたい
  • できる!(場合もある)

Phantom Type

  • 一度だけ呼ぶことをプログラマーに教えたい
  • Phantom Typeは特定の状況でのみ使用可能なメソッドを定義可能
  • 一回呼んだものをもう一度呼ぼうとするとエラーが出る!

Declaration Attributes

  • メソッド名を変えたい時
    • ライブラリとか汎用的に使っているもののメソッド名は変えづらい
  • @availableを使うと「実行前に古いメソッドから移行して欲しい」という意図を伝えることができる

LT 「ド文系の私がiOSアプリエンジニアになった理由。」 m-naruse

  • 5円玉チョコレートのような懐かしさをこのLTで感じていただければ!
  • 「マニュアル車とエンジニアは親和性が高い」という持論
  • せかごろ!世界史の語呂合わせ暗記アプリ
  • 世界史の語呂合せを共有するアプリ
  • 始めた頃はHelloWorldの出力しかわからないレベルだった
  • 1年半かけて完成させました!
  • 指摘と良い評価がモチベーションになりました
  • アイデア先行型が大事だと思った
  • Storyboardでビューが120枚!!!

LT 「コミッターが語る!ReactiveCocoa 5.0 」池田 翔 @ikesyo

  • Repository Split
    • リポジトリが分割されます!
  • API Design
  • Signal
    • Lifetime Semanticsが変わる
  • SignalProducer
    • bufferが変わる
    • onが変わる
  • Properties
    • AnyPropertyとConstantProperty
  • Atomic
    • スレッドセーフな感じでラッパーを使える
    • パフォーマンスが最適化されました
  • Others
    • Lifetimeというものが追加される
  • 楽しいReactive Cocoa開発を!

LT 「5分で開発者として英語対応する方法」 Yusuke Ohashi @iMickx

  • どこが差なのか
    • 留学してる
    • youtube見てる
  • ほとんどの人にとって英語はセカンドランゲージである
  • ジャパニーズプロトコルの翻訳は難しい
  • 英語を勉強すると良いことがある
  • 大事なことは「英語を嫌いにならないこと」
    • 気楽にやったらいい

LT 「Generative Programming in Swift」 kaneshin @kaneshin0120

  • CoreStoreというライブラリ
    • CoreData向けライブラリ
  • Generative Programmingとは?
    • ジェネリックとか
    • ジェネリックなクラス、プロトタイプベース、テンプレート、ほげほげなど
  • Gang of Four
    • 高度化されたプログラムは性的なプログラムより読むのが難しい
  • GO言語にはGenericsが今のところない
  • コード生成
    • APIのクライアントを作るというところに焦点を当てています
  • genkit

LT 「ここからが本番!! watchOS 3」 Motoki Narita @motokiee

  • iOSDCで1本目のWatchOSの話なので一人WatchOSDC
  • AppleWatchアプリ作ろうよ!という話

Apple Watchの歴史を振り替える

  • watchOS 1
    • WatchKit ExtensionはiPhone上で動いていた
  • watchOS 2
    • WatchKit ExtensionがWatch上で動くようになった
    • これによりiPhoneとWatchの通信を行う必要が出た
    • Watch Connectivityフレームワーク
    • Watch上で動くようになったものの、いまだ起動時間が遅い問題
  • watchOS 3では起動速度が7倍に!

watchOS Human Interface Guidelines

  • Design Principle
    • Glanceable
    • Actionable
    • Responsive

Background Tasks

  • dockが追加された

ローカル通知

  • watchOS 3から単体でLocal Notification出せるようになった!

LT 「AWS Cognitoを実際のアプリで導入してハマったこと」 Yoichiro Sakurai @saku2saku

  • Push通知寄りの話です
  • Parseがなくなるの、結構ショックでしたよね

はまるポイント1

  • Push通知を大量に配布したいが、Lambdaには起動時間の上限がある(10分)
  • 並列実行をするためにSNSへの鳥がを元にLambdaを起動
    • SNSとLambdaの連携がイマイチ
    • 設定していたはずの連携が消えているなど
    • 「不安定だからみんなS3を使っているよ」という公式回答?

はまるポイント2

はまるポイント3

  • カスタムURLスキーマを使ったPush通知が遅れない!?

LT 「New Cast SDK」 wasabeef @wasabeef_jp

  • Castを接続する部分を自作する必要がありました
  • v3になることでラップしてくれるように
  • 「Sender側」と「Receiver側」というキーワード
  • 細かいところはドキュメントを読んでください
  • これまではReconnection処理を自分で書くのが大変だった

まとめ

  • 時間があるのでまとめを使って雑談します
    • やっぱ、まあいいや

LT 「iOSエンジニアしてたら紆余曲折あってIoTエンジニアになった話」 よぴた @yopita_

Web業界への踏み入れ

  • Webデザインとかやっていた
  • 1単位足りずに留年したのでiPhoneアプリ作り始めた
  • 68万DLとかいってなんかすげぇことになった

研究業界への踏み入れ

  • kinect使って180万ゲットだぜ
  • 金があったから勢いで会社作った
  • あれこれやってたら内定なくなった

雲行きが怪しくなった

  • VCこわい
  • 大学院に逃げ込んだ
  • ねんどの形から何を作ったかわかるプロダクト作った

就職できた

  • IoTってなに?
  • 上から下まで幅広くやってきたしなんとかなるかなあと思った
  • konashiというアイコン

座ってなんかしてると生活費降ってくる社会人すごい!

LT 「英語が苦手すぎて財布を店員に渡して会計を任せる僕が、ATS必須化についてAppleのエンジニアに英語で聞いてきた生存戦略」 にわタコ @niwatako

  • ATSについてWWDCのラボで聞いてきた
  • はてなブログにATSまとめのマトリックス書いた
  • 質問原稿を用意した
  • 作ったチェックリストを一緒に確認してもらっていった
  • 英語ぐだぐだだったけど「多分動くからリリースしようぜ」精神
  • ネイティブとの通信プロトコルを確立した
  • 難しかったら自己紹介と質問理由だけでも用意できると良さそうです
    • 人は理由とか背景がわかると察してもらえるという心理学
  • 理由付き質問とあらかじめメモ戦略

LT 「ハッピーな開発チームを築くためにiOSエンジニアがしたこと」 原 一史 @haranicle

  • nohanaというアプリ落としてください!
  • ハッピーってなんだろう?

開発しているサービスがグロースするためにしたこと

  • ドッグフーディングランチと競合調査ランチの実施
  • ドッグフーディングランチ:サービスの改善すべき点がみやすくなった
  • 競合調査ランチ:差別かすべき点が明確になった

早く帰れるようにしたこと

  • 開発フローの整備
    • ディレクターがいなくて、エンジニアとデザイナーの手戻りが多かった
    • 認識違いなどでコミュニケーション齟齬
    • 進捗挽回のために残業

成長できるようにするためにしたこと

  • デザイナー向けStoryboard勉強会
  • 勉強会の資料はgithubにあがってます
  • 全員のMacにxcodeを入れることに成功
  • デザイナーもエンジニアもStoryboardが使えるようになってハッピー

精神疾患について学んだ

  • 身近な人が病気になったことがきっかけ
  • 真面目にチーム内で精神疾患について理解をして意識していくことが大切

LT 「やはりお前らのiOSアプリ開発は間違っている」 yimajo @yimajo

  • BaseViewControllerについて話します

なにが間違っているか

  • BaseViewControllerを継承したくない場合でますよね
    • 継承しなければよい
  • つまりBaseViewControllerってオレオレフレームワークですよね?

  • BaseViewController = オレオレフレームワーク

  • 「力が欲しいか」という己の内から聞こえる声

YAGNI原則に従う

- 必要になった時に必要なことをすればいいよ

エモい話し

  • 本当は開発に間違いなんてない

まとめ

iOSDC素晴らしい会でした!
って言うと来年も開催されるって聞きました!()

でも本当に素晴らしい会でした!楽しかった!
たくさんのスタッフの方、参加者の方、お疲れ様でした、ありがとうございました!

このブログは後ほどコンポーネント化して見やすい形にしようと思います。
スライドの追加や更新をしていくつもりですので、また見ていてください!