kumamotone’s blog

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

potatotips #64 に参加しました #potatotips

potatotips #64 のオーディエンス枠で参加させていただきましたのブログです。

Reproさんのオフィス駅近で最高!

ゼロカフェインコーラ最高!

ブログ枠じゃないので気軽に行くぞ!

Object指向でFatViewControllerをなくす

speakerdeck.com

github.com

テキスト入力制御へのアプローチ for Android

speakerdeck.com

f:id:kumamotone:20190827204517p:plain

どこがはみ出てるか教えてあげるやつは

f:id:kumamotone:20190827204440p:plain

最大文字数を超えた文字にBackgroundColorSpanを設定して

f:id:kumamotone:20190827204502p:plain

リスナーに追加すればOK

github.com

コントロールセンターとたたかう

speakerdeck.com

Event Recap from DroidconKE 2019 

ケニアでDroidconがあったので行った話

アフリカの人陽気で良い

Conditional Content in SwiftUI

speakerdeck.com

TruthとAssertJを比較してみた

speakerdeck.com

github.com

iPhoneFeliCaを読み取ってみた

speakerdeck.com

github.com

www.wdic.org

AACで犯しがちな間違い

speakerdeck.com

note.mu

DIKitで人間がクラス間の依存関係解決するのを終わらせる

github.com

DIKitを使うとDIができます

SwagGenのススメ

github.com

SwagGen を使うと OpenAPI/Swagger 3.0 対応の形式のパースと生成ができる

Chucker で GraphQL の通信ログを見やすくした

speakerdeck.com

f:id:kumamotone:20190827210715p:plain

見やすいわね

GraphQL のサポートがほしかったので、 issue を出してプルリクを送った。

github.com

macOS アプリを2年ぶりにメンテしたら原型がなくなった話

speakerdeck.com

Flutter Pluginを作る

speakerdeck.com

あとCordovaとの比較をしていた Flutterのプラグインシステムは開発体験が良い


感想とか

意外と最後まで集中力が持ってよかった ブログ枠のときもこのくらいの気軽さでやってもいいかもしれない

以上です!

Kotlin Fest 2019 に参加しました #kotlinfest

f:id:kumamotone:20190824215157j:plain

開催2度目の KotinFest に行ってきました。めっちゃ良かった。

セッションのメモを取ったので共有です。

セッション

11:00-11:10オープニング・セッション / 長澤太郎

テーマは Kotlin を愛でよう!

3トラック 15セッション 7LT 来場者380人+ 協賛企業18社 運営スタッフ35人。

セッション終了後、ホワイエのAsk The Speaker ブースで質問可能。

11:10-12:00 What's new in Kotlin Svetlana Isakova

スピーカー は Jetbrains の人で Kotlin in アクションの著者でもあるSvetlana Isakovaさん。

Principles of Pragmatic Evolutionというのがある。

  • keeping the language modern
  • comfortable updates
  • feedback loop

KEEP は Kotlin Evolution and Enhancement Process の略。

新しい機能は皆納されている。 freeCompilerArgs +=で追加して、実験的な機能を有効にできる。

最近のKotlinの機能の紹介。以下のような新機能が紹介されていた。

  • inline classes
  • Contract
  • Flow
  • Kotlin Multiplatform

深堀りしたければ午後からのセッションで拾うことができるという、基調講演らしい内容だった。

13:30-14:15 Kotlinの型実践入門 / 佐藤 隼(ホールC)

speakerdeck.com

型に関するあれやこれや。

たとえば以下のような話があった。

  • スマートキャスト
  • Any, Nothing
  • 共変、反変、不変について
  • sealed class について

かなり広範囲ながらコンパクトにまとまっていた。

TIPS

  • KotlinのスマートキャストはFlow-sensitive typing (flow typing) とよばれる
  • mutableだとあぶないのでスマートキャストできません 束縛する必要がある
  • contract { returns false / false のときは / implies this@isNullOrEmpty != null / null じゃないことを保証する / }
  • Anyはwait、notifyメソッドがないが、(s as Object).notify() とかすれば呼べる
  • NothingはすべてのKotlinクラスのサブクラス キャストがいらなくなるところがありうれしい

14:30-15:15 改めて学ぶContracts / 富田健二(ホールC)

speakerdeck.com

現時点での構文はEarly Prototype、しかし標準ライブラリでも多数利用されている Contracts についての丁寧な説明だった。ほどよい分量でわかりやすい。

