Kotlin

【SpringBoot】Public final method [...] cannot get proxied via CGLIB, consider removing the final marker or using interface-based JDK proxies.警告をall-openで抑制する【Kotlin】

TL;DR CGLIBからの題のような警告を抑制する場合、調べた限り以下のような方法があった。 interface化 --add-opens java.base/java.lang=ALL-UNNAMED指定 open化 これら全てに不適切感が有る場合、Kotlinならspringプラグイン経由でall-open対象にする対処法…

【jackson-module-kogera】value class関連処理をMethodHandle化するとどれ位高速化するか

jackson-module-kogera 2.19.0-beta25にて、value classのシリアライズ / デシリアライズに関連する処理でMethodHandleを使うように変更しました。 github.com この記事では、変更の効果が最低でどの程度かを確認した結果を紹介します。 value class関連処理…

【Kotlin】PublishedApiアノテーションを用い、publicなinline関数から呼び出せるinternal関数/クラスを定義する

internal関数/クラスへ@PublishedApiアノテーションを付与すると、publicなinline関数からも呼び出せるようになります。 kotlinlang.org kotlinlang.org ただし、privateな内容には適用できないため、モジュール or プロジェクトレベルで分かれている場合に…

【JUnit5】junit-jupiter 5.12へのアプデでテストが動かなくなった問題への対処【Gradle】

TL;DR サンプルプロジェクトを参考に、プロジェクトの構成を見直すのが良さそうです。 junit.org 状況 junit-jupiter 5.11.3 -> junit-jupiter 5.12.xへのアプデでテストが動かなくなりました。 レポートを見ると以下のようなスタックトレースが出ていました…

【Gradle】ビルドがハングして二進も三進も行かない場合、Javaプロセスをkillすれば回復するかも【Kotlin】

TL;DR Javaを利用していそうなアプリケーション(e.g. IDE)を全て閉じた上で、なお生きているJavaプロセスがある場合、それをkillすれば回復する可能性が有ります。 自分はmac環境にて、アクティビティモニタからプロセスを目grep・終了とすることで対処し…

Spring WebFlux/R2DBC/jOOQ/PostgreSQL/Kotlin Coroutines環境でselectクエリがハングする時の個人的対処法3選

Spring WebFlux/R2DBC/jOOQ/PostgreSQL/Kotlin Coroutines環境で、不意にselectクエリがハングする状況が何度か有りました。 関連する内容が多すぎて原因は解析し切れていませんが、そのような状況に対して見出した3つの対処法をまとめます。 何かより良い対…

【Spring WebFlux】jOOQで組み立てたクエリをConnectionFactoryへ直に発行する【R2DBC】

jOOQで組み立てたクエリをConnectionFactoryへ直発行する仕組みを作ったのでまとめます。 なお、これは事情が有って作ったものであり、本来一切推奨できないコードであることはご承知おき下さい。 コード全体は以下の通りです。 基本的にはSelectクエリでの…

【Gradle】finalizedBy("formatKotlin")がTask 'formatKotlinMain' uses this output of task...で失敗する場合、finalizedBy("formatKotlinMain")にすると成功するかも

