メモメモメモ

ほんとうにめも

`import * as React`を撲滅した

使ったコマンド

find src -type f -print0 | xargs -0 sed -i '' -e "s/\* as React/React/"

結果

218ファイルが一斉置換された。作業開始から2分くらいでPR出せた。

理由

useEffectとかuseStateとかuseDispatchとかhooks系の関数を使いたいときに、import文が import * as React の形になっているとVSCodeでAuto Importが効かなかったので怒りの一斉置換をした。

Bitrise上でgoogle-play-deployに"JSONKeyPath: required variable is not present"と言われた

エラー内容

Couldn't create config: failed to parse config:
- JSONKeyPath: required variable is not present

f:id:yooska14:20190924054047p:plain

原因

GENERIC FILE STORAGEセクションを埋めてなかった。

GooglePlayStoreにAPI経由でアプリを公開(publish)するには Getting Started  |  Google Play Developer API  |  Google Developers にあるようにサービスアカウントを作成してアプリ公開のアクセス権限を与えないといけない。 ↓にある流れに沿って作業すればOK。 github.com

そしてダウンロードできたJsonファイルをGENERIC FILE STORAGEにアップロードするのだ。

ここにはhogeとそのファイルにアクセスするための環境変数名を入力する。 今回はBITRISEIO_SERVICE_ACCOUNT_JSON_KEY_URLとした。

そしてそれを Deploy to Google Play ワークフローで使用する。 f:id:yooska14:20190924054845p:plain

参考

discuss.bitrise.io

【ReactNative】Expo製アプリが本番でのみクラッシュする問題を調査・解決した。【adb logcat】コマンドの使い方メモ

状況

  • Androidで特定画面を開くとクラッシュすると報告があった
  • 本番環境でのみ発生し、エミュレーターでは発生しなかった
  • Sentryにissueは報告されていなかった ※これはまだ謎

原因追求方法

adb logcat を使った。

adb logcatとは

adbコマンドは、 Android Debug Bridgeの略でデバイスと通信するためのコマンドです。今回のように実際に目の前の端末内で何がおきてるのかを知りたい場合のデバッグに重宝します。

adb logcatコマンドは、その名の通りlogをcat(catenate)するコマンドで、接続した端末ののバイスログを表示できます。

adb logcatの使い方

  1. Android端末をUSBでつなぐ
  2. adb devicesでちゃんと端末が認識されているか確認する
  3. adb logcat -cで一旦ログをクリアする(しなくても良いが、該当ログを発見しやすくするためにやっておく)
  4. adb logcatでログを表示する

といった流れ。

adbコマンドを実行しても「waiting for device」と表示されて何も進まない場合は、 - adb kill-server - adb start-server して再起動するとうまくいきました。

参考: [Android] USBデバッグモードで端末が認識しないとき/adb installが「waiting for device」から進まないときの対処法

備考・コツ

adb logcatの結果を見るだけだと調査しにくいので、adb logcat > log.txtのようにしてからファイルを調べるとおくと落ち着いて調査できます。

Android端末が認識されない場合

らへんの問題に関しては別で記事を書きます。

Apple証明書たちの関係と新しいアプリを作るときどうすれば良いか

証明書たちとは

  • Apple Distribution Certificate(.p12)
  • Apple Push Notifications service key(APNs)(.p8)
  • Apple Provisioning Profile(.mobileprovision)

の3つを指してます。

証明書たちの関係性

Apple Distribution Certificate(.p12) に複数の Apple Provisioning Profile(.mobileprovision) が紐づいてる関係。 紐づいてなければ、アップロードした際に provisioning profile is not associated with uploaded distribution certificateと怒られる。↓こんな感じで。 f:id:yooska14:20190918212057p:plain

