Cloud Shellから Cloud SQL (postgres)に繋いでみる

GCPのCloud Shellから

インスタンスに接続

gcloud sql connect <インスタンス名> --user=postgres

データベースの確認

\l

データベースの選択

\c <データベース名>

テーブル一覧

\dt;

レコード取得

// テーブル名が大文字の場合はダブルクオーテーションつける
SELECT * FROM "User";

カラムを絞り込んでレコード取得

SELECT id, name FROM "User";

テーブルから全てのレコードを削除

DELETE FROM <テーブル名>

カラムの更新

UPDATE "User" SET name = 'newName' where id = 'id';

LeetCodeの Longest Common Prefix をSwiftでやった

class Solution {
    func longestCommonPrefix(_ strs: [String]) -> String {
        if strs.count == 0 { return "" }
        
        func m(_ n1: String, _ n2: String) -> Bool {
            return n1.count < n2.count
        }
        
        var minStr = strs.min(by: m)!
        
        for str in strs {
            while !str.hasPrefix(minStr) {
                minStr.removeLast()
            }
        }
        
        return minStr
    }
}

Swift初心者メモ

longestCommonPrefix(_ strs: [String]) の _ は呼び出し側で引数名の省略を可能にするキーワード。

strs.min(by: m)! の m の部分に (_ n1, _ n2) -> Bool {} をインラインで書いたらコンパイルエラー。

var minStr = strs.min(by: m)! で末尾の ! を消すと Stringではなく Optional(" ") が返り、Stringを返さなければいけないのでコンパイルエラー。

var minStr = strs.min(by: m)! この部分は

var minStr = (strs.min{$0.count < $1.count})!

こんな感じでクロージャ使って短くかける

クロージャの書き方は

arrays - What does $0 and $1 mean in Swift Closures? - Stack Overflow

これがわかりやすい

React Native FirebaseでAuth機能使おうとしたら GTMSessionFetcher invoking fetch callbacks エラー

React Native Firebaseで認証認可を行うための実装をし、いざ実行してみると

GTMSessionFetcher invoking fetch callbacks

のようなエラーが出た。

他のプロジェクトで使った時は出なかったエラーだったので最初悩まされた。結論、Firebaseの方のログインプロバイダを適切に有効にしていなかったことにより発生していた。

対象のログインプロバイダを有効にすることで解決。

terraformの lacks IAM permission "iam.serviceAccounts.actAs" for the resource ~ に殺されかけた

terraformでGCPを構築していた。

Cloud Schedulerを作成しようと思いリソースを定義。oidcトークンを付与するためにサービスアカウントAを定義し

oidc_token {
  service_account_email = google_service_account.A.email
}

を行うも

lacks IAM permission "iam.serviceAccounts.actAs" for the resource <リソース名>

エラーが出た。Aに対して iam.serviceAccounts.actAs 権限がないものだとずっと勘違いし、Aを確認してもサービスアカウントユーザー権限は付与されている。

めっちゃ詰まったがterraformを実行するサービスアカウントにサービスアカウントユーザーがないことによるエラーだった。ロールを与えることで解決した。

Cloud BuildからCloud Runにデプロイしようとしたら does not have permission to access namespaces instance が出た

Cloud BuildからCloud Runへデプロイを試みたら

does not have permission to access namespaces instance

というエラーが出て失敗した。

IAMを見ても一通りロールは渡しているように思えた。

解決法

Cloud Build -> 設定のサービスアカウントが無効になっていたので有効にする。

f:id:ri99:20220302175240p:plain

自分の場合はこれで通った。

The minCompileSdk (31) specified in a dependency's AAR metadata is greater than this module's compileSdkVersion (android-30) が出たので対処した

ReactNativeで開発しており、Androidでビルドを試みたときに

The minCompileSdk (31) specified in a dependency's AAR metadata (META-INF/com/android/build/gradle/aar-metadata.properties) is greater than this module's compileSdkVersion (android-30).

というエラーが出たので対処した時の備忘。

エラー文を読む限り 「minCompileSdk(31)を要求しているけどモジュールがcompileSdkVersion (android-30)ですよ」というエラーである。

compileSdkVersionとはコンパイル時に使用するAndroid SDKのバージョン。

これを30から31に上げれば解消しそう、、

android/app/build.gradle の

compileSdkVersion rootProject.ext.compileSdkVersion

defaultConfig {
  targetSdkVersion rootProject.ext.targetSdkVersion
  ...
}

この部分を

compileSdkVersion 31

defaultConfig {
  targetSdkVersion 31
  ...
}

こうすることで直った。

ただ rootProject.ext.compileSdkVersion は android/build.gradle を指しているらしくこのファイルの中の

 compileSdkVersion = 30
 targetSdkVersion = 30

を31に変えたほうが安全に動くようになるかも(未検証)

Apollo Clientでキャッシュをクリアする

ReactNativeでApollo Clientを使って開発していた。

ログアウト -> 別垢でログインというフローがあった時に前のアカウントで取得したキャッシュが残ってしまっており、適切でないデータを表示していた。なのでログアウト時にはキャッシュをクリアしたかった。

解決法

client.clearStore()を使う。

https://www.apollographql.com/docs/react/caching/advanced-topics/#resetting-the-cache

自分の場合はグローバルステートの loggedIn でログインを管理していたのでこんな感じにした。

useEffect(() => {
    (async function () {
      if (checkedLogin && !loggedIn) {
        await client.clearStore();
        console.log("🧹 clear cache");
      }
    })();
  }, [checkedLogin, loggedIn]);