TIPS

  • スコープ関数で使われている
  • 1.3.0では18メソッド、1.3.50では26メソッドで対応
  • 入力と出力を記述する句の集合 = 契約

Java にある、 @ Contract アノテーションというのがある @ Contract はorg.jetbrains:annotations @ Contract で、メソッドが満たす必要がある契約を定義するために使用される。注釈をつけるとIDEが契約を満たしているかチェックしてくれる

  • @ Contract("_, _ -> fail") は任意の引数が2つあり、例外を返す契約を定義
  • @ Contract("null -> fail; !null -> !null") は引数がnullの場合→例外を投げる 引数がnullでない→null以外を返す

@ Contract を Kotlinで使うようにするという案もあったとKEEPに書いてあるが、IDEの字句解析、構文解析、強調表示などいろいろやることがあるので 本質的にインジェクションであるため事態をさらに複雑にするので見送られた

関数がContractを持つ。ContractはEffectの集まり。という構造になっているEffectには

・CallsInPlace(callsInPlace) ・ConditionalEffect(implies) ・SimpleEffect(returns) ・ReturnsNotNull(returnsNotNull)

がある。

InvocationKindの種類としては、

・EXACTLY_ONCE  ・blockの処理を1回だけ実行するという契約 ・AT_LEAST_ONCE  ・処理を1回以上実行するという契約 ・AT_MOST_ONCE  ・処理を高々1回だけ実行するという契約(成功したときだけとか)  ・Resultとかで使われている ・UNKNOWN  ・デフォルト

がある。

Contractの制約として、

・関数の最初に書かないといけない ・トップレベルの関数にしか使えない ・関数ブロック内でのみ有効 ・getter/setterにもセットできない ・空のContractは定義できない ・if/whenやtryは式だけどcontractの中身に書くことはできない

がある。

15:30-16:15 Kotlin Multiplatform Project入門 荒谷光(ホールA)

人類の夢Kotlin MPPに関する発表。MPPの概要から、やり方について詳細に説明という盛り沢山な内容。

speakerdeck.com

TIPS

Kotlin MPP は「UI部分は提供せず、ロジックのみ提供する」ので、Viewも共通化しようとするReactive Native、Flutter、Xamarin(Forms)とは方針が異なる。

MPPとは ・Kotlin/JVM ・Kotlin/Native ・Kotlin/JS の総称

・Kotlin/Native はLLVM Toolchainを使用して各プラットフォームのバイナリを作成 ・VM環境が不要 ・Linuxx86_64, arm32, arm64, MIPS, MIPS LE, Raspberri PI)も対応

なのでもちろん Kotlin/Native ≠ iOS

サンプルリポジトリがすごい

github.com

フルKotlinで書かれた、今すぐ使える Kotlin Multiplatform なライブラリたち

github.com

16:45-17:30 もっと Kotlin × Spring 木原 快 / 17:45-18:30 公募によるLT大会

www.slideshare.net

聞いてたけどまとめる体力が切れました すみません たぶん後日書きます

企業ブース・懇親会など

運営のホスピタリティが高すぎる

ランチないけど全くこまらなかった

これは懇親会

その他

CAさんのブースで寿司打やったら運良く1位になって良さそうな品をもらった。ありがとうございます

Tシャツが住友さんとかぶった

以上です!

「SwiftUI を理解するために必要な Swift 5.1 の新機能 (some View編)」の書き起こし

先日、Bonfire iOS #6 というイベントで、「SwiftUI を理解するために必要な Swift 5.1 の新機能 (some View編)」という15分のトークをやりました。

Bonfire iOSは自分で立ち上げて毎回企画してきたイベントで、今回は後輩に運営の旗振りをお願いしたところ、自分も発表する流れになり、不安を感じつつもなんとか発表にこぎつけることができました。

ありがたい反応もいただいています。

資料は Speaker Deck にありますが、資料だけだと分かりづらい部分もあるかと思うので、今回は実験的に書き起こしを用意してみました。

当日来られなかった方や、発表の復習に使いたい方などに使っていただければ幸いです。

続きを読む

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

超遅刻投稿です。申し訳ありません。

potatotips #61Androidブログまとめ枠で参加させていただきましたのブログです。Wantedly さんでの開催。

遅れて参加になってしまったので最初の2本は聞いた内容ではなくスライドを読んで書いてます>< 最近は両OSとものまとめを書いていましたが今回は素直にAndroidトークのみまとめています。

