✖
Claude Code Pro の Weekly Limit が普通にキツくて、あんまり使えてない。Claude は計画の部分とかツールの使いかたとかがどんどん良くなってて、計画だけ決まればあとは自動運転でも割と良いことが多い (おかしいことしてるときもあるけど)。
そしてここしばらくは Google AI Pro を契約して gemini-3-flash-preview を Gemini CLI でかなり使っている。基本的に gemini-3-flash-preview ならほぼずっと使い続けられる。gemini-3-pro-preview は遅いしリミットくるし、それほど頭よく感じないしでほぼ使ってない。
Gemini CLI と Claude Code はツールとしての完成度がぜんぜん違うので、使いかたも違う。
Gemili CLI はとにかく編集するという機能が弱くて、だいぶつらい。
- 巨大な replace をしようとして失敗する
- replace でコメントを消しちゃう
- replace で大量の改行を入れこむ
- うまくいかなくて here doc でやろうとしてまた失敗する
- write_file で全部書き戻そうとしてぶっこわす
- 小さく変更しようとすると前後の文脈の重要な部分を省略して消しちゃう
とにかく編集という基本機能に問題があるので基本的に一切 accept editing してないで変更は全チェックしている。ここだけ我慢できれば普通に使えてる。
あと特定ケースでピンポイントにQwen3-Coder-480B-A35B-Instructを Kilo 経由で使ってみてる。Kilo よくできてるなあという気持ち
関連エントリー
- Chemr (Chemrtron) を再実装 Electron の非互換変更で大幅なアーキテクチャ変更を余儀無くされた時点でやる気がなくなってしまい、10年ぐらい前から触ってなかった C...
- 日記システムPerlからgolangに書き換え この日記システムを golang で書きなおした。元日から4日ぐらいかけた。なんかおかしかったら教えてください。 前々から日記システムをgo...
- CSS 2026 せっかくバックエンドシステムも変わったことだしと思ってCSSをアてなおした。何年ぶりかわからん (調べたら約10年一緒だった) 以下のように...
- micro-template.js を13年ぶりにいろいろいじった micro-template.js という2012年に作った embed JS 的なテンプレート処理ライブラリがある。コピペできるぐらい小さ...
- Android O から広色域ディスプレイがサポートされる デベロッパープレビューのそのようなことが書いてあった。 Wide-gamut color for apps: Android develop...
✖
このサイトのドメインにDKIMも設定した。あと無駄に spf についてたアドレスを外して google のリレーだけ許可するようにかえた。
✖
自分しか見ないけど管理画面を充実させつつある。今気付いたけどオレンジの枠なのは Cloudflare カラーなのか?
あとプレビュー機能もつけた。
Cloudflare のキャッシュも明示的な設定を入れた。R2の配信ドメインはクエリパラメータを無視するとか、年キャッシュをデフォルトにするとか
関連エントリー
- 管理しているドメインをすべて Cloudflare Registrar に移管した Value Domain → Google Domains → Cloudflare Registrar とわたりあるいた。 nameser...
- Cloudflare R2を使ってみる 容量的には 10GB までは無料で、そのあと従量課金になってもそれほど高額ではなさそう。 ただクラスB操作(参照系)がコントロールしにくいの...
- matplotlibのフォントキャッシュ削除 以下をコピーして pbpaste | python する import matplotlib import shutil import os...
- RaspberryPi を家庭内 LAN の DNS キャッシュサーバーに LAN向けのDNSキャッシュサーバ 経緯としてRTX1200 の DNS 機能が TCP フォールバックに対応してないのでオフにした、という...
- ✖ 日記の公開を遅延する機能 | tech - 氾濫原 この機能を実装してみたので、徐々に使ってみる。 実装的には結構やることがあって面倒だった...
✖
短文には関連エントリー出さないみたいな最適化を入れたい。1エントリが仰々しいと、短かい日記が書きにくいみたいなところある。どうしたもんか
✖
短文エントリ (タグない・画像ない・140文字未満) にはリストで関連エントリとシェアボタンを出さなくした。
golang で AVIF 対応 image.Decode
標準ないし準標準 (golang.org/x/image/webp みたいな) にはないので面倒っぽそうだなあとなんとなく思ってたけど意外にも簡単に対応できた。
CGo を許容するかで今のところ2択っぽい
_ "github.com/vegidio/avif-go"CGo_ "github.com/gen2brain/avif"libavifを WASM にコンパイルし、wazeroで実行
どっちもブランクインポートするだけでつかえる。ベンチ的には CGo のほうが10倍早い
こういう検証とベンチをむちゃくちゃサクっとやれるのすごいいいよなあ。Agentic Coding。脳の負荷が位置が変わっているのを感じる。
検証
vegidio/avif-go
# register_vegidio_test.go
package main
import (
"bytes"
"image"
"os"
"testing"
_ "github.com/vegidio/avif-go"
)
func TestRegisterVegidio(t *testing.T) {
data, err := os.ReadFile("../../static/fixtures/sample.avif")
if err != nil {
t.Fatal(err)
}
img, format, err := image.Decode(bytes.NewReader(data))
if err != nil {
t.Fatalf("Vegidio registration failed: %v", err)
}
t.Logf("Successfully decoded %dx%d %s image using vegidio", img.Bounds().Dx(), img.Bounds().Dy(), format)
if format != "avif" {
t.Errorf("Expected format avif, got %s", format)
}
}
go test -v register_vegidio_test.go
=== RUN TestRegisterVegidio
register_vegidio_test.go:23: Successfully decoded 2886x2164 avif image using vegidio
--- PASS: TestRegisterVegidio (0.08s)
PASS
ok command-line-arguments 0.313s
github.com/gen2brain/avif
# register_gen2brain_test.go
package main
import (
"bytes"
"image"
"os"
"testing"
_ "github.com/gen2brain/avif"
)
func TestRegisterGen2brain(t *testing.T) {
data, err := os.ReadFile("../../static/fixtures/sample.avif")
if err != nil {
t.Fatal(err)
}
img, format, err := image.Decode(bytes.NewReader(data))
if err != nil {
t.Fatalf("Gen2brain registration failed: %v", err)
}
t.Logf("Successfully decoded %dx%d %s image using gen2brain", img.Bounds().Dx(), img.Bounds().Dy(), format)
if format != "avif" {
t.Errorf("Expected format avif, got %s", format)
}
}
go test -v register_gen2brain_test.go
=== RUN TestRegisterGen2brain
register_gen2brain_test.go:23: Successfully decoded 2886x2164 avif image using gen2brain
--- PASS: TestRegisterGen2brain (0.73s)
PASS
ok command-line-arguments 1.119s
関連エントリー
- Stable Diffusion で prompt 情報を画像に保存しておく PNG にはメタデータを保存するチャンクがある。Python からも簡単に読み書き可能なので、ここに prompt を保存しておくと、あとか...
- Mac でウェブカメラの定期撮影を Swift で書く macOS 用にウェブカメラからjpgを取得するコマンドラインツールにimagesnapというのがある。単発で使うには問題ないんだけど、イン...
- HTML要素が見える範囲にあるかの判定 HTML上のある要素が見える範囲にあるかを JavaScript で判定したい。なんか1発で判定できるメソッドがあった気がしたが見つからなか...
- WSL2 で USB (usbipd-win) https://github.com/dorssel/usbipd-win WSL2 内ではホストの USB デバイスを使うことができないと...
- Raspberry Pi 2 B+ と 3.2inch LCD もともと初代 Raspberry Pi 用に買ったものだけれど、初代 Raspberry Pi をいよいよ捨てたので、ついでにいろいろ調べな...
Cloudflare R2を使ってみる
容量的には 10GB までは無料で、そのあと従量課金になってもそれほど高額ではなさそう。
ただクラスB操作(参照系)がコントロールしにくいのでちょっと怖い。CDN経由のキャッシュミスだけが問題なのでファイル数が十分に少なければ恐るることはなさそう。現状ではこのサイトの全GETリクエスト(ほとんどクローラーだけど)がR2に飛んだとしても無料枠に収まる。
まず新規アップロードを R2 にするようにしてある。様子を見つつ過去分もアップロードするつもりではあるけど、その前に JPEG ファイルを全ファイル AVIF にするということをしたいのでまだやれてない。
もともと Cloudflare Registrar 契約してるので使いはじめに抵抗がない感じ。
関連エントリー
- 管理しているドメインをすべて Cloudflare Registrar に移管した Value Domain → Google Domains → Cloudflare Registrar とわたりあるいた。 nameser...
- AVIF Lightroom Classic から AVIF が書けるようになってたことに気付いた。試してみる。画像サイズ取得するコードがたぶん動かん...
- Amazon Cloud Drive に写真をバックアップ Amazon プライムに入っていると無限に写真をアップロードできるので、バックアップのバックアップという位置付けで、たまに Amazon C...
- デジカメRAWファイルのサイドカーJPEGファイルを削除する Lightroom プラグイン WIFI転送のためαシリーズで撮影するときは RAW+JPEG にしています。 RAW+JPEG で撮った写真を Lightroom でメモ...
- golang で AVIF 対応 image.Decode 標準ないし準標準 (golang.org/x/image/webp みたいな) にはないので面倒っぽそうだなあとなんとなく思ってたけど意外に...
CDNエッジでジオシティーズ的なやつを作ってみる

