kumamotone’s blog

iOS/Android アプリエンジニアです https://twitter.com/kumamo_tone

potatotips #49 に参加しました (iOS, Androidブログまとめ)

potatotips #49iOSブログまとめ枠で参加させていただきましたのブログです。

メルカリさんの会場。

f:id:kumamotone:20180313202426j:plain

f:id:kumamotone:20180313202404j:plain

大変良さ。

f:id:kumamotone:20180314011310j:plain

f:id:kumamotone:20180314011318j:plain

成城石井の高めのポテチとヘルシーピンチョス。良さ良さ。

以下発表内容です。iOSブログまとめ枠でしたが今回もAndroidの発表内容に関してもまとめてみました。間違いや気になるところなどあればご指摘ください。

埋まっていない資料は公開されたのを見つけ次第反映します。

XCTestを目的別に分けるすすめ / gaopin さん

speakerdeck.com

数ヶ月前、チームにジョインしてあることに気づく。自動テストコケとるやん。

gaopinさん「自動テストこけてるよ」

チームの人「問題ないw」

gaopinさんのプロダクトは、膨大で複雑なログの絡むプロダクトで、スプリントごとにテストを回していて、スプリント途中はテスト通らなくてもしょうがないみたいな感じになってた。

でもこれテストターゲットを分割すれば良いだけの話。

方法も簡単で、

  1. (プロジェクトの↙にある+)ターゲットを追加 iOS Unit Testing Bundle を追加

  2. 分割したいテストのファイルのメンバーシップを変更

みたいな感じ。これで個別に実行できるようになった!

おすすめの分割タイミングは以下。

  • 実行タイミングが違う
  • 実行する範囲が違う
  • 別チームで作業している(これは微妙かも)

OK google, プロジェクトのbuildして」 / satsukies さん

speakerdeck.com

前回のpotatotipsの Alexa、APKを配布して // Speaker Deck が面白かったのでやってみた。

流れ。我々「プロジェクトHogeをビルドして」→GoogleHome「わかりました」→GAS等使って「プロジェクトHoge」に対応するBitrise起動→Bitriseでビルドしてapk配布。対話を通じてプロジェクトIDを聞き出す。

DialogFlowで、Agentの作成して、Entityの登録して、Intentの登録する。Entityの取り出しはTraining Phrasesにユーザーの発言を入力するだけ。するといい感じにパラメータを学習してくれる。最後にResponse定義する。Default Fallback Intent(うまくいかなかったときの反応)もここで定義。

その先の内容は飛ばしてActions on GoogleのSimulator を使ったデモ。

ExoPlayerで音遊び / daasuu さん

予習。ExoPlayerとは

Google の動画ライブラリ。

github.com

shunirr.hatenablog.jp

ExoPlayer とは:

従来の MediaPlayer (Stagefright / NuPlayer) は C や C++ で実装され、かつ実装は Android フレームワークに組み込まれているので、 MediaPlayer 内部で不具合があったときに修正や、 MediaPlayer そのものを修正して新たなフォーマットやプロトコルに対応させることをアプリ開発者が自由に行なえず、端末や OS のアップデートが必要でした。

ExoPlayer は Google が開発している Android 向けの新しいメディアプレイヤーで、全て Java で実装されており、またアプリケーションに組み込んで利用するライブラリの形式で配布されています。

これにより従来の MediaPlayer で不可能だった、アプリ開発者によるプレイヤーの拡張や修正が可能になっています。

内容

Presentations by Masayuki Suda // Speaker Deck

Androidでの音再生の方法おさらい。MediaPlayerはBGM等の長い音の再生に使える。SoundPoolは5秒未満なら良い。AudioTrackはバイナリ直なので難易度が高いが、自由度は高い。

ExoPlayerというライブラリがある、これは動画のライブラリ 動画再生だけでなく音の再生にも使える。

最近では音程や倍速にも対応できるようになってきた。ピッチではなくスピード、音程だけでも設定可能。すごい。

TD PSLOLAアルゴリズムを使っている。これは音のスペクトルをある程度保ったままピッチやテンポを保ったまま上げれる。

具体的には、以下のような感じでやってる。

  1. ピッチに対応した波形の1周期をみつける
  2. 周期を切り出す
  3. 切り出した周期を使って音声を再合成

これをやっている部分だが、ExoPlayerでSonicで検索すると良い。ちなみに48k→44.1kのリサンプリングなどもできる。

たった2行で本格アプリ!?挫折しないSwift勉強会の裏側 / AkioItaya さん

iOSアプリの作り方を教えたりされているAkioItaya さん。

github.com

教え方の一例を紹介。キャラクターと一緒に記念撮影を行えるシンプルなカメラアプリ↑をcloneしてもらう。2行書くだけで完成、という状態にしてある。

