potatotips #43 まとめ記事 (iOS中心に)



#はじめに
2017年8月28日、[43回目のpotatotips](https://potatotips.connpass.com/event/63472/)が開催されました。iOSを中心に、網羅的にまとめ記事を書きたいと思います。#potatotips 

※随時、リンクなどを追加していきたいと思います。

当日、途中参加された方が追いやすいように、発表順に書きます。

#[iOS] iOSのBLEでハマった事 +Tips/tomoya0xx00さん

バックグラウンドでService UUIDを検出できなかったのでiOSが覚えている識別子を利用してアクセスできたというお話でした。

BLEアプリの開発をするときのハマりポイントとして意識しておく必要があると思いました。

自社製品のBLEデバイスがアプリから見つけようとしたときに、フォアグラウンドでは見つかるのに、バックグラウンドで見つからなかった。アドバイタイズのペイロードが31byteまでであり、問題のケースでは34byteとなっていて、必要な情報がペイロードに登載されていなかったというのが原因だった。バックグラウンドでのスキャンではService UUIDの指定が必要なので、これをどこかから取得できないと実現できない。iOSが過去に接続したことのあるBLEの識別子を記憶しているので、これを利用して解決した。

・BLEスニファーというBLE電波をキャッチしてモニターする機械がある。
・RxBluetoothKitを使うとdelegate地獄が楽になる。
というTipsも紹介されていました。

発表記事
[http://qiita.com/tomoya0x00/items/980126c2a7757095f41e](http://qiita.com/tomoya0x00/items/980126c2a7757095f41e)

#[Android]Annotation Processing

アノテーションをつけておくと、コンパイルするときにコードを自動生成してくれる仕組みがAndroidにある。
Javapoetというライブラリを使うとAnnotation Processingの実装がシンプルになる。

感想: 毎回同じ作法のコードを自動生成してくれるのは良いですね。

#[iOS] VIPERアーキテクチャのRoutingについてのTips

発表資料
[https://www.slideshare.net/keisukeyamaguchi180410/router-module-in-viper-architecture](https://www.slideshare.net/keisukeyamaguchi180410/router-module-in-viper-architecture)

VIPERアーキテクチャーとはどのような仕組みか、Generambaを使うとファイル生成が楽になる、Compassを使うとView要素をURLSchemeで取得できるというお話でした。

VIPERとは、View, Interactor(ロジック)、Presenter(仲介すもの)、Entity(データ)、Routing(なにが、どこにあるか知っている)という切り分け方をするアーキテクチャーで、海外で人気があるそうです。1要素を一つのmoduleとして管理していくのだそうです。ソースコードが1機能1つという実装をしていくと、Generambaというジェネレーターを使ってModuleで簡単に生成できる仕組みが大事だとのこと。Routingを実装するときには、hyperoslo/CompassというOSSを使うと、URLSchemeでModuleを特定できる。つまり、URLSchemeで機能を指定できる。kickstarter/ios-ossの手法を使うと、URLSchemeからView(ViewController)を取得することもできる。

関連資料:
[KickStarter iOSアプリのStoryboardのenumでの管理のしかたに感動した](http://qiita.com/keisei_1092/items/12230bb7ff9106224292)

#[Android] Kotlinコルーチンで作ってみる画像ローダ
@e10dokup

コルーチンという仕組みによって、中断したり再開させることができる。

感想: 処理をポーズできると、何かと便利ですね。

# [iOS] Firebase Realtime Databaseをよさげに抽象化する/Yuya Hirayamaさん

Firebaseを取り扱うためのモデルをプロトコル志向っぽく定義し、読み書き部分をRxSwiftで実装したというお話でした。
技術的関心からObjectMapperなどのライブラリを使わずに実装された経験にもとづく発表でした。

発表スライド
[https://speakerdeck.com/hiragram/firebase-realtime-databasewoliang-sagenichou-xiang-hua-suru](https://speakerdeck.com/hiragram/firebase-realtime-databasewoliang-sagenichou-xiang-hua-suru)


# [iOS] FirebaseUIとSDWebImageのコラボでFirebaseStorageの画像を表示する/@soft_builder_kさん

FirebaseのStorageに画像を保存している状況で、SDWebImageを使うにはどうすればよいか。素朴にStorageのURLを取得すると、DL専用なので、表示に適しない。じつは、Firebase UI-iOSというライブラリが公開されていて、sd_setImage()が提供されており、これにReferenceをセットするだけで使える、という内容でした。

発表資料
[http://qiita.com/k-boy/items/3d6aa6c26a0c6510320e](http://qiita.com/k-boy/items/3d6aa6c26a0c6510320e)

# [Android] Androidで動画編集アプリの技術選択/daasuuさん


動画編集アプリを作ったときの技術選択についてエンコード、動画撮影、動画プレビューの技術選択のお話でした。

エンコードでは、FFmpegがあるが商用は有償なのでライセンスがネックになる。また、動画撮影では電池消費が激しい。MediaCodec&OpenGLESは低レイヤーなのでカスタマイズ性が高いが学習コストは高い。iOSに比較して10倍遅かった。そこで、ExoPlayerFilterというライブラリを作った。

動画撮影においては、ライセンスだけでなく、電池消費が激しい欠点があります。OpenCVはフィルターや物体認識、顔認識などかできるが、パフォーマンスが微妙。MediaPlayerは実装が楽だったが、仕様を満たさない場合は自作する必要があり、実際は自作する必要があるのではないか、という向きのお話でした。

資料
[https://speakerdeck.com/masayukisuda/androiddedong-hua-bian-ji-apurifalseji-shu-xuan-ze](https://speakerdeck.com/masayukisuda/androiddedong-hua-bian-ji-apurifalseji-shu-xuan-ze)

# [iOS] danger-swift/ Satoshi Hachiyaさん

[Danger-Swift](https://github.com/danger/danger-swift)
DangerをCI上で走らせると、PullRequestの内容を静的解析してボットなどと連携して使うことができる。
Ruby版が最初にリリースされて, jsバージョンが出て、勉強会の数日前にSwiftバージョンが公開された。
danger/danger-swift/

Dangerfileという設定ファイルをSwiftで書くことができる。Swift Packer managerで作るコマンドラインツールという形で、Xcode 9/Swift 4を前提に開発されている。ターミナルやCIで使える。

ボットのアカウントを作り、Travis CLの環境設定し、bundle exec dangerを実行すると、プルリクに対してコメントが書かれたように警告を出したりできる。プルリクでのつけ忘れを機械的にチェックするための用途で使うとよい、というお話がありました。

資料
[https://speakerdeck.com/jp_pancake/danger-swift](https://speakerdeck.com/jp_pancake/danger-swift)

# [Android] ViewPager

汎用的に使えるViewPagerを作っておくと便利だったというお話。遷移時のアニメーションは類型的なので、テンプレートがあると捗りますね。
ViewPagerだとアニメーションが早すぎるので、カスタムViewを作って解決されたとのことです。

# [iOS] Natural Language Processing APIとその裏側を覗く/akatsuki174さん
Appleのアプリでどう利用されているか、固定表現抽出とは何か、抽出を楽にするツールの紹介が資料のほうで展開されています。
WWDC 2017のSession 208のビデオに出てくる変換候補のスマート化の紹介がありました。
固定表現抽出は、固有名詞、時間表現などをテキストから抽出する技術で、質問応答とか情報抽出とかの分野で利用されるものだそうです。
チャットボットやテキストベースのデータをまとめるときに便利な最先端のAPIという印象があります。

発表資料の完全版
[Natural Language APIとその裏側を覗く〜完全版〜](https://speakerdeck.com/akatsuki174/natural-language-apitosofalseli-ce-wosi-ku-wan-quan-ban)

# [Android] Dagger2の@ SubComponentとdependenciesについて。

依存注入のツールのDagger2について、@SubComponetは子しか作れないが理解しやすく、dependenciesは子よりも深い関係を作れるが学習コストがややかかるというお話がありました。

関連資料
[Dagger2 を活用して scope を意識した作りを実現する](http://qiita.com/tsuyoyo/items/d48553cdc4189ade17bc)

# [iOS] Getting all Enum element/bannzaiさんによる

Int型の連番のEnumを全要素を取得するSwiftマイクロライブラリを公開されていて、そのご紹介でした。
https://github.com/bannzai/Enumerable

用途としては、UITableView/UICollectionViewのdataSourceをenumで書くときを想定しているそうです。caseの種類の数が一致するという保証が欲しかったので書かれたとのことでした。elementsとすれば、caseの配列を取得できます。

#おわりに
* Firebaseの発表が2件あり、同じ日時でFirebaseの勉強会が開催されていたとのことで、理由はわかりませんが盛り上がっているのかという個人的な感想を持ちました。
* 発表は半々でしたが、iOSの方の参加のほうが多かったようです。理由はよくわかりません。
* 自分はいつもiOSを中心にしているので、Androidの世界の考え方を聞くのはパラレルワールドを見るようで面白かったです。
* 登壇者の方、発表・準備ありがとうございました。主催運営の皆様、大変お世話になりました。会場提供のマネーフォワードさん、駅が近くて便利なオフィスですね。ありがとうございました。
* 抜けやミスがありましたら、適宜、コメントください。よろしくお願いします。m(_ _)m