[Android] Clip, Elevation, ViewOutlineProvider

speakerdeck.com

ImageViewを角丸にしたり丸にくり抜いたりとかすることがある。

BitmapTransformation(Picasso/Glide)は簡単に使えるが、transformation animationをつくるのが難しい。Canvasを使ってclipするのはCanvasの知識が必要でなかなかむずい。さらに、これらはelevationでの影がが適切に反映されない。

developer.android.com

ViewOutlineProviderというのを使う手があって、これを使うと elevation もうまく反映されている。ただしAPI 21+。簡単にclipやtransformができる。

[Android] CameraXとMLKitの関係や如何に

www.slideshare.net

CodelabsでCameraXとFirebase MLKitをさわった

Camera2では全部コールバックで順序関係あり、しかも画面のライフサイクルい依存しているのがつらかった Camera Xは設定さえすればLifecycle-awareである 便利!

Firebase MLKitではシンプルなインターフェイスで物体認識や文字認識ができる

Codelabsはそれぞれ30〜60分ぐらいでこなせる量 くっつけて、カメラをつかった物体認識や文字認識が簡単にできた 便利!コードはこちら↓

github.com

[Android] 外部SDKのViewにマスク処理をする方法と罠

speakerdeck.com

f:id:kumamotone:20190515194757p:plain

歌詞表示Viewの上下にグラデーションをかけたい ただし、歌詞表示Viewは外部SDKのもので手を入れることはできない

ViewGroup#dispatchDraw で子Viewの描画をフックすれば子Viewにエフェクトがかけれそう ただし super.dispatchDraw(canvas) のあとに単に canvas にマスク処理するのはすでに後ろのViewがcanvasに描画されているためNG

オフスクリーンバッファ(ViewGroupと同じ大きさのBitmapとCanvasを用意)すればよい

ViewGroup#dispatchDraw で オフスクリーンバッファをクリア→オフスクリーンバッファに子Viewを描画→オフスクリーンバッファを加工(LinearGradientとPorterDuffを使う)→オフスクリーンバッファの内容をcanvasに描画 というようにすればよい

罠として、対象のViewがalphaを持っている場合はそのalpha値が反映されてしまい、意図しないエフェクトになってしまうことがあるので注意

Githubにコードがあるので参考にしてください

github.com

[Android] アニメーション実装の新しい選択肢 MotionLayoutが中々便利で期待できそう

speakerdeck.com

MotionLayout便利 最初の状態と最後の状態を制約で指定することでアニメーションをひとつのXMLで実現することができる

とくにすごいのはSwipeとClickのTransitionが指定できることで、これをやるとスワイプやクリックをトリガーにしてアニメションすることもできる

alphaの状態でスライドを作成したが2019/05/09 にbeta1が出たとのこと

[Android] Google Play Consoleの時間指定公開のハマりポイント

speakerdeck.com

通常の公開は公開ボタンをクリックしてからGoogleでアップデート処理があり、その後ストアに反映される。一方、時間指定公開はGoogleでアップデート処理が。名前がわかりにくいが、時間指定公開というのは時限式という意味ではない

時間指定公開した場合、リリーストラックの変更のログが反映されないが、市場公開されているわけではない。公開ボタンを押すまでは市場公開されないので安心するとよい。

[Android] Recommend Widgetを作った話

おすすめ記事を出すView?を作った CTRを計測するためにViewTreeObserverを使用したらしい

[Android] Androidの開発とFlutterの開発を比較してみる

AndroidとFlutterを比較してみる

  • 言語
  • Viewのコード
    • 似てる
  • APIコール
    • 似てる
  • テストコード
    • 似てる
  • アプリサーズ
    • 現在のところFlutterはでかいことがある

[Android] Flutter 1.5 Features(Overview+Alpha)

Flutter 1.5 の新機能。 Dart 2.3、バグフィックス、Material & Cupertio widget sets、アプリ課金(in-app purchases)サポート、Flutter for Web。

Flutter for Webは現在Technical Previewという状態で、Githubにコードが上がっている。

github.com

Hello Flutter for Web の方法はGithubにあるがそのままやるとうまくいかない場合もあるのでQiitaとかにもやり方が書いてあったりする。

そのほかの資料

github.com

感想とか

f:id:kumamotone:20190525010702j:plain

