git log と git diff での ... (三点ドット) の意味の違い


TL;DR

  • git log A...Bgit diff A...B は、どちらも ...(三点ドット)を使いますが、意味がまったく異なります
  • git log A...B対称差(symmetric difference) で、「A にだけあるコミット」と「B にだけあるコミット」の両方を表示します
  • git diff A...BA と B のマージベース(共通祖先)から B までの差分 を表示します。つまり「B ブランチで何が変わったか」を見るためのものです
  • GitHub の Pull Request 画面で表示される差分は git diff A...B 相当です
    • つまり、みんなが普段欲しい diff は .. でなく ...

手元で試すためのセットアップ

以下のスクリプトで、本記事の図と同じブランチ構造を持つリポジトリを作れます。

Read more ⟶

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 件だけが失敗しました。

Read more ⟶

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 を積む運用)をしていて、次のようなことが起きました。

Read more ⟶

Jackson + Kotlin の nullable な value class が {"value":"..."} で出力される


TL;DR

  • Kotlin の @JvmInline value classnullable なプロパティとして持つ data class を jackson-module-kotlin でシリアライズすると、auto-unwrap が効かず {"value":"..."} の boxed object として出力されることがあります。
  • Jackson 2.17 で value class サポートは正式に入りましたが、公式 docs は “there are many edge cases for the value class that wraps nullable” と明記しており、完全解決ではありません。
  • 推奨される回避策は value class 側の underlying プロパティに @get:JsonValue を付与することです。

何が起きたか

Kotlin で ID 系の型安全性を担保するために、こういう value class を定義しているプロジェクトは多いと思います。

Read more ⟶

react-select の AsyncSelect が IME 確定後に検索を再実行しない


TL;DR

  • react-select の AsyncSelect は、IME(日本語入力)で文字を確定した後に loadOptions を再呼び出ししないケースがあります。
  • 原因は compositionEnd 後に inputValue が内部的に「変化なし」と判定され、検索が再トリガーされないことです。
  • AsyncSelectloadOptions パターンをやめ、通常の Select + controlled inputValue + useEffect による自前検索に切り替えることで解決しました。

症状

非同期検索付きのセレクトボックスを react-selectAsyncSelect で実装していました。ユーザーがキーワードを入力すると API を呼んで候補を表示する、よくあるパターンです。

Read more ⟶

AIコーディング近況


2025-10-26 に次の記事を書きました。

これは、私のAI利用略歴と、当時は主に Claude Code(仕事)と Codex CLI(プライベート)を使い分けていた、という内容でした。
本記事では、その後の近況を記録しておきます。

Read more ⟶

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つの値を型安全にラップするための仕組みです。

Read more ⟶

Kotlin のデフォルト引数が Spring AOP プロキシをすり抜けて NPE になる


TL;DR

  • @Transactional 系のアノテーション(Spring AOP のクラスプロキシ)が掛かった Kotlin クラスで、メソッドのデフォルト引数式が注入フィールドを参照していると NullPointerException になることがあります。
  • 原因は「Kotlin のデフォルト引数は static な合成メソッド xxx$default に展開され、それが Spring AOP プロキシのインターセプトをすり抜ける」ためです。
  • 同じシグネチャでも 引数を明示的に渡すと再現しません。そのためテストやコードパスによって出たり出なかったりして気付きにくいです。
  • 対策はシンプルです。デフォルト引数で注入依存を参照しないこと。必要なら メソッド本体で val 宣言 するか、オーバーロードで表現します。

症状

ある UseCase をリファクタして、時刻取得を Clock の DI 経由に変えました。

Read more ⟶

江添亮の入門C++ PDF(フォント埋め込み)


最近Xで、“ゲームプログラマーになりたいならC++は必須"みたいなポストを見かけ、そういや最近のC++ってどうなっているのか知っといてもいいかも、ということでC++を学べる教材を探すことにしました。

Read more ⟶

WSL2でWindows Terminalがクラッシュするので利用をやめた


でも書きましたが、Windows Terminalが旧MSIMEを使っていると頻繁にクラッシュして困ったので新しいMSIMEを使うことにしました。
しかし、新しいMSIMEだとShift+Spaceで日英入力切替ができないのでAutoHotKeyを利用して解決を図りました。

Read more ⟶

OBS Python Scriptingで利用できるPythonバージョンの調べ方


より。
shared/obs-scripting/obs-scripting-python-import.c を見れば良さそうです。
この記事を書いている時点ではは 3.12 までのようですね。
現在の最新安定版が 3.14 なのでちょっと注意する必要があります。

Read more ⟶

Windows11でShift+Spaceで日本語/英語切り替えを行えるようにする


ひとつ前のエントリーに記載した通り、これまでShift+Spaceで日本語と英語の切り替えを行うために「以前のバージョンのMicrosoft IMEを使う」の設定を有効化していましたが、Windows Terminalとの相性が悪いため無効化せざるを得なくなりました。

Read more ⟶

Windows Terminalで日本語入力中 頻繁にクラッシュする


WSL2上の操作をWindows Terminalで行っているのですが、codexを利用していると(?)、頻繁に次のエラーが出ます。

「このターミナルでグラフィックス ドライバーの問題が発生し、時間内に回復できませんでした。ターミナルは一時停止されています。」

Read more ⟶