Jackson + Kotlin の nullable な value class が {"value":"..."} で出力される
TL;DR
- Kotlin の
@JvmInline value classを nullable なプロパティとして持つ data class をjackson-module-kotlinでシリアライズすると、auto-unwrap が効かず{"value":"..."}の boxed object として出力されることがあります。 - Jackson 2.17 で value class サポートは正式に入りましたが、公式 docs は “there are many edge cases for the
value classthat wraps nullable” と明記しており、完全解決ではありません。 - 推奨される回避策は value class 側の underlying プロパティに
@get:JsonValueを付与することです。
何が起きたか
Kotlin で ID 系の型安全性を担保するために、こういう value class を定義しているプロジェクトは多いと思います。
…react-select の AsyncSelect が IME 確定後に検索を再実行しない
TL;DR
- react-select の
AsyncSelectは、IME(日本語入力)で文字を確定した後にloadOptionsを再呼び出ししないケースがあります。 - 原因は
compositionEnd後にinputValueが内部的に「変化なし」と判定され、検索が再トリガーされないことです。 AsyncSelectのloadOptionsパターンをやめ、通常のSelect+ controlledinputValue+useEffectによる自前検索に切り替えることで解決しました。
症状
非同期検索付きのセレクトボックスを react-select の AsyncSelect で実装していました。ユーザーがキーワードを入力すると API を呼んで候補を表示する、よくあるパターンです。
AIコーディング近況
2025-10-26 に次の記事を書きました。
これは、私のAI利用略歴と、当時は主に Claude Code(仕事)と Codex CLI(プライベート)を使い分けていた、という内容でした。
本記事では、その後の近況を記録しておきます。
Kotlin の @JvmInline value class が Spring MVC のパラメータバインディングで壊れる
TL;DR
- Kotlin の
@JvmInline value classを@ModelAttributeで受ける data class のプロパティに使うと、リクエスト時にBeanInstantiationExceptionが発生します。 - 原因は Kotlin リフレクション API が value class のアンラップ済み型を正しく扱えないバグ(KT-64097)です。Spring Framework 6.1.0 以降のリフレクションベース(
KCallable#callBy)のパラメータ解決と噛み合って表面化します。 - Spring 側はこれを「Kotlin のバグ」として
NOT_PLANNEDでクローズ済みです(spring-framework#31698)。フレームワークの修正は期待できません。 - 回避策はバインディング方式によって異なります。
@ModelAttributeの data class では value class を使わず、UUID等の素の型で受けて Controller 内で value class に変換するのが安全です。
value class とは
Kotlin の @JvmInline value class は、1つの値を型安全にラップするための仕組みです。
Kotlin のデフォルト引数が Spring AOP プロキシをすり抜けて NPE になる
TL;DR
@Transactional系のアノテーション(Spring AOP のクラスプロキシ)が掛かった Kotlin クラスで、メソッドのデフォルト引数式が注入フィールドを参照しているとNullPointerExceptionになることがあります。- 原因は「Kotlin のデフォルト引数は static な合成メソッド
xxx$defaultに展開され、それが Spring AOP プロキシのインターセプトをすり抜ける」ためです。 - 同じシグネチャでも 引数を明示的に渡すと再現しません。そのためテストやコードパスによって出たり出なかったりして気付きにくいです。
- 対策はシンプルです。デフォルト引数で注入依存を参照しないこと。必要なら メソッド本体で
val宣言 するか、オーバーロードで表現します。
症状
ある UseCase をリファクタして、時刻取得を Clock の DI 経由に変えました。
江添亮の入門C++ PDF(フォント埋め込み)
最近Xで、“ゲームプログラマーになりたいならC++は必須"みたいなポストを見かけ、そういや最近のC++ってどうなっているのか知っといてもいいかも、ということでC++を学べる教材を探すことにしました。
…WSL2でWindows Terminalがクラッシュするので利用をやめた
でも書きましたが、Windows Terminalが旧MSIMEを使っていると頻繁にクラッシュして困ったので新しいMSIMEを使うことにしました。
しかし、新しいMSIMEだとShift+Spaceで日英入力切替ができないのでAutoHotKeyを利用して解決を図りました。
OBS Python Scriptingで利用できるPythonバージョンの調べ方
より。
shared/obs-scripting/obs-scripting-python-import.c を見れば良さそうです。
この記事を書いている時点ではは 3.12 までのようですね。
現在の最新安定版が 3.14 なのでちょっと注意する必要があります。
Windows11でShift+Spaceで日本語/英語切り替えを行えるようにする
ひとつ前のエントリーに記載した通り、これまでShift+Spaceで日本語と英語の切り替えを行うために「以前のバージョンのMicrosoft IMEを使う」の設定を有効化していましたが、Windows Terminalとの相性が悪いため無効化せざるを得なくなりました。
…Windows Terminalで日本語入力中 頻繁にクラッシュする
WSL2上の操作をWindows Terminalで行っているのですが、codexを利用していると(?)、頻繁に次のエラーが出ます。
「このターミナルでグラフィックス ドライバーの問題が発生し、時間内に回復できませんでした。ターミナルは一時停止されています。」
…これまでのAIコーディングの略歴、Codex Cli ファーストインプレッション
最近はもっぱらAIを利用してコーディングしています。
が、blogにそういったことをまだ書いたことがなかったなあということで、記録を残そうと思った次第です。
IntelliJの自動整形でimportのwildcardを使わないようにする
前回のエントリー では休職について記載しましたが、現在、無事職に着くことができています。
さて、そのプロジェクトでの話ですが、CIでKotlinコードに対してktlintでソースコードのチェックを行っています。
ルールは(ほぼ)デフォルト設定を用いているのですが、このデフォルト設定とIntelliJ IDEAのデフォルト設定が競合するルールがあります。
つまり、IntelliJ IDEAの設定でフォーマットをかけると、CIが失敗してしまいます。
キーボードを買い替えた: Majestouch Xacro M10SP
これまで、 Mistel Barocco MD600 という左右分離式キーボードを利用していたのですが、USBケーブル接続端子の調子が悪くなったのか、タイピングを認識しなくなることが頻繁に発生するようになり、買い換えることにしました。
…