AndroidGoogle I/O 後ということで新しいトピックが多くて面白かった。iOS も fromkkさんが Dark Modeを実現するライブラリ を作っていたりして、新しいトピックないのでとか言ってないで自分もなんかやらんとなぁと思いました。

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

超遅刻投稿です。申し訳ありません。

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

会場は ZOZOテクノロジーズ さんでした。

f:id:kumamotone:20190328000501j:plain

バッチバチにおしゃれな社屋 やっていきを感じる

以下発表内容です。参加枠としては Androidブログまとめ枠でしたが iOS の発表内容に関してもまとめています。

気になるところや間違いなどあればご指摘ください。埋まっていない資料は公開されたのを見つけ次第反映します。

togetter.com

意外に面倒じゃなかったXcode Template

Xcode の テンプレートは自分でも作れるぞ 作り方を紹介 xib とか storyboard もできるらしい

(自分用メモ)ここらへんとかも参考になりそう↓

www.lanches.co.jp

アプリのパフォーマンス改善を数値化

speakerdeck.com

Firebase Performance Monitoring で パフォーマンス計測、Firebase Remote Config で ABテストができる 組み合わせると簡単に計測できて素敵

Bitrise の人のデモ / Viktor さん (Bitrise iOS Engineer)

Bitrise すごいよ モバイル特化しとるんや 簡単 code signing 設定 とても簡単

  1. なんか新機能の予定はある? A. 物理デバイスでのテストができるようになるかも

Bitrise の人のデモ / Tamas さん (Bitrise Android Engineer)

Bitrise すごいよ 簡単 設定 とても簡単

Bitrise 上で UIテストできて動画ブラウザで見れる バリアントの設定もできる

iOSで正しく歩数を取得する

speakerdeck.com

HealthKit の HKSampleQuery でiOSバイスの歩数などが取得できる。しかし、HKSampleQuery を使うと、 iPhoneApple Watch の歩数が重複してカウントされてしまう。

HKStaticticsQuery の options: .cumulativeSum を使えば、 重複を考慮していい感じに集計された値が取れる。Bundle ID(com.apple.healthからはじまるもの)で絞ることで不正対策ができる。

サンプルコード

github.com

Qiita

qiita.com

Firestoreを使って純広告配信機能を作った話

speakerdeck.com

ユーザーの所在地、性別、年齢の推定情報などをUserPropertyに設定して、RemoteConfig と連携させると、ターゲティングが簡単にできる。便利。

Azure PipelinesでiOSアプリをCI/CDしてみよう🚀

speakerdeck.com

Azure Pipelines は CI/CD サービスで Azure DevOps の1機能。無料枠で1800分/月、オープンソースプロジェクトなら並列ジョブ10で無制限に動かせる。

f:id:kumamotone:20190416112419p:plain

Visual Designer を使うことでpod installしてビルドしてApp Centerで配布、みたいなパイプラインをGUIで書くことができる。

App Centerと併用することでテストアプリを配布できる。

protobuf in kotlin

speakerdeck.com

square/wire に 2019/03/14 の Version3.0.0 alpha01 で Kotlin Generator が追加されて、Kotlinのデータクラスを吐いてくれるようになったっぽい。

--java_interop をつけるとBuilderパターンのメソッドチェーンでプロパティを設定できるようになる?

proto2 から proto3 になったときに requiredとoptionalが廃止されたっぽく、その影響で proto3 から生成したモデルには NonNull と Nullable の区別がなくてすべて Nullable になるっぽい(マジか)。

f:id:kumamotone:20190416112343p:plain

github.com

WebView as 
Fancy and effective 
View

speakerdeck.com

Webの表現力の高さを利用して以下を実装してみた

  • 紙吹雪
    • minifyしたjsファイルを読み込んでWebGLで描画
  • グラフ
    • React/Recharts というD3のラッパーライブラリを使って表示

iOS/Android でだいたい同じ体験を一度に実装できるので便利だが、Webの技術、アプリエンジニアが扱うと大変っちゃ大変なので上手に使っていきましょう

f:id:kumamotone:20190327210314p:plain

Transparent な WebView の作り方はこれだけ

iOSアプリで気になった動きや表現を上手にアレンジして活用してみる

www.slideshare.net

Twitter の TabBar 画像のバウンドアニメーション、Pinterest のコンテンツ画像の段差表示の表現、Yummyのコンテンツ画像の示唆効果の表現など、巷のアプリで気になったUI表現を取り入れたサンプルを作ってみたので、その紹介と実装などについて。

medium.com

