たかぎとねこの忘備録

プログラミングに関する忘備録を自分用に残しときます。マサカリ怖い。

2022-01-01から1年間の記事一覧

ビルドバリアントごとに処理の実装を切り替えたい場合に発生したコンフリクトを解消する方法

ビルドバリアントでは、mainディレクトリに置いてあるファイルとの差分の内容を、ビルドバリアントのディレクトリに配置することで、そのビルドバリアントを選択してビルドした際に優先的に読み込まれるのかと思っていた。 結論から言うと、ビルドタイプの名…

KotlinのExposedで作成日に基づいて並び替えた値に対してページネーションを行いたい場合

ExposedのDAO APIを使って次のようなモデルを定義してみる。 object Posts : UUIDTable() { val text = varchar("text", 144) val createdAt = datetime("created_at") } class Post(id: EntityID<UUID>) : UUIDEntity(id) { companion object : UUIDEntityClass<Post>(P</post></uuid>…

通知に関する実行時の権限を要求するダイアログが表示されない時に考えるべきこと

launchPermissionRequest()を呼び出して、通知に関する権限の確認を行いたい場合がある。 val permission = Manifest.permission.POST_NOTIFICATIONS val permissionState = rememberPermissionState(permission = permission) when { permissionState.statu…

Cloud Runにデプロイを試みた時に発生したPermission 'run.services.get' denied on resourceエラーの解決方法

GitHub Actionsからサービスアカウントを使ってCloud Runにデプロイを行なった時に次のようなエラーが発生した。 ERROR: (gcloud.run.deploy) PERMISSION_DENIED: Permission 'run.services.get' denied on resource このエラーの内容からgcloud.run.deploy…

ViewModelを初期化しようとして`Module with the Main dispatcher had failed to initialize`というエラーが出た話

テスト時にViewModelを初期化する処理を次のように書いた。 class LabelListViewModelTest { private val testScheduler = TestCoroutineScheduler() private val dispatcher = StandardTestDispatcher(testScheduler) private val repository = mockk<LabelRepository>(relax</labelrepository>…

`builder: Modifier.() -> Modifier`の読み方

DroidKaigi 2022のコードを眺めていると次のような記述にでくわした。 inline fun Modifier.ifTrue(value: Boolean, builder: Modifier.() -> Modifier): Modifier { val modifier = Modifier return then(if (value) modifier.builder() else modifier) } f…

ワークフローのファイルを作成してリモートリポジトリにプッシュしようとしたら失敗した

.github/workflows/Build.yamlを作成して、リモートリポジトリにプッシュしようとしたらエラーが発生した。 ! refs/heads/ci-build-workflow:refs/heads/ci-build-workflow [remote rejected] (refusing to allow a Personal Access Token to create or upda…

NavigationBarのNavigationBarItemを何度もタップすることにより、アプリが強制終了する場合の対処法

NavigationBarのNavigationBarItemを何度もタップし、最後に一番左のNavigationBarItemを連打するとアプリがクラッシュする現象に遭遇した。 これがその時のエラーの抜粋。 java.util.NoSuchElementException: List contains no element matching the predic…

Cloud Runで`error: Failed to sign the provided bytes`というエラーが表示された場合の対処法

Cloud RunでKtorアプリを動かしていると、次のエラーログが表示された。 error: Failed to sign the provided bytes 色々調べたらCloud Storageに保管してある画像の署名付きURLの生成時に発生しているようだった。 serverfault.com stackoverflow.com なの…

Ktor + Exposed + Cloud RunでCloud SQLに接続させる方法

Cloud RunにデプロイしようとしたKtor + Exposedのアプリケーションイメージが、Cloud SQLへ接続できないことが原因で何度もデプロイに失敗してしまった。解決までに数時間要してしまい、ネットを探してもExposedを使った時のCloud SQLへの接続方法を記した…

AndroidアプリでJetpack Composeを使って使用しているライブラリのライセンスを表示してみる

Androidアプリを開発していると直面するライセンス表示問題。 色々調べるとCookpadさんが公開しているプラグインにたどり着いた。だが、お察しのとおりすでにアーカイブされている。 github.com 代わりにおすすめされているのが、Googleが公開しているOSS Li…

以前の画面の状態が意図せぬ形で復元されてしまう場合の対処法

次の様な画面遷移図のアプリを考えてみる。 今までは全ての遷移時に次の様なコードを実行していた。 fun navigate( destination: TnaNavigationDestination, route: String? = null, from: NavBackStackEntry? = navController.currentBackStackEntry ) { if…

Androidのスプラッシュスクリーンで簡単に背景色をダークモード対応させる方法

Android Studioで、resディレクトリを右クリックして、New -> Android Resource Directoryを選択する。 Directory Nameにvalues-nightを入力して、OKをクリックする。 values-nightディレクトリが表示されない場合は、Projectビューに切り替える。 values-ni…

Androidではデータベースに画像のリソースIDを保存してはいけないらしい!

Androidアプリをコンパイルした後だったり、新しい画像をResource Managerに追加した後に、アプリで表示されていた画像がまったく異なる他の画像に置き換えられているケースが多々あった。 そろそろ対処しないとなーと思って色々調べていたら次のコメントを…

Kotlinでプロジェクト内のディレクトリにある複数のJSONファイルをまとめて処理してみる

次の様なディレクトリの構成を考えてみる。 a_lot_of_settings a settings.json b settings.json c settings.json src main kotlin com takagimeow main.kt a_lot_of_settingsディレクトリの中にはaディレクトリとbディレクトリとcディレクトリが存在し、そ…

1つのPostgreSQLコンテナに複数のデータベースを作成して、複数のアプリケーションからアクセス可能にしてみる

docker-composeでPostgreSQLコンテナを立ち上げる。docker-compose.ymlの内容は次のような感じで、Ktorプロジェクトのルートディレクトリに作成する。 version: "3.7" services: postgres: image: 'postgres:13' container_name: takagimeow-postgres restar…

ExposedでEnumを使ってみる

PostgreSQLをデータベースと使用しているときに、一部のカラムをEnumとして表現したい。 そのためにはまず、Enumを型として定義する必要があるので作成してみる。これはテーブルの定義よりも前にやっておく。 こんな感じ。 class PGEnum<T : Enum<T>>(enumTypeName: Stri</t>…

KtorとExposedの環境でちょっとデータベースにシードさせたいときのTips

Ktorでデータベースを使用したいので、com.takagimeow.infrastructure.database.daoにDatabaseFactoryを実装してみます。 package com.takagimeow.infrastructure.database.dao import com.takagimeow.infrastructure.database.models.Users import kotlinx.…

Jetpack Composeでディープリンクを開くテストをしてみる

ディープリンクを開くには次の書式でコマンドを実行する。 adb shell am start -W -a android.intent.action.VIEW -d <ディープリンクのURI> <アプリのパッケージ名> 実際に入力するときは次の様な感じ。 adb shell am start -W -a android.intent.action.VI…

Androidの通知に表示したいアイコンを用意する

Androidでは、アプリのアイコンと通知用のアイコンは異なる。 特に異なる部分はカラーの部分で、通知用のアイコンには基本的に色をつけることはできない。 Android 5.0以降では通知機能が大幅に変更されたため、アイコンのカラーチャンネルがすべて無視され…

`FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory`がGitHub Actionsで発生した場合の対処法

問題 次のようなエラーが発生してしまい、GitHub Actions上で実行していたテストがFAILEDしてしまった。 <--- JS stacktrace ---> FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory 1: 0xb02930 …

tscの代わりにBabelにトランスパイルをまかせてみた

モノリポでパッケージを作る際にtscの代わりにbabelを使ってみたかったので、これを機に色々調べてみた。 参考にしたのはこのサイト。 Using Babel with TypeScript | Learn TypeScript Babelってなんだ Babelは主にECMAScript 2015+のコードを、古いブラウ…

React Native製のアプリで受け取ったプッシュ通知をタップして特定の画面に遷移させる方法

目次 FirebaseコンソールからServer Keyを取得する Server KeyをExpoのサーバーにアップロードする 必要なパッケージをインストールする FirebaseコンソールからServer Keyを取得する Expoが認証情報を使って開発者の代わりにExpoのサーバーからプッシュ通知…

FirebaseからReact Native製アプリにプッシュ通知を送信する方法

スタンドアロンアプリをExpoで開発中に、プッシュ通知をタップして特定の画面を開く機能を実装したくなった。 BFFとしてFirebase Functionsを使用していたので、忘備録としてFirebase FunctionsからExpoで構築されたReact Native製アプリにプッシュ通知を送…

React NativeでFirebaseのダイナミックリンクをハンドリングしてみる

Firebase Authに登録されたメールアドレスを認証したあと特定の画面に遷移して結果を表示したいというモチベーションが沸々と湧きあがった。 流れとしては次のような感じ。 firebase/authのsendEmailVerificationメソッドを利用してユーザーのメールアドレス…

Firebase Dynamic Linksでダイナミックリンクを作成する

Firebase Dynamic Linksの作成画面で各単語が意味していることや、各フィールドで求められる内容を入力する意味が最初わからなかったので、将来的なことも含めて忘備録としてダイナミックリンクの作り方を残しておく。 Firebaseのコンソール画面からDynamic …

`node-fetch`を使用したときに発生する`Error [ERR_REQUIRE_ESM]: require() of ES Module`の解決方法

Firebase Functionsでnode-fetchを使用してFirebase Emulatorで動かそうとしたら次のようなエラーが発生した。 Error: Failed to load function definition from source: Failed to generate manifest from function source: Error [ERR_REQUIRE_ESM]: requi…

Expoのマネージドアプリのアップデートに関するメモ

expo publishについて expo publishを実行するとプロジェクトの永続的なURLが発行される。 これはExpo Goアプリで開くことができる。 そして、アプリの画像、フォント、動画などのアセットがすべてCDNにアップロードされる。 expo publishを実行した際に指定…

ExpoのRelease ChannelsとRuntime Versionsを調べてみた。

Release Channelsとは リリースチャンネルを使用することで、スタンドアロンアプリのビルド時に指定したリリースチャンネルと同じリリースチャンネルが指定されたアップデートを配信することができる。 これにより、複数の環境やバージョンを分けてアップデ…

Firebase FunctionでJWTを作成して、バックエンドへのリクエストの際に使用する簡単なやり方

前提 NestJSプロジェクトの作成方法や、PassportとJWTを組み合わせて認証機構を実装する方法に関してはこちらを参照。 takagimeow.hatenablog.com Firebase プロジェクトの作成方法についてはこちらの記事を参照。 takagimeow.hatenablog.com Firebase Funct…