なぜ2行の実装で終了するのかというと、2行追加するViewControllerの継承元のクラスやextensionに実装が隠蔽されていて、それらを種明かしをしながら動作を理解してもらっている。

とりあえずちょっと何か書いて動く状態にしてわくわく感を得た後、逆順に説明することによって挫折しない工夫をしている。

shared element基本のき 〜パターンで見るshared element〜 / e10dokup さん

予習。shared element とは

developer.android.com

f:id:kumamotone:20180313180730p:plain

Shared Elements 遷移は、2 つのアクティビティで共有されているビューが、各アクティビティの間でどのように遷移するかを決定します。 たとえば、2 つのアクティビティで同じ画像を異なる位置とサイズで使用している場合、changeImageTransform 共有要素の遷移によって、2 つのアクティビティの間でスムーズに画像が変換されスケーリングされます。

re-engines.com

Airbnbとかで使われてるUIらしい。ぽよんって遷移するやつ。API 21から使える。

内容

speakerdeck.com

Shared Element Transitionはガン遷移前後で共通になっているviewをアニメーションさせるもの。Google Play Storeのアプリリスト->詳細とか。

Shared Elements viewにtransitionNameを着ける

Activity-Activityの場合、Fragment-Fragmentの場合、RecyclerView-Activityの場合、RecyclerView-ViewPagerの場合をそれぞれ説明。

RecyclerView-ViewPagerパターンめっちゃめんどくさい。

あとShared Element Transitionしないほうがよさそうなときもあって、遷移前後でshared element対象のViewのVisibilityが保証できないとき、遷移前後で保持するリストの内容が違うときなどがある。

リポジトリ

github.com

App Store 予約注文を使ってみた / toshinarin さん

App Store、予約注文としてリリースができる。24時間以内に(時間は指定できない)自動的にユーザーの端末にダウンロードされる。

予約注文数が見れてPR・マーケティング的に良いし、利用可能になったら自動的にダウンロードされてメールとPushがくるのでユーザビリティ的にも良い。

実際の設定の仕方は簡単で、価格及び配信状況のバージョンのリリースでできる。

注意点としてはアプリを使い始める時間を完全にはコントロールできない。

ちなみにアプリ自転車が必要で審査できないので、動画で撮影して App Reviewに関する情報>メモに動画を添付とした。

動画編集についてだが、iPhoneで撮影、iMovieで編集すればPinPとかもできるので良い。

Swiftバグレポートレポート / kazuhiro4949 さん

speakerdeck.com

bugs.swift.orgからXcode 9.2 で再現できるバグをピックアップ!

SR-7090 Codable に関するバグ

  1. クラスAがCodableを実装している
  2. クラスBがAを継承している
  3. Bを初期化orデコードして、プロパティにアクセスするとランタイムエラー

SR-7102 パフォーマンスに関するバグ

Swiftでは複雑な式を書くとコンパイルが中断されることがあるのだが、似たような式を書いても中断されるとき、されないときがある。

SR-7115, SR-7120 キャプチャリストに関するバグ

SR-7115。クロージャのキャプチャリスト内で??を使用してコンパイルすると確実にセグフォになる。

SR-7120。キャプチャリストがついていないクロージャ内でrethrowするとコンパイラエラーにならないが、ついているとエラーになる。

バグレポート眺めると意外と簡単に発生してしまうバグを知れて楽しい!!

ReactiveSwiftに習うCollectionの最適化とパフォーマンスチューニングパターン / ryo_aoyama さん

speakerdeck.com

ReactiveSwiftにBagというのがあって、Signal(Observableっぽいやつ?)をKeyで管理している(たぶん)なのだが、これがどういう高速化をやっているかという話。

1。ContiguousArrayを使う。classか@objcのときにメモリの連続した領域に格納し、イテレーションを高速化できる

2。最適化済みのstdlibをそのまま利用することにより自前実装よりも高速化出来る場合がある

3。デフォルトで実装されるIndexingIterator内部で関数呼び出しにコストがかかるため

4。あとから追加されたもののほうがremove(for: )されやすいという考えで逆順に探索。

実験。add, iteration, remove を10,000件に対してやったら200倍高速化していることを確かめた。

配列はパフォーマンスチューニングしやすいので重い場合はおすすめ。

“Hello Flutter”の次におさえたいFlutterのポイント / Kenichi Kambara さん

練習に作ったアプリの紹介と、Hello Flutterの次にするとよさそうなこと。

Flutter 書くの、Android Studio使うと便利。SDK入れる。flutter doctorでチェックできる。Flutter用のプラグイン導入で簡単。これでDartも入る。起動時のダイアログでStart a new Flutter projectできる。良い。