僕は上スワイプでBottomSheetを出したかっただけなんだ

docs.google.com

BottomSheetDialog を、"シート部分ではないところを上にスワイプして全画面になるように引っ張り出す"やつをやりたい。(説明が難しいのでGoogle Docs のアニメーション参照)どうするか?を解説 

github.com

つかおう!L2CAP

speakerdeck.com

通常のBLE実装と比べたときのL2CAPの利点

  • 一回あたりの送信できるデータサイズが大きい
  • BLEの手続きをラップしてくれていて、NSStreamを扱うだけで良い?

マルチモジュール化のTips

speakerdeck.com

マルチモジュール化すると並列ビルドできてビルド速度が改善する。packageで分けるより強い制約をつけることができる。Dynamic feature modulesを利用することができる。

Dagger使ってて新しくモジュールを追加したがビルドに失敗して半日ほど潰したが、kotlin-kapt忘れただけだった kapt 忘れは dependencies をスクリプト化して防ごう

感想とか

f:id:kumamotone:20190328000533j:plain

少なくとも次の回の開催までには投稿するという自分ルールがあったのだが今回ついに破ってしまった。Bitriseのおふたりと休憩時間や懇親会で結構お話できた。

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

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

f:id:kumamotone:20190301002053j:plain
会場

会場は GREE さんでした。

f:id:kumamotone:20190301001957j:plain
採用強化中+KMNZのチャンネル登録よろしくとのこと

以下発表内容です。参加枠としては Androidブログまとめ枠でしたが iOS の発表内容に関してもまとめています。

気になるところや間違いなどあればご指摘ください。埋まっていない資料は公開されたのを見つけ次第反映します。

Page Object Pattern with XCUITest

speakerdeck.com

Page Object Pattern は DRY かつ Readable な UIテスト を実現できる

Firebase A/B Testingを使ってサーバ側までA/Bテストした話

Firebase A/B Testing エンジニアじゃなくても条件変えれるので便利

ModelをLayerで分けてUnit Testの観点を明確にする

speakerdeck.com

Layered Architecture にしてテスタブルにしてる 各層のテストの書き方を紹介

簡単にARアプリを作ってみよう

ARCore / SceneForm のおかげで3Dモデルの知識なくても簡単にARできる!ありがてぇ

SwiftでVRMファイルを表示してみた話

speakerdeck.com

github.com

VTuberKit 作った VRM読み込んでSceneKitで表示できるぜ! 実装を紹介 今はUnityのアニメーションをimportするのをやってる

ViewPager2をちょっとさわってみよう

speakerdeck.com

ViewPager2のIFはほとんど同じ RecyclerViewを使って実装されてる RTLサポート、縦方向ページングサポート、1のバグが治っているなど まだalpha

RxSwiftに対応したバリデーションをGenericなProtocolで実装してみた

extension ObservableType {
  func validate<V: Validator>(_ validator: V.Type)
    -> Observable<ValidationResult<V.ErrorType>> where V.ValueType == Self.E {
      return map { validator.validate($0) }
  }
}

RxSwiftのチェーン中に protocol Validator を実装したやつを実装したクラスを与えてバリデーションできるように、 ObservableType に extension 生やして解決した シンプル

github.com

AndroidX Navigationを導入した話

speakerdeck.com

そろそろstableのNavigation safeArgsでの方安全なFragmentArgsの生成、Deep Link、Transition Animation、Shared Element

Navigation 使うと常にバックキーで戻れるようになってしまうが Activity#addOnBackPressedCallback() を使ってハンドリングできる

逆引きRxSwift: 編集画面のViewModel設計と実装

note.mu

編集画面のViewModel設計。 startWith使うと双方向バインディングしながら初期値設定できる

AndroidアプリのUI/UX改善例その2

speakerdeck.com

項目が多いので https://github.com/mirrajabi/search-dialog というのを使ってフィルタリングできるようにした

教えて!Xcode

speakerdeck.com

Address Sanitizer は配列外アクセス等を検出できる Diagnostics から有効にできる(ObjCのみ) 詳しくは以下を見ると良い

qiita.com

Androidの状態管理をするライブラリOwlの紹介

speakerdeck.com

Reduxライクな状態管理ライブラリを作っている Coroutineを使った非同期処理の導入、Jobの管理、ViewModelとの統合

画面遷移が絡む値の受け渡しをRxSwiftで直列化してみた

speakerdeck.com

github.com