状況 jOOQのコード生成後にフォーマッティングするため、kotlinterを用いfinalizedBy("formatKotlin")としていたプロジェクトで、nu.studer.jooqからorg.jooq.jooq-codegen-gradleに移行する際、以下のようなエラーが出るようになりました(※編集しているた…

KotlinリポジトリのcodegenTarget8Jvm8Testを実行するとToolProvider.getSystemJavaCompilerがnullを返して一部が失敗する問題への対処

Project StructureのSDKに指定しているJDKバージョンが違うのにcodegenTarget8Jvm8Testを使っていたのがダメだったらしい 指定されているJava 11に合わせ、codegenTarget8Jvm11Testを使うよう変更したら完全に通るようになった 試した限り、codegenTarget8Jv…

【MockK】mock/spyされたオブジェクトを大量に呼び出すと異常な負荷・OOMが生じた【Kotlin】

状況 パターン網羅のために大量の呼び出しを行うようなテストを追加した所、java.lang.OutOfMemoryErrorでテストが失敗する状況が生じました。 外形的な挙動としては、テスト関数が1つ終わってもメモリが解放されず、テストが進むにつれメモリ使用量も線形に…

【Kotlin】kotlin-reflectを弄るためのメモ

github.com greadle.propertiesを弄る ビルド・テストで全論理コア使われると他アプリの動作が重くなるので、kotlin.test.junit5.maxParallelForksを全論理コア数 - 最低限確保したい論理コア数にしていいかも。 以前はJDK7以前を無視するオプションも有った…

KotlinlangのSlackでThank Youが明るくなった話

qiita.com この記事はSwift/Kotlin愛好会 Advent Calendar 2023の3日目の記事になりました。 Kotlin言語には、JetBrainsの管理する公式Slackワークスペースが有ります。 kotlinlang.slack.com このワークスペースでは、現在:thank-you-color:として以下のス…

KotlinプロジェクトでGradle 7.6.2 -> Gradle 8.3移行をした時の作業メモ

自分が取り組んでいるKotlin製OSSプロジェクトにて、Gradle 7.6.2 -> Gradle 8.3の移行をやった際にハマったことのメモです。 github.com きっかけ このプロジェクトには、GitHub ActionsでKotlin x Javaのバージョンを組み合わせ毎の挙動を確認するグリッド…

【Gradle】プラグインバージョンを対象にグリッドテストを作成する【GitHub Actions】

TL;DR gradle.kts利用の場合、引数をpluginsブロックで参照することはできないようだった 代替案としては、環境変数に設定 -> System.getenvで読み出す形式にするのが一番シンプルそうだった やり方 紹介する内容は以下からの抜粋です(余計なdiffが入ってし…

【Gradle】Kotlinのプラグインバージョンを下げるとCaused by: java.lang.NoSuchFieldError: KOTLIN_STAT_LABEl_PROPERTYでsyncが失敗する状況への対処

TL;DR 自分が遭遇した問題の原因はorg.jmailen.kotlinterプラグインとKotlinバージョン間の互換性が無いことだった プラグインバージョンを確認するのが良いかも 起きたこと Kotlinプラグインのバージョンを1.7.21 -> 1.5.32に変更した所、Caused by: java.l…

【GitHub】Kotlinの「色」が変わった話

「Swift/Kotlin愛好会 Advent Calendar 2022」の枠が空いていたので急遽書いてみました。 qiita.com GitHubでは、画像のように、リポジトリ内の言語割合をカラフルに表示してくれます(画像はKotlinリポジトリより)。 この表示でのKotlinは紫っぽい色ですが…

【Spring WebFlux】Cannot determine database's type as ConnectionFactory is not options-capable.への対処【R2DBC】

H2データベースを使ってR2DBCのpostAllocate/preReleaseの挙動を確認するためのSpring WebFluxプロジェクトを作成していた所、Cannot determine database's type as ConnectionFactory is not options-capable. To be options-capable, a ConnectionFactory …

【jOOQ】R2DBC接続でDSLContextを上手く管理する方法を考える【Spring】

以下の記事を書いていて、「DSLContextを使い捨てたら非効率なのでは?」と感じたので、管理方法を考えてみたメモです。 その他の便利要件も含めています。 あくまでメモなので、これがどれ位性能に影響するか等は未検証です。 qiita.com 前提 トランザクシ…

【Spring】JDBC接続で、suspend関数に対してTransactionalアノテーションを利用してのロールバックが効くか確認する【Kotlin】

お詫び 過去公開していた記事では、Spring WebFluxで複数リクエストを同時に処理する場合を考慮していませんでした。 JDBC接続 x Spring WebFluxでトランザクション管理をすると壊れる可能性が有るため、やらないことをお勧めします。 「R2DBC接続でトランザ…

【Kotlin】ローカル関数の利用はパフォーマンス低下につながる

TL;DR ローカル関数を利用するとパフォーマンスが低下する このため、パフォーマンスが重要な場面ではローカル関数を利用すべきでない 文脈 日頃からお世話になっているintellij-rainbow-bracketsのコードを読んでいた所、以下のコードを見つけました。 gith…

【Kotlin coroutine/Java Reactor】Flow.groupByしたい場合Flux.groupByが使えるかも

記事執筆時点で、FlowにはgroupByが実装されていません。 kotlin.github.io 一方、FluxにはgroupByが実装されています。 projectreactor.io (kotlinx-coroutines-reactiveが入っているような環境では)FlowとFluxは相互変換できるため、検討の余地が有ると…

【日記】kotlin-reflectのvalue classを引数に含む関数呼び出しに関するバグ修正に携わった

↓の続きです。 wrongwrong163377.hatenablog.com 問題の内容 value classを引数に含む関数をkotlin-reflectを用いて呼び出す処理には、以下のような問題が存在していました。 "KotlinReflectionInternalError" when using `callBy` on constructor that has …

【jOOQ】Recordからの値読み出しを省力化する【Kotlin】

定義したもの import org.jooq.Field import org.jooq.Record inline fun <reified T> Record.read(field: Field<*>): T = this[field, T::class.java] 使い方 以下のように使います。 import org.jooq.Field import org.jooq.Record // FOOテーブルに定義された文字列</reified>…

【日記】Kontributorになった

最終的にやったことをまとめた記事を投稿しました。 wrongwrong163377.hatenablog.com やったこと JetBrains/kotlinにGitHubでPRを出し、マージしてもらいました。 当該PRは以下です。 github.com このPRの内容 このPRに関しては全てテストです(変更行数は2…

【SpringBoot】java.lang.NoSuchFieldError: Companionで処理が失敗する状況への対処【OkHttp】

TL;DR 自分の場合、Dependency Management PluginによってOkHttpのバージョンが書き換わったことが原因だった com.squareup.okhttp3:okhttp:4.xが期待される所でcom.squareup.okhttp3:okhttp:3.14.9が利用されていた gradleのdependenciesに利用したいバージ…

【JUnit5】MethodSourceで空Streamをエラーにしたくない場合の対処

状況 JUnit5のParameterizedTestで、MethodSourceが空Streamを返した場合、以下のようなエラーになります。 Configuration error: You must configure at least one set of arguments for this @ParameterizedTest org.junit.platform.commons.PreconditionV…

【kotlinx-metadata】KmValueParameter.typeはnullにならない

TL;DR KmValueParameter.typeは実際の所non-nullだが、定義上nullableになっている ドキュメントも「KmValueParameter.typeがnon-nullならKmValueParameter.typeはnull」というような記述になっている ※0.3.0時点の話 本文 使っていて疑問を感じたので質問を…

【Kotlin】Intellij IDEAでjava.lang.OutOfMemoryError: Java heap spaceでコンパイルが失敗する状況への対処

Kotlin 1.3.71のプロジェクトで、バージョンを1.4や1.5に上げた所、java.lang.OutOfMemoryError: Java heap spaceでコンパイルが失敗する状況になりました。 Preferences -> Build, Execution, Deployment -> Compilerで、Shared build process heap size (M…

Intellij IDEAで、Kotlinプラグインを1.5にアップデートしたらビルドができなくなった問題への対処

2021/5/14追記 幾らか試した雰囲気では、File->Project Structure->Project ->Project SDKのバージョンが1.8(Java 8)だとこの問題が出るように見えました。 ここをJava 12以降(試したのが12と16だっただけで、それ以前でできないかは見ていません)にする…

【JMH】Windows環境で実行するコアを指定してベンチマークのスコアを安定させたかった話

TL;DR JMHのベンチマークスコアが安定しなかった (正確に特定はしていないが)全体の実行に5時間かかる内容であるため、途中でバックグラウンド処理が走った結果が原因と推定 start /affinity ${マスク} ${呼び出すプログラムと引数}とすることで、ベンチマ…