iOSDCに参加してきました

iOSDCって?

iOSと周辺技術を題材としたカンファレンスです。 去年から始まり、今年は早稲田大学キャンパスで開かれました。

f:id:Mitsuyoshi:20170921194305j:plain

参考になったトーク

「それは正論だけど、どうやって実現するの?」の「どうやって」の部分が聞けて満足でした。 Ask the speakerという、発表者に直接質問できるブースが発表の裏に常にあって、そちらは人が少なかったので突っ込んだ質問ができました。

Build high performance and maintainable UI library

UIライブラリを例にとって、

依存が大きく複雑で、単体でテストしづらいコードを単体で動かしてテストできるようにするには

ということを説明されていました。

私もUIライブラリを作成しているので、発表のために作成したモックではない、実稼働しているライブラリの例は現実的な落とし所が見れて非常に参考になりました。


  1. アプリでUIのユニットテストを行う場合はあるか
  2. Signup画面など、重要度が高く(新デバイスでsignupボタンが押せない位置にあったりすると潜在ユーザーを逃す)、滅多にデバッグせず、変更されないような部分は行う価値が高い

MVC以外のデザインパターン

今回のiOSDCでは、iOS開発におけるデザインパターンについて、二人の方が発表されていました。

@ktanaka117 さんの 節子、それViewControllerやない…、FatViewControllerや…。 @marty_suzuki さんの MVC→MVP→MVVM→Fluxの実装の違いを比較してみる

私はMVC以外のデザインパターンを、UIKit(MVC)上でどれだけ厳密に表現するかということに悩んでいたので、落とし所をどこに持っていくか聞けて良かったです。

具体的には、VもVMもDisposeBagを持っていて、「機能を持つ人と、機能を使う人はそれぞれ誰?」という状態だったり、TableViewCell, CollectionViewCellをVMが扱っていたりする部分があり、どういった形に落ち着けるか考えていました。

話を聞いてみた感想としては、現行のシステムを相手に考える場合は、一度そのデザインパターンの理想形を作った上で、差分をどこまで埋めるか決めるのが良いのかなと思いました。

具体例とクイズで学ぶ、Swiftの4種類のエラーの使い分け

エラーの種別を、「どのようにハンドリングしたいか」で分類する、というものです。 同一のコードで同一のエラーが出ても、ユースケースによってはエラー種別が変わります。

これは非常に本質的な考え方だと感じていて、「あるエラーがどの種別であるか議論すること」がそのまま、「エラーをどこでどのようにハンドリングするかを考えること」になるということです。 用語の定義と考え方を共通化することで、面倒なエラーハンドリングの検討を容易にする良い方法だと思いました。

また、短いスケジュールながら練習問題を解く時間も設けていて、「頭で理解すること」「手で覚えること」両方を実現していて、その点も良かったです。

運営について

イベント運営についても参考になる部分が多くありました。

パックマンルール

Ask the speakerや懇親会で話すとき、人の輪に一人分のスペースを空けておくパックマンルール。

実際どうだったかというと、気持ち空いてる輪もあったかな…?という感じでした。 アナウンスは何度かされてましたが、懇親会ではそもそも机がジャマでパックマンになれないグループが多かったように思います(料理があるので机の側を離れられない & 人口密度が高くてパックマンの口を開けられない) 逆にAsk the speakerはトークセッションの裏側で行われたのもあり、参加者がまばらでいい感じにパックマンになれていました。

パックマンルールは参加者の意識を変えようとする試みですが、この結果を見るに、パックマンになれるかどうか、後から来た人を受け入れる余裕があるかどうかは環境要因が大きいのでは…と感じました。

Wi-Fi

テザリング、モバイルWi-Fiを使用すると電波環境そのものが汚染されるので、会場のWi-Fiのみを使うようアナウンスがされていました。 しかしこれには、会場のWi-Fiが繋がらずテザリングする人が出ると、それによりさらに会場のWi-Fiにつながりにくくなりテザリングする人が増える、という悪循環の罠があるのですが、Wi-Fiが繋がらないという声があがるたびに運営が対処し、また対処していることをアナウンスすることで環境が保たれており、ほとんどの参加者が最後まで使えていたようでした。

macOS上に PyCall + TensorFlow 環境を作る

つまりポイントないからコマンド流すだけ

Anaconda

Command-Line Installer でインストールする Download Anaconda Now! | Continuum

TensorFlowのインストー

Installing TensorFlow on Mac OS X  |  TensorFlow

$ conda create -n tensorflow python=3.6

# 作った環境確認
$ conda info -e
tensorflow            /Users/hogefuga/anaconda3/envs/tensorflow
root              *  /Users/hogefuga/anaconda3

$ source activate tensorflow

# 作った環境に設定したPythonバージョンになってるか確認
(tensorflow) $ python --version
Python 3.6.2 :: Continuum Analytics, Inc.

$ pip install --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-1.2.1-py3-none-any.whl

# インストールできてること確認
(tensorflow) $ python
>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
>>> print(sess.run(hello))
b'Hello, TensorFlow!'

PyCallのインストー

Ruby-Pythonブリッジライブラリ「PyCall」を使ってRubyでデータ分析をしよう! (1/3):CodeZine(コードジン)

(tensorflow) $ gem install --pre pycall matplotlib

# pipそのものは、anacondaで環境作った時に既に入ってるのでインストールスキップできる

(tensorflow) $ pip install matplotlib numpy pandas seaborn

(tensorflow) $ irb
irb(main):004:0> require 'pycall'
=> true
irb(main):005:0> PyCall
=> PyCall
irb(main):015:0> module Py
irb(main):016:1> extend PyCall::Import
irb(main):017:1> pyimport :tensorflow, as: :tf
irb(main):018:1> end
=> :tf
irb(main):019:0> Py.tf
=> <module 'tensorflow' from '/Users/hogefuga/anaconda3/envs/tensorflow/lib/python3.6/site-packages/tensorflow/__init__.py'>
irb(main):020:0> Py.tf.constant.('Hello, Tensorflow!')
=> <tf.Tensor 'Const:0' shape=() dtype=string>
irb(main):021:0> hello = Py.tf.constant.('Hello, Tensorflow!')
=> <tf.Tensor 'Const_1:0' shape=() dtype=string>
irb(main):022:0> sess = Py.tf.Session.()
=> <tensorflow.python.client.session.Session object at 0x1046ff470>
irb(main):023:0> sess.run.(hello)
=> "Hello, Tensorflow!"