半年以上前に Cloudflare Workers上で Honoフレームワーク使いつつ懐しい構成のサイトを作ってみたやつ、日記に書いてなかった。
中身がシーディーエンヌのエッジのワーカーで動いてるけど見てくれがジオシティーズだったら面白いなと思って、当時は Github Copilot 使いながら作った記憶。
いわゆる6hotサイトみたいのは現状の Worker の無料枠で全然問題なかろうという気がするし、そういう意味では現代のジオシティーズなんじゃと思ったのだった。
Durable Objects まわり仕様が変化していくのでエーアイに書かせて困った思い出がある。作りっぱなし

関連エントリー
- FNIRSI DPS-150 安定化電源のUSBプロトコルを解析してアプリ実装した FNIRSI DPS-150 直流安定化電源 0~30V 0~5A電圧電流調整 CNC プログラマブルスイッチング電源 4桁 IPSディスプ...
- Web Serial API chromium Issue 884928: Web Serial API が該当する。(Chrome 系以外では実装されていない。予定もな...
- ルービックキューブ 5x5x5 初回は解くのに失敗しつつ1時間ぐらいかかったが数日かけて10分→7分→5分台とちょっと縮んできた。3x3x3 が40秒程度なのでどうあがいて...
- GitHub Pages を GitHub Actions で PDF 化して releases にアップロード GitHub Pages を GitHub Actions で PDF 化して releases にアップロードするというのをやってみた。 ...
- 熱海 1泊で熱海にいった。 来宮神社 今まで見た神社のなかで一番演出が近代的な感じだった。全体的にやたらセンスよくデザインされているというかなんと...
AVIFすごすぎるな
過去のをちまちま変換してるけど、1/10 になってかつ見た目がまったく変わらないのも多い。JPEGはやめよう!
関連エントリー
- AVIF Lightroom Classic から AVIF が書けるようになってたことに気付いた。試してみる。画像サイズ取得するコードがたぶん動かん...
- golang で AVIF 対応 image.Decode 標準ないし準標準 (golang.org/x/image/webp みたいな) にはないので面倒っぽそうだなあとなんとなく思ってたけど意外に...
- Cloudflare R2を使ってみる 容量的には 10GB までは無料で、そのあと従量課金になってもそれほど高額ではなさそう。 ただクラスB操作(参照系)がコントロールしにくいの...
- デジカメRAWファイルのサイドカーJPEGファイルを削除する Lightroom プラグイン WIFI転送のためαシリーズで撮影するときは RAW+JPEG にしています。 RAW+JPEG で撮った写真を Lightroom でメモ...
- ✖ ここ数ヶ月は特にめちゃくちゃケチな自覚があり、家計全体の見える化とかを通して平均的な家族構成の過程から逸脱していないか、無駄がないかを確認し...
リンク切れした画像の一部を復活させた
過去画像の AVIF 化にともなって、Picasa → Google Photos → セルフホストと画像移行する過程で、うまくファイル名一致で移行できずにリンク切れになっていたファイルを、Lightroom Classic から再現像することである程度は復元した。
エントリの中にはあるがファイルシステムにないものを抽出して、
2026/01/12 17:38:39 AVIF変換を検証中... 2026/01/12 17:38:39 [欠落] エントリID:19390 (2012/04/20/1) 画像: IMG_0191-2048.jpg (AVIF:なし) 2026/01/12 17:38:39 [欠落] エントリID:19392 (2012/04/21/1) 画像: IMG_0123-2048.jpg (AVIF:なし) 2026/01/12 17:38:39 [欠落] エントリID:19393 (2012/04/22/1) 画像: IMG_0170-2048.jpg (AVIF:なし) ... |< この情報をGeminiに投げつけながらワンライナーでファイル名の一部を抽出してもらい、Lightroom の検索窓に投げんだ。あきらかに無関係なファイル以外をクイックコレクションに追加してすべて書き出た。 ただ、カメラのファイル名はあんまり一意ではない(買い替えのタイミングとかでリセットされている)。なので exiftool で撮影日時を取得し、↑ のログの日付と、因果律が崩れない範囲でファイル名をマッチングさせるコードを書いてもらった (なぜか Ruby で書いてくれた) そのうえで何度か漏れたファイルを出力した。1件だけどうしても見つからないファイルがあったけどもういいかなという感じ。
関連エントリー
- AVIF Lightroom Classic から AVIF が書けるようになってたことに気付いた。試してみる。画像サイズ取得するコードがたぶん動かん...
- golang で AVIF 対応 image.Decode 標準ないし準標準 (golang.org/x/image/webp みたいな) にはないので面倒っぽそうだなあとなんとなく思ってたけど意外に...
- 広色域時代の画像の正しい扱いかた モバイル端末も iPhone7 など DCI-P3 サポートが増えてきて、CSS での広色域サポートもはじまりつつあるなかで、サーバサイドな...
- Google Photos の ICC カラープロファイルの扱いの続き Google Photos の ICC カラープロファイルの扱い | tech - 氾濫原 の続きです。前回のまとめとしては Google ...
- A4 スキャナで A3 をスキャンして結合 うちのスキャナの設定だと、2枚スキャンした場合は以下のようなファイルをつくる。 -rw-r--r--@ 1 cho45 staff 4.8M...
過去画像を R2 に移行した
AVIF変換おわらせたあとガッと移行させた。
これで写真の表示が早くなるといいな。なんだかんだ Google Photos から移行してきてからは表示の遅さゆえに写真アップロードするモチベが落ちていたなと思う。
事前処理
もともとのファイル郡と拡張子ごとのサイズ
$ find . -type f -printf "%s %f\n" | awk '{ext=$NF; if(ext ~ /\./) {sub(/.*\./,"",ext); ext=tolower(ext)} else {ext="no_ext"}; sum[ext]+=$1} END {for(e in sum) print sum[e], e}' | sort -nr | numfmt --to=iec --field=1
5.5G jpg
298M png
60M webp
56M gif
1.5M avif
1.1M jpeg
219K ds_storeoxipng と avif への変換後
$ find . -type f -printf "%s %f\n" | awk '{ext=$NF; if(ext ~ /\./) {sub(/.*\./,"",ext); ext=tolower(ext)} else {ext="no_ext"}; sum[ext]+=$1} END {for(e in sum) print sum[e], e}' | sort -nr | numfmt --to=iec --field=1
3.3G avif
450M jpg
240M png
60M webp
56M gifこの450MBの jpg については参照されてないものっぽいのでGCすることに。
関連エントリー
- デジカメRAWファイルのサイドカーJPEGファイルを削除する Lightroom プラグイン WIFI転送のためαシリーズで撮影するときは RAW+JPEG にしています。 RAW+JPEG で撮った写真を Lightroom でメモ...
- リンク切れした画像の一部を復活させた 過去画像の AVIF 化にともなって、Picasa → Google Photos → セルフホストと画像移行する過程で、うまくファイル名一...
- golang で AVIF 対応 image.Decode 標準ないし準標準 (golang.org/x/image/webp みたいな) にはないので面倒っぽそうだなあとなんとなく思ってたけど意外に...
- Stable Diffusion で prompt 情報を画像に保存しておく PNG にはメタデータを保存するチャンクがある。Python からも簡単に読み書き可能なので、ここに prompt を保存しておくと、あとか...
- 伝送路中の定在波の最大電圧と最大電流 伝送路インピーダンス50Ω 送信機出力 50W では、完全に整合していれば、50Vrms 1A になる。ただ、SWR が悪化すると (すなわ...
matplotlibのフォントキャッシュ削除
以下をコピーして pbpaste | python する
import matplotlib
import shutil
import os
# キャッシュディレクトリの場所を取得
cache_dir = matplotlib.get_cachedir()
print(f"キャッシュディレクトリ: {cache_dir}")
# キャッシュディレクトリ内の fontlist 関連ファイルを削除
for file in os.listdir(cache_dir):
if file.startswith("fontlist") and file.endswith(".json"):
path = os.path.join(cache_dir, file)
print(f"削除中: {path}")
os.remove(path)
print("削除完了。Jupyter Notebookやスクリプトを再起動してください。")
関連エントリー
- Stable Diffusion で prompt 情報を画像に保存しておく PNG にはメタデータを保存するチャンクがある。Python からも簡単に読み書き可能なので、ここに prompt を保存しておくと、あとか...
- ccls + vim-lsp で補完時に後続のwhitespaceが削除される 以下をいれるととりあえずおさまる。ccls と相性が悪い?? let g:lsp_insert_text_enabled = 0 let g...
- tmux 用の cdd (ウィンドウ番号を指定して cd) GNU screen のとき定義していた cdd という、既に開いている別ウィンドウのディレクトリにcdするコマンドがあった(ref. cd...
- WSL2 の .vhdx はどこ? dir "$env:LOCALAPPDATA\Packages\*UbuntuonWindows*\LocalState\*.vhdx" で...
- RaspberryPi を家庭内 LAN の DNS キャッシュサーバーに LAN向けのDNSキャッシュサーバ 経緯としてRTX1200 の DNS 機能が TCP フォールバックに対応してないのでオフにした、という...
✖
まちがえました。この日記には削除機能がないんです
管理画面のヘッダをローカルと色変えるようにしました
✖
<!DOCTYPE html>
類似画像検索をOKLCH色空間で再実装
類似画像検索まわりをだいぶいじった。Perl の実装では Libpuzzle を適当に使ったやつだったが、独自実装に変えてみた。↑ の画像は管理画面
3次元のヒストグラム
「類似」をどうするかをこの日記においては色の傾向が似ている (形は無視する) としてみる。意図としては「雰囲気が似ている」画像を出すというのを目標にするもの。
つまりヒストグラムの比較で類似性を判断する。
人間の色認知は3次元の色空間で表現されるので、この3次元空間をそれぞれの次元で均等に区切り (バケツに比喩される)、各ピクセルをそれぞれ、その空間(バケツ)に放りこむ。
使う色空間を OKLCH に
RGB の3次元でもヒストグラムは作れるけど、距離が知覚と一定ではない問題があるので、ビットごとに知覚的な空間との間に乖離がある。ちょうどいい色空間として、人間の知覚的に均等な距離を持つ OKLCH 空間があるのでこれを使ってみることにした。
こうすることで知覚とバケツのサイズを一致させ、1ビットの価値を均等にできる。
ヒストグラムのエンコーディング (64bitのビットマスク化)
集計したヒストグラムをそのまま保存するとデータ量が大きいため、各バケツのピクセル数(頻度)を保存するのではなく、「その色が画像の中に一定以上(例えば面積の3%以上)存在するかどうか」という 0 か 1 かのフラグに変換して保存する。
これを 64個のバケツすべてで行うと、画像は 64ビットの1つの整数(シグネチャ) として表現できる。これが画像の「色の指紋」となる。
OKLCH を使うと書いたけど、L(明るさ)、C(彩度)、H(色相)を、それぞれビット位置として L:2bit (4段階) C:1bit (2段階) H:3bit (8方向) と配分した。Lab ではなく LCH を使うことで H に多くのビットを割くということができる。
これでバケツごとに1bit(有無)に情報圧縮される。バケツは「こんな感じの色」という単位なので、「こんな感じの色が含まれている」という集合の状態になる。同時にこれは画像全体のサイズによって正規化されている。
類似度の計算(Jaccard 係数)
最終的に画像同士のシグネチャ、実体としては色の集合のビットマスクを比べる際は Jaccard(ジャカード)係数 を使う。これは「共通して持っている色の数」を「両方の画像のどちらかに存在する色の総数」で割ったものであり、パレット(色の品揃え)がどれだけ重なっているかとして評価できる。
ただこれを全画像に毎回やるのは大変なので SQL で検索可能にするための工夫をする。
検索の高速化 (ngram)
似ているビットマスクを検索する手段として、ビットをいくつかに分割してngramにして保存しておくという方法が使われる。別に任意のビットマスクでよく使わる方法で特別な方法ではない。
ここでは1ビットごとにずらした12bitをそのパターンのオフセット位置を共に、52個のワードとして保存する。つまり1つの画像は64bitのシグネチャにされたあと、この64bitをスライディングウィンドウで12bitずつ切り出して保存し、これにインデックスを貼る。
そして類似画像の検索時は、このインデックスを利用して、部分マッチするものを先に足切りしてとってくる。SQL レベルで「同じ明るさ・色相の場所に、同じ色の塊を持っている画像」をピンポイントで引き抜くことができる。
空間充填曲線(Z-order)による ngram の高密度化
さらに、この検索用の12ビットの窓にも、より多くの「関連する色」を詰め込むため、Z-order (Morton order) を採用してビットのアドレスを決定する。
これにより、1次元のビット列上でも3次元的な色の近接性が保たれ、1つの ngram が「色空間上の意味のある局所的なボリューム」を指紋として表現できるようになる
具体的には図の上ように、単にLCHをそれぞれ L=2bit, C=1bit, H=3bit としてビットを構築すしたままだと、ところどころ色が離れた場所にジャンプしてしまう。これを下のようにビットインターリーブ(z-order化)することで、12bitの情報を均等にできる。
関連エントリー
- Stable Diffusion 日記 #26 なんかどっかで見たことあるけど画像検索しても類似画像としては上がってこないのでモヤっとする感じの
- ✖ redeveloped タグをつけてる写真は過去の写真を演出… | Thu, Jul 13. 2017 - 氾濫原 をやろうと思って、画像ハ...
- ✖ redeveloped タグをつけてる写真は過去の写真を演出を変えて再現像したものになってる。 なので、過去のエントリがあるならリンクを貼り...
- MySQL で SET 型の UPDATE 以下のようなテーブルのとき CREATE TABLE foo ( aset set('aaa', 'bbb', 'ccc') ); 空文字列...
- 12bit DAC 2つで 24bit DAC? MCP4922 などの使用例に書いてあるやつを考えてみる。http://akizukidenshi.com/download/MCP4922...