Perform hot reload on save で Save 時に Hot reload も可能。View 例で出てきたアプリだと、ScaffoldにAppBar, body, FAB がぶら下がっている感じ。

OS別テーマ切り替えなどもできる。DartでViewを書くっていうのがちょっとつらいかもだが、ハマると良さそう。

独自Documentクラス / 村上幸雄 さん

fr.slideshare.net

MVC、よく批判される古典的なMVCと、AppleCocoa versionとして提唱しているViewとModelが干渉しないタイプのMVCがある。

Macアプリの場合NSViewとdataがNSDocumentとNSViewControllerを介して連携することになりそう。Document(Controller)部分に使えるものとしてiOS5から使えるUIDocumentクラスというのもあるが少々オーバースペックなので、Documentを独自実装したときの反省点などを紹介。

Spannable芸〜郵便番号編〜 / HiroYUKI Seto さん

予習。Spannableとは

weide-dev.blogspot.jp

Spannable はテキストをマークアップするためのインターフェースです

CharacterStyleなどのクラスを使って文字列の一部を 下線を引いたり、下付き文字にしたり、 上付き文字にしたり、URLを付けたり... と様々なことができます

内容

speakerdeck.com

最高の郵便番号入力欄を作りたい。

  • 3桁目と4桁目の間にハイフンを表示させたい
  • 3桁目を打ったらハイフンの後にカーソル移動
  • シームレスに移動。7桁ペーストしたらペーストされるし4桁目で文字削除したら左に移動。カーソル移動も。

EditTextでは解決しきれない。それでSpannableを使う。これは文字列のデコレーションのinterfaceで、未確定文字列の色などもSpan。ReplacementSpan、これはTextViewの文字列を置換するSpanで、独自絵文字なんかはこれで作られている。

ReplacementSpan で気合入れつつ実装 サンプル↓

github.com

UITableViewControllerの利点を最大限に活かす使い方 - コードでAutoLayoutを記述する場合 - / masashi-air さん

speakerdeck.com

ContainerViewを使えばUITableViewControllerの利点を最大限に活かしてレイアウトできる。

UITableViewController、UIViewControllerにtableView貼り付けるに比べて色々利点があって、

公式ドキュメントに書いてある

  1. tableViewプロパティに非オプショナルでアクセス可能
  2. delegate, dataSourceがデフォルトで設定済み
  3. clearsSelectionOnViewWillAppear
  4. 表示時にテーブルのスクロールインジケータを点滅
  5. setEditing(_: animated :)

のほかに、なぜ書いてないのかわからないがキーボードの高さを考慮して入力範囲を隠さないようにスクロールしてくれたりする。

ただ、難点あって、画面下にView置きたかったりしてaddSubViewしたりすると表示おかしくなったりする。

が、ContainerView使うとうまくいく。iOS10以前だとtableViewのInsetに設定が必要だが、ContainerViewを持っているVCにif #available(iOS 11.0, *) { } else { /* ほげほげ */ } とかやっておけば後々コード整理しやすい。

サンプルです↓

github.com

try! Flutter / Rui Kowase さん

docs.google.com

Flutter 書くの、Android Studio使うと便利。SDK入れる。flutter doctorでチェックできる。Flutter用のプラグイン導入で簡単。ビルド速くて良い。Hot Reload良い。オフィシャルドキュメントが充実している。

サンプルアプリの紹介。Scaffoldというのが使える。async/await使える。

github.com

おまけ。Flutterはときめきますという意味らしい。エラーのスクリーンのカラーコードが #7C160E とかで比較的心温まる。

Introduction to LLVMSwift / kitasuke さん

予習。LLVMSwiftとは

github.com

LLVMSwift is a pure Swift interface to the LLVM API and its associated libraries. It provides native, easy-to-use components to make compiler development fun.

内容

持ち帰って欲しいtips

LLVMSwiftの紹介。LLVMSwiftはLLVM C APIのSwiftのラッパー。Swiftコンパイラーのコミッターが2人居て主にその人達が書いてる。

サンプルのシンプルなプログラムとその出力のLLVM IR見てみると、まぁただのSwiftのラッパーだな〜という感じ。わざわざCのコード読んで勉強するより分かりやすいはず。

Cで使えばいいじゃんってなるけど本人達も名言してるかどうかしらんがLLVM、Swiftで書いたぜっていうそういう勢いが大事。

README.md に書いてあるIntroductionの説明。

界隈でSwiftコンパイラ流行っていて、silとかASTとかLLVMコンパイラとかいろんな層ある。でこういうのあると勉強に良さそうなので紹介しました。

感想とか

iOSでShared Element Transitionっぽいやつ

もっと気軽にUITableViewController使いてぇよ

Flutterさん我々を救ってください