subscribe複数回書かないと行けなさそうな処理を呼び出すVCにObserverを置く→呼び出し処理をprotocolのextensionにして直列化した

あらためてLiveData

LiveData, MutableLiveData, MediatorLiveData の説明 わかりやすい

OWASP MASVS

OWASP MASVS は モバイルアプリケーションの基準となるセキュリティ要件

Immutable data holder

speakerdeck.com

Immutable な LiveData のみを公開しよう LiveDataならswitchMapで変換できる 拡張関数でより簡潔にできる

感想とか

f:id:kumamotone:20190301001938j:plain
すし

RxSwiftの話が何故か多かった気がする

NavigationやViewPager2とか新しいライブラリのTipsが知れてよかった

RxSwiftのバリデーション用のextensionは簡潔に書けてすき

VRMKitはシンプルにすごい

今回も最初からへとへとでついにちょっとしたコメントを書くのがやっとになってしまった

懇親会では個人的にも最近導入したLiveDataの話できたりとか、インターネッツではお見かけするREALITYの人ともお話できてなんだかんだよかった

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

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

会場は FiNC Technologies さんでした。

f:id:kumamotone:20190128233606j:plain

個人的には今月のApp Client Melting PotというFiNCさん主催のイベント以来だったのですが、なんか重大発表でも始まるんかってぐらいおしゃれ会場でした。

以下発表内容です。参加枠としては iOSブログまとめ枠でしたが Android の発表内容に関してもまとめています。

気になるところや間違いなどあればご指摘ください。埋まっていない資料は公開されたのを見つけ次第反映します。

RxSwift - テストスケジューラの解像度について / y.imajo さん

speakerdeck.com

RxSwift で .debounce() をテストする話。

debounce(0.3)なら 3.3 秒のタイミングとかでちゃんと発火されるかとかを調べたい。ただ仮想時間は整数なので現実時間指定の0.3と合わない… →仮想時間に変換すればOK

qiita.com

今からはじめるrobolectric / moriiimo さん

speakerdeck.com

RobolectricでUIテストを書いてみる。 @Config(sdk = [LOLLIPOP])sdkのバージョンを指定できる。.start() や .resume() とかでライフサイクルを呼べる。performClick クリックイベントを模することができる

Roomのテストを書いてみたい。書いてみた。context には InstrumentionRegistry.getInstrumentation().targetContext をつかう

アプリ内の絵文字をカスタム絵文字化した話 / RyoIzumi さん

iPhoneでもTwemojiを表示したい。Apple絵文字をちゃんとTwemoji化するのは意外と大変で、家族の絵文字をconvertすると家族分裂したりする。

詳しくはUnicode Emojiのことを勉強してくれという感じなのだが、emojicaというライブラリがあるのでこれが使える。

github.com

UILabel や UITextView 上のiOS絵文字をカスタム絵文字に変換できる。

日本語入力で UITextViewのmarkedTetRange が考慮されていないとか emoji 11.0 に対応してないとかあったが、パッチを送ってなんとかした。(emoji 11.0に関しては今送ってるところ)

Flankでテストを爆速にする / Kubode さん

speakerdeck.com

Flank はFirebase Test Lab を並列化するテストランナーで、Android/iOSに対応。導入が結構簡単。

github.com

なぜ導入したのか?CIテストに28分とか掛かる… そのうちgcloud(Firebase Test Lab)に18分掛かっていた。

導入した経緯としては、CI/CD Test Night #2 でBitriseの中の人が紹介していたので。

Flankの機能。YAMLによる設定の管理ができる。gcloud公式のYAMLと互換性のある記述が可能。FirebaseTestLabでやってれば移行が簡単。

シャーディング。これがメインなのだが、指定した数に自動でテストを振り分けることができる。各シャードで必ず実行するものを指定したりもできる。 testShards=-1にすると最速だがテスト数*1分の課金が発生し、270個のテストだと4.5ドルも掛かってしまう。いいあたりで調整する必要がある(8とか16とか)。

コストレポートが出せる。テスト結果はHTMLやJUnitXMLで出せる。

