potatotips #64 に参加しました #potatotips
potatotips #64 のオーディエンス枠で参加させていただきましたのブログです。
Reproさんのオフィス駅近で最高!
めずらしいゼロカフェインコーラある!ありがてぇ #potatotips pic.twitter.com/cuPJRc0Y1x
— Monkuma 👾 (@kumamo_tone) August 27, 2019
ゼロカフェインコーラ最高!
ブログ枠じゃないので気軽に行くぞ!
Object指向でFatViewControllerをなくす
カスタムのViewControllerを書かずにUIViewControllerをそんまま使ってアプリ作ってみた話っぽい Object で NSObject をバインドする #potatotips
— Monkuma 👾 (@kumamo_tone) August 27, 2019
テキスト入力制御へのアプローチ for Android
TextInputLayout を使えば
— Monkuma 👾 (@kumamo_tone) August 27, 2019
app:counterEnabled="true" app:counterMaxLength="100"
みたいな感じで文字数カウントはできる #potatotips
EditTextのmaxLength設定するだけですめばいいんだけど、現実的には101文字以上入力したりしたときにSnackbarだしてねみたいな仕様がぶっこまれたりしてて、結局リスナーをごにょごにょ実装する羽目になるというケース結構ありそう(遠い目) #potatotips
— Monkuma 👾 (@kumamo_tone) August 27, 2019
どこがはみ出てるか教えてあげるやつは
最大文字数を超えた文字にBackgroundColorSpanを設定して
リスナーに追加すればOK
コントロールセンターとたたかう
作ったゲームVTuberに実況してもらいてぇ〜〜〜 #potatotips
— Monkuma 👾 (@kumamo_tone) August 27, 2019
preferredScreenEdgesDeferringSystemGestures を override すると通知センターが出るのを一回だけ防ぐことができる
— Monkuma 👾 (@kumamo_tone) August 27, 2019
override func preferredScreenEdgesDeferringSystemGestures() -> UIRectEdge {
return .bottom
}
#potatotips
setNeedsUpdateOfHomeIndicatorAutoHidden() でホームインジケーターをオートヒドゥンできる #potatotips
— Monkuma 👾 (@kumamo_tone) August 27, 2019
Event Recap from DroidconKE 2019
ケニアでDroidconがあったので行った話
アフリカの人陽気で良い
アフリカはAndroid端末が97% #potatotips
— Monkuma 👾 (@kumamo_tone) August 27, 2019
Conditional Content in SwiftUI
ViewBuilderの中ではif文が書けるのでvar Bodyに直接@ ViewBuilder アノテーションつけちゃえば型消去しなくてもbuildEitherにしてくれてわざわざGroupやStackやAnyViewでラップしなくてもif文が使えるぜというアイデア #potatotips
— Monkuma 👾 (@kumamo_tone) August 27, 2019
TruthとAssertJを比較してみた
アサーションライブラリgoogle/truthは2019年7月8日にバージョン1.0になった Google社内ではこのTruthを使って開発が行われている #potatotips
— Monkuma 👾 (@kumamo_tone) August 27, 2019
google/truth: Fluent assertions for Java and Androidhttps://t.co/gBLnqs2DwL truthでGoogle検索するとちゃんと2つ目に出るんやな #potatotips
— Monkuma 👾 (@kumamo_tone) August 27, 2019
AssertJができることを網羅しているわけではないが、必要最低限はすでに網羅している印象なので、将来性を考えたら導入してみてもいいのではとのこと #potatotips
— Monkuma 👾 (@kumamo_tone) August 27, 2019
iPhoneでFeliCaを読み取ってみた
Felicaの読み込みの手続きのフロー、NFCTagReaderSessionのbegin()でタグのポーリングがはじまる NFCFeliCaTagのconnect()で接続、requestService()でサービスの存在確認、readWithoutEncryption()で読み込み #potatotips
— Monkuma 👾 (@kumamo_tone) August 27, 2019
AACで犯しがちな間違い
viewModel.liveData.observe(this, Observer { updateViews(it) }) みたいな感じでFragmentを渡すと、detachでonDestroy()が呼ばれず、Observerが破棄されない。Activityならthisで良いが、Fragmentの場合はviewLifecycleOwnerを渡す #potatotips
— Monkuma 👾 (@kumamo_tone) August 27, 2019
こういうのって警告出せたりせんんのんかな #potatotips
— Monkuma 👾 (@kumamo_tone) August 27, 2019
MutableなLiveData はカプセル化しましょう
— Monkuma 👾 (@kumamo_tone) August 27, 2019
private val _offers = MutableLiveData<Offers>()
val offers: LiveData<Offers> = _offers#potatotips
DIKitで人間がクラス間の依存関係解決するのを終わらせる
DIKitを使うとDIができます
iOS13ではStoryboardでもDIができる件について - Qiitahttps://t.co/mPrYjmkWeg instantiateInitialViewController(creator:) たのしみですね #potatotips
— Monkuma 👾 (@kumamo_tone) August 27, 2019
SwagGenのススメ
SwagGen を使うと OpenAPI/Swagger 3.0 対応の形式のパースと生成ができる
SwagGenの良いとこ
— Monkuma 👾 (@kumamo_tone) August 27, 2019
・Swift5に対応している
・Stencil記法
・Sourceryとかで使われているやつなのでMustacheより慣れているという人もいるのでは
・ifとかforとかも使える
・日付のフォーマット
・DateDayという型を使うと楽
・エラーハンドリング
・throws -> T? な関数がある#potatotips
Chucker で GraphQL の通信ログを見やすくした
ChuckerTeam/chuckerhttps://t.co/Ayaat6mWI7
— Monkuma 👾 (@kumamo_tone) August 27, 2019
ChucklerはOkHttpの通信ログを取って一覧で表示してくれるツールで、jgilfet/chuckがすでにあるが、2年以上更新されていないのでforkされ、別リポジトリで更新されはじめた#potatotips
見やすいわね
Chuckerのいいところ
— Monkuma 👾 (@kumamo_tone) August 27, 2019
・OkHttp 4に対応済み
・レスポンスの中に画像がある場合もちゃんと表示してくれる(バイナリ対応)
・テキストサーチしたとき引っかかった文字列がハイライトされるようになった#potatotips
GraphQL のサポートがほしかったので、 issue を出してプルリクを送った。
macOS アプリを2年ぶりにメンテしたら原型がなくなった話
App SandboxのNetworkのOutgoing Connection (Client)にチェックを入れると外側に向けてのポート開放ができる 無駄にIngoingとかもチェック入れたりすると怒られるので気をつけまょう #potatotips
— Monkuma 👾 (@kumamo_tone) August 27, 2019
macOS だと Firebase Analytics が使えないらしいので Fabric Crashlysticsを採用した(1年後サービス終了)(今後ってどうなるんだろ) #potatotips
— Monkuma 👾 (@kumamo_tone) August 27, 2019
sindresorhus/LaunchAtLogin: Add "Launch at Login" functionality to your macOS app in secondshttps://t.co/QYEIW6VYzV 自動起動オプションをつけれるライブラリがある #potatotips
— Monkuma 👾 (@kumamo_tone) August 27, 2019
Flutter Pluginを作る
Flutterのプラットフォーム依存のプラグインを作った
— Monkuma 👾 (@kumamo_tone) August 27, 2019
・基本的にはDartのパッケージシステムに則っている
・package(pure dart code)とplugin(platform-dependent code)の2種類ある
・TIP: プラグインの名前はクラス名になるので最後にプラグインをつけなくても良い#potatotips
・プラグインを生成したらExampleが入ってて感動した
— Monkuma 👾 (@kumamo_tone) August 27, 2019
・ネイティブライブラリに依存したいという時があると思うが、基本的にはCocoaPodsとCarthageで解決できる
・Platform Channelという仕組みを使ってやっているが、意外と困らない#potatotips
・プロジェクトのセッティングをやりたいとき、たとえばpushのcapabilityを設定したい場合とか そういう場合は.workspaceのcapabilityの設定をいじれば良い#potatotips
— Monkuma 👾 (@kumamo_tone) August 27, 2019
・Flutterのパッケージのpublishはhttps://t.co/WazvKEBph3というところにやる
— Monkuma 👾 (@kumamo_tone) August 27, 2019
・flutter pub pub publish という謎コマンドでやる
・TIP: 確定した状態でやらないと、WebUI上は削除する口が用意されていない dart-lang/pub-devリポジトリにissueを立てる羽目になる#potatotips
あとCordovaとの比較をしていた Flutterのプラグインシステムは開発体験が良い
感想とか
意外と最後まで集中力が持ってよかった ブログ枠のときもこのくらいの気軽さでやってもいいかもしれない
以上です!