git log と git diff での ... (三点ドット) の意味の違い
TL;DR
git log A...Bとgit diff A...Bは、どちらも...(三点ドット)を使いますが、意味がまったく異なりますgit log A...Bは 対称差(symmetric difference) で、「A にだけあるコミット」と「B にだけあるコミット」の両方を表示しますgit diff A...Bは A と B のマージベース(共通祖先)から B までの差分 を表示します。つまり「B ブランチで何が変わったか」を見るためのものです- GitHub の Pull Request 画面で表示される差分は
git diff A...B相当です- つまり、みんなが普段欲しい diff は
..でなく...
- つまり、みんなが普段欲しい diff は
手元で試すためのセットアップ
以下のスクリプトで、本記事の図と同じブランチ構造を持つリポジトリを作れます。
…CI の flaky test を追ったら JDK の HashMap が壊れていた
TL;DR
- Kotlin + Exposed ORM のプロジェクトで、CI の並列テスト実行時に
ClassCastException: LinkedHashMap$Entry cannot be cast to HashMap$TreeNodeが散発的に発生しました。 - 原因は Exposed 内部の
IdentifierManagerApiが 非スレッドセーフなLinkedHashMapを識別子キャッシュに使っており、Kotest の並列実行で同時書き込みが起きて HashMap の内部構造が壊れるためです。 - これは Exposed #1704 として報告済みの既知バグで、Exposed 1.3.0 で修正されています。
- ローカルの単独テスト実行では再現しません。CI のテストレポート(HTML アーティファクト)を取得して初めて完全なスタックトレースが得られ、原因を特定できました。
症状: 無関係な2テストが同じ例外で落ちる
ある PR の CI で、7,000 件超のテスト中 2 件だけが失敗しました。
…GitHub PR が「コンフリクトあり」と言うのにローカルではマージできる
TL;DR
- GitHub の Pull Request が “This branch has conflicts” と表示するのに、ローカルで
git mergeすると何事もなく成功する、ということがあります。 - 原因は criss-cross merge(交差マージ)で
merge-baseが複数存在する状態です。 - ローカルの git(
ort/recursiveストラテジー)は複数の merge-base を仮想ベースに統合して賢く解決しますが、GitHub のマージエンジンは同じ状況をうまく処理できないことがあります。 - 解決策は
git rebaseで履歴を線形化することです。
状況
スタックド PR(PR-A の上に PR-B を積む運用)をしていて、次のようなことが起きました。
…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を利用していると(?)、頻繁に次のエラーが出ます。
「このターミナルでグラフィックス ドライバーの問題が発生し、時間内に回復できませんでした。ターミナルは一時停止されています。」
…