fastlane+Bitriseでやったが、./results/*/をコピーすればテスト結果をbitriseですぐ見れる。

もともとFirebaseを導入していたのでほとんどやることなかった。flank.jarは24MBもあるのでgit管理しない。

Flankでshard=16にしたら28分が8分になった。やったね

CI上で結果が見えやすくなりテスト項目の見直しに繋がった 速くなっただけでなく、未使用コードの削除や無駄なwaitに気づけるなど副次的な効果もあった

導入コストも金銭的コストもやさしいので、iOSにも導入したい

SceneKitでふんわりした影を描画したい / noppe さん

speakerdeck.com

iOS12 から usdz をサポートするようになった。

File アプリで プレビューやAR配置ができる。

Fileアプリで見ると影がきれいについている。これはWWDCで語られていた Contact Shadow(設置感・重なり感を出すもの)だと思われる。これをやってみたい!

SCNLight の castsShadowをONにして、directionalかspotタイプを使う。するとかなりはっきりした影ができてしまう。shadowRadiusというプロパティを使えばふんわりになるがなんか雑な感じ…

さらに調べていると、Contact Shadowとは耳慣れた言葉で言えばAmbient Occlusionのことであるという記述が見つかった(耳慣れたってなんだよ)

SSAO…ScreenSpaceAmbientOcclusionはカメラに生えとって実装できるが、ふんわりしない…ふんわりした影は自前でやらないと無理そう

SCNTechniqueという、マルチパスレンダリングのためnクラスがある。これは画面1回の更新の間に、異なるシーンを複数回レンダリングして合成した結果を表示する機能で、MetalやOpenGLESでシェーダを書くことができる。カメラを2つ配置して、下からの入力を深度に変換しブラーをかけるみたいなのを作ってみたが、モアレ(縞模様)ができたりしてうまくいかなかった。シェーダ真面目に書こうとするとサクッとできなさそう

最終的には、gobo(SCNLightの影を自前の画像で描画する機能?を使って、SCNTechniqueで深度画像に変換→SCNViewのsnapshotでUiimageで取得→ブラーかけて→goboに渡した

これではまだFileの表現に達してはいないが、今までのに比べればまぁまぁ見れるものができた

MDCのBottomAppBarのShadowの実現方法 / HiroYUKI Seto さん

speakerdeck.com

OSがShadowを描画する条件。

  • Android 5.0↑
  • elevation が 0 より大きい
  • Viewのアウトラインが四角形か、凸図形(凹んでいる部分がない=CONVEX_PATH)

BottomAppBarは明らかに凹んどるけど影がついてる。これどうしてるの

MaterialShapeDrawableを使ってるっぽい。でTopEdgeがMaterialShapeBottomAppBarTopEdgeTreatment。これはarcでくぼみを表現していて、TreatmentのgetEdgePathを見れば分かる。

setShadowCompatibilityModeをSHADOW_COMPAT_MODE_ALWAYS にすればOSがつける影以外が使える。ShadowRendererというのを使ってて、便利じゃんと思ったが、残念ながら @hide (IDE上で見えなくする?)や @Restricto(LIBRARY_GROUP) (ライブラリ内から呼ばないとwarining出る的なやつ?)アノテーションがついており、リフレクションとかしないと使えない。

スクリーンタイムと仲良くなる / 5mingame2 さん

speakerdeck.com

iOS11から純正のカメラアプリでQRコード対応している

ところで、スクリーンタイムというiOS12からアプリの使用状況を集計したり、時間制限をかける機能がある。時間制限が掛かっているとアプリ起動直後に落ちることがわかった。

どうやら制限掛かっていると、AudioSessionのコンテキストが取得できてない様子 didFinishLaunchingWithOptions: で初期化処理をしてたのだが、ここで落ちてる感じだった

UnityでiOSアプリをビルドするとXcodeのプロジェクトとソースが生成される。これを参考にした。するとここら辺 applicationDidBecomeActive: に書いてたのでそこに移動した。

いまさらWorkManager / どくぴーさん

speakerdeck.com

適宜実行されたり実行されたことの保証が必要なバックグラウンドタスクを扱う。compileSdkVersion 28。

シンプルでこれまで自前で実装しないと行けなかった要件、たとえばAPIレベル、Play Servicesの有無によるJobScheduler/AlermManager/FirebaseJobDispatcherの使い分け、バッテリ・通信状態などに合わせた処理などとかを自動でなんとかしてくれる

Workerについて。Worker を継承したクラスを作る。override fun doWork() 内で必要な処理を記述し、成功・完了に応じてWorker.Result.success/failureを返す(これ以前は定数だったので codelabs のコードを直接使うと死ぬ)

WorkRequestについて。Workerへ実行に必要なデータを与える(DataクラスをbuilderクラスでbuildしたものをsetInputDateでsetする)。注意点としては、でかいデータは与えられない。一度だけ実行できるものと定期的に実行させるものがある。

生成したWorkRequestの実行はWorkManager#enqueueするだけ。

複数のworkを連結したいときがある。WorkManager#beginWithでContinuationが返ってくるのでthenで連結とかすると、重複することがある。なのでWorkManager#beginUniqueWorkに変更する。でExistingWorkPolicyで実行中の処理に対する処理を変更する。

Workの実行状態を制限したいときは、実行時に制約(通信状態や、充電中かどうか‥など)が付けられる。uniqueIdを与えたContiuationはキャンセルできる。LiveDataとの連携、Rxサポートもある。

UIViewPropertyAnimator and Easing / TachibanaKaoruさん

speakerdeck.com

UIVIewPropertyAnimatorはiOS10〜なのでそろそろ入れてもいいんじゃないという感じ。

UIView.animate は都度アニメーションのようすを設定するが、 UIViewPropertyAnimatorは動きを宣言して、好きなタイミングで実行するようになった。イージングが簡単にできる。

制御点を設定できるのだが、結構難しい。カスタマイズするときはデフォルトで定義されているやつをちょっといじるのが良さそう。

既存のライブラリのパラメータを拝借してイージング用のUIViewPropertyAnimatorをいっぱい生やしたextensionを書いたので難しさ感じる人は使ってみてください。

github.com

既存プロダクトにダークモードを実装した話 / Hakuto Suzuki さん

ダークモード、目に優しいだけでなくコンテンツを目立たせることができる。(画像がいい感じに見える)

夜間の利用ユーザーが多いので導入した。CVR にも良い影響があった。

実装は AppcompatDelegate.setDefaultNightMode(AppcompatDelegate.MODE_NIGHT_YES) を設定。

WebViewへの画面遷移を挟むとなぜかDarkmodeじゃなくなるというバグがあった(GoogleのIssue Trackerに登録されている)遷移する前にWebViewの初期化を再度行うと回避できるっぽい

WebView怖い

Hint of “Passcode Lock” Screen and Logic (with LocalAuthentication). / fumiyasac さん

www.slideshare.net

パスコードロック画面作った。設計を紹介。

バックグラウンドに入るタイミングで上に画面かぶせる感じ。AppDelegate のライフサイクルでなんかやってる場合は処理がかち合うので注意という感じだった

詳細はQiitaで:

qiita.com

5プラットフォームをサポートしているプッシュ通知SDKをFCMに移行した話 / konyavic さん

speakerdeck.com

SDK開発者として実装に必要なステップを減らし、ドキュメントをシンプルに保つことを意識している。

アプリのグロスのためのSDKを作っていて、プッシュ通知、ABテスト、アナリティクスなどが利用できる。5プラットフォームに対応している。このSDKを2019年4月までにGCMからFCMに移行しないといけないことになった。

トークンの取得部分を変更することになったが、FCM、Tokenの取得メソッド多すぎ問題。FirebaseInstanceIdのgetToken()というのがあるがdeprecated。getInstanceId()は推奨されているけど新しすぎて、SDK利用側が利用できないかもしれない。結局はgetTokenなどでも使えるAPIは維持しつつ、getInstanceId()でtokenを取得するようにした。

つかおう!Storyboard / coffeegyunyu さん

speakerdeck.com

コードでUI書いてるとつらいときある。StoryBoardを使うと、iPadのときの文字サイズ、横向きにしたときの指定などが簡単に指定できる。

これにより、iPhone/iPadや横向き対応はもちろん、Container View、UISplitViewController、Pop Over、Form sheet、Slide Over、Split View、iPad ProのPortrait+SplitView+UISplitViewController、tvOS…などなど色々な UI の表示形式に対応することができる。

github.com

Visionとモザイクで遊んでみた / ochimさん

WWDCの資料とクラスメソッドのブログ見て実装した。VNDetectFaceRectanglesRequestで顔取れる。boundingBoxに位置が入っている。この座標系は左下起点のやつでUIKitと違うので注意。

CIFilterを使うとモザイクかけれる。boundingBox使うと顔だけモザイクかけれる。

感想とか

最近へとへとになりながら会場向かってへとへとになりながらメモりがちで懇親会の頃にはへとへと度高めだけど最終的には懇親会でいい感じに刺激受けれるしやっぱり今回も色々知らないこと知れたりして良かったな〜ってなるので良い