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 -> 設定のサービスアカウントが無効になっていたので有効にする。
自分の場合はこれで通った。
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]);