さらに、紐づいてるApple Distribution Certificate(.p12)は1つのBundle Identifierと紐づいてるので、間違えないようにする。 ↓は、 過去にjp.oned1d.onedで2つのBundle Identifierを作ってしまってて、違うDistribution Certificateを選択してしまったミス。 (Distribution Certificateを消せば良いはずだが、怖くて消せなかった) f:id:yooska14:20190921212549p:plain

新しいアプリを作る際(既存のProvisioningProfileを更新する際も同じ)

Apple Push Notifications service key(APNs)(.p8) に関しては、完全に使い回しで良いはず。

Apple Distribution Certificate(.p12) は新しいアプリのBundle Identifierに合わせて作ろう。

Apple Provisioning Profile(.mobileprovision) は作成したApple Distribution Certificate(.p12)に紐づけて作ろう。

ReactNativeからExpoに移行する際にAppleの証明書関連を全て新しくした時のメモ

Expoに渡す必要があるファイル

  • Apple Distribution Certificate(.p12)
  • Apple Push Notifications service key(APNs)(.p8)
  • Apple Provisioning Profile(.mobileprovision)

全て新しくした。developer.apple.comで全て作成・ダウンロードできるので、何も取っておく必要なかった。

※↓のようにファイルパスを聞かれる。

f:id:yooska14:20190918211125p:plain
Expoに聞かれるファイルパス

詰まったところ

以前ReactNativeからExpoに移行した際は、Provisioning Profileがdeveloper.apple.comにあったのでそれをダウンロードしてきてExpoに渡していた。 しかし今回はなぜか見つからなかった。 そこで、ReactNative版のソースをCloneしてきてその中のxcodeprojファイルをXcodeを開いて、以下のようにProvisioning Profileをダウンロードしてきた。 f:id:yooska14:20190918212500p:plain

General => Signinig => Provisioning Profileから

すると、provisioning profile is not associated with uploaded distribution certificateと怒られた。 f:id:yooska14:20190918212057p:plain

解決方法・証明書関連の用意・アップロードの流れ

  1. https://developer.apple.com/ に行く
  2. Profileタブで新しくProvisioning Profileを作る(このとき、Distribution Certificateを選択するので選択したものを覚えておく)
  3. 2で作成したProvisioning Profileと選択したDistribution Certificateをダウンロードする => Distribution Certificateは.cer拡張子でダウンロードできる。これをmacでダブルクリックするとキーチェーンアクセス(Key Chain Access)が開かれて証明書を追加できる。 => 追加した証明書を右クリックすると 〇〇書き出す という選択肢が出てくるので、書き出す。 => 書き出したファイルは.p12ファイルになるのでそれを使う。

findコマンドを駆使してた僕がripgrepを使って幸せになれた話

今まで

こんなコマンドを自作していた

function fn() {
  ignore=$3
  find $1 -type f | xargs grep -n${ignore} --color=always $2
}

これを~/.zsh_aliasとかに置いて、 fn src hoge みたいな感じで使うとsrcディレクトリ以下のhogeというワードを探す処理をしてくれる。 アウトプットは↓のような感じ。 f:id:yooska14:20190912190139p:plain

どのファイルの何行目でどんな感じで使われているのかが分かるので「便利コマンド作った俺、神!」って思ってた。

しかし出会ってしまった

ripgrepというツールに出会ってしまった。 github.com

インストールから使い方までREADMEを見ればとりあえず問題なし。 オプションについてはこっちのGUIDEを見ると良い。 https://github.com/BurntSushi/ripgrep/blob/master/GUIDE.md

基本的には rg hogeのようにして使う。 ディレクトリを指定してなくてもgitignoreされてるディレクトリ以下は無視してくれるので無駄が少ない。 ↓アウトプットはこんな感じ。 f:id:yooska14:20190912190332p:plain

また、--no-ignoreを付けるとgitignoreされてるディレクトリ・ファイルも含めて検索してくれるらしい。 f:id:yooska14:20190912190518p:plain

Rust製なのね。fdも似たような検索機能をファイル検索で提供してくれるみたいなので気になっている。