**25 年の卵**

2026/03/19 0:44

**25 年の卵**

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

概要:
2026年2月に、著者は11,345件のレシート(PDF、メール、画像)をわずか14日間(2月8日〜22日)で処理するエンドツーエンドパイプラインを構築しました。システムは、CodexとClaudeという二つのAIコーディングエージェントと専門化されたOCRモデルを組み合わせています。「白い影」のようなフラットベッドスキャンなどのOCR課題は、高さのあるレシートを動的に切り分けることで対処され、PaddleOCR‑VL(0.9Bパラメータ)がTesseractの代わりに使用されました。GPUを100%利用し夜間に10.8時間実行して全レシートのテキストをきれいに抽出しました。SAM 3による境界検出は、0.92〜0.98の信頼度で約4秒/スキャンを達成しました。構造化抽出は正規表現から完全バッチCodex処理へ移行し、バッチサイズ調整と分離により平均ETAが約12時間から約3時間に短縮されました。
真実データは375件のレシートを手動でラベル付けして作成され、数ショットLLM分類器(20例)により全レシートの卵分類で99%以上の精度が達成されました。最終的なデータ品質評価では、372件のランダムサンプルで96%の正確性が確認され、偶発的なOCR幻覚は反復的なエージェントフィードバックを通じて修正されました。このパイプラインにより589件の卵レシートが確認され、合計1,972ドルの支出と8,604個の卵がカウントされました。人間によるハンズオン時間はわずか15時間(主に短い指示付与のブースト)でした。
主な課題として、フォルダ名のタイプミス(「Reciepts/Recipts」)、鏡像スキャン、およびHTMLから価格行が欠落するメールレシートが挙げられます。著者はSAM 3やPaddleOCR‑VLなどの専門モデルとコーディングエージェントの相乗効果を強調し、効果的な大規模レシート処理におけるこのハイブリッドアプローチが労働負担を劇的に削減でき、高い精度を維持しつつ、小売業や経費追跡などのより広範な応用へスケール可能であると示唆しています。

本文

公開日:2026年2月23日

誰もがやりがいのある趣味を必要としています。2001年以来、私は自分のレシート全てをスキャンしてきました。一度も金額を入力せずに画像だけを保存し続けていました。いつかテクノロジーがそれらを読み取れるようになり、そのデータが面白くなるだろうと考えていたのです。

今年、私は実際に試しました。2つのAIコーディングエージェントと11 345枚のレシート。まずは卵から始めました。25年間にわたる乱れたサーマルプリント、OCR失敗、フォルダ名のタイプミスを通じて1つの商品を追跡できれば、何でも追跡できます。

14日間。16億トークン。589枚の卵レシートが見つかりました。データはこう語っています。


プロジェクト計画(Day 1)

ではプロジェクト計画を立てましょう。

~/Records/
に大量のレシートがあります。多くは PDF / 画像などです。実際にレシートの内容を抽出して、卵にどれだけ費やしたかを見つけたいと思います。レシートは OCR が非常に苦手なので、もっと高度な処理が必要になるかもしれません。

Codex はファイルシステムを探索し、忘れていた2つの SQLite データベースを発見、PDF・メール・画像から11 345枚のレシートを抽出し、プロジェクト計画を作成しました。私は「

plan.md
に書いてください」と頼むと、1時間以内に完成しました。

全体で14日間かかりました。実際にキーボードを操作した時間は約15時間――短い指示の発信と長時間エージェントが処理を続けるというパターンでした。Codex は 15 回のインタラクティブセッション、Claude は 10 回を担当しました。


白のグラデーション

最古のレシートはフラットベッドスキャンです。1ページに複数枚、ランダムな向き、白い紙と白いスキャナ床。Codex と私はレシート境界を検出するために7つの従来の CV アプローチを試しました:

  • エッジ検出
  • 適応閾値処理
  • 輪郭解析
  • モルフォロジー演算
  • ウォータッシュ分割
  • テンプレートマッチング
  • グリッドベース分解(古典的な HackerRank 問題)

どれも機能しませんでした。根本原因はレシートが白く、スキャナ床も同じ色だったことです。「白のグラデーション問題」と呼びました。最も賢い試みは観光客をランドマーク写真から除去する手法に触発され、すべてのスキャンを重ね合わせ、各位置で中央値ピクセルを計算し差分を取ることでエッジを明らかにしました。最高 F1 は 0.302。

macOS Vision OCR(Codex が即席で書いた Swift スクリプト経由)、Tesseract、その他数多くのツールも試しましたが、フラットベッドスキャンは失われる運命だと感じ始めました。そこで Meta の SAM3 を使いました。

text="receipt"
という API 呼び出しで、境界ごとに 0.92–0.98 の信頼度を得られ、1 スキャンあたり約4秒でした。760 ページの多レシートから 1 873 枚が抽出されました。数時間かけた7つのアプローチよりも SAM3 は午後に完了しました。


待て ― あなたはすでに答えを知っている

レシートはランダムな角度で落ちるため、OCR はそれらを直立させる必要があります。Tesseract の向き検出、macOS Vision OCR、Moondream 2 と 3 を試しましたが、どれも信頼できるほどではありませんでした。そこで気づいたのは、レシートを Claude 会話に貼り付けてデバッグすると、すでにテキストが完璧に読み取られていることです ― 回転していてもフェードアウトしていても。

なぜ回転パイプラインを構築する必要があるのでしょうか? 既に会話相手のツールがそれを解決してくれるのに。そこで、11 345枚すべてを Sonnet と Codex に送信しました。時には答えが目の前にあるだけでした。


Tesseract を一晩で置き換える

プロジェクト途中で、Tesseract が弱点でした。「OAT MILK」を「OATH ILK」と読み取り、小数点を落とすなどしていました。古いサーマルプリントでは全く文字が出てこなかったです。Codex は最悪の 20 枚を手動で開き、レシートでないもの(家族写真、ポストカード、挨拶状)が「Receipts」として分類されていることに気付きました。

PaddleOCR‑VL を見つけました。0.9 B パラメータのビジョン・ランゲージモデルで Apple Silicon 上でローカル実行できます。銀行取引明細のサンプルテストでは 2.1 秒でクリーンなテキストが取得でき、Tesseract より高速ですがノイズは多いです。Fred Meyer の長いレシートを試すと「TILL YGRT」が無限に繰り返されるという問題が発生しました。

解決策は簡単でした ― 高さのあるレシートをスライスに分割すること。アスペクト比に応じて動的にスライス数を決定:

num_slices = max(2, round(aspect_ratio / 1.5))

5 本の並列シャードが一晩中走りました。GPU は 10.8 時間で 100% を占有しました。朝には 11 345 枚すべてを OCR 成功させ、アーカイブ内のテキストをクリーンにしました。

PaddleOCR‑VL は Codex の代替ではありません ― 構造化抽出や指示追従はできません。ただし、Tesseract より優れたテキスト取得ツールです。実際のパイプラインは
レシート画像 → PaddleOCR‑VL(ローカルでクリーンなテキスト)→ Codex/Claude(構造化抽出) となります。


12 時間から 3 時間へ

レシートが分割・直立・OCR された後、次に必要なのは構造化抽出 ― 卵の項目を見つけ、価格と数量を取り出すことです。最初は正規表現で始めました。モデルは正規表現が好きです。「egg」というキーワード、金額パターンで価格を探しました。ヒューリスティックは 25/25 のポジティブサンプルで偽陽性ゼロでした ― 悪いものはありませんでした。しかし、全体コーパスでは偽陰性が多く、Fred Meyer の略称「STO LRG BRUNN」、Whole Foods の省略形「EDGS」、OCR が「EGGS」を「LG EGO 12 CT」に変えるなどのケースを捕捉できませんでした。

そこで Codex に「無制限トークンを使ってください」と伝え、すべてのレシートを構造化抽出に送ることにしました。Codex はその一文から並列ワーカーアーキテクチャ―シャーディング、ヘルス管理、チェックポイント、リトライロジック――を提案しました。全体ですべてが完成します。途中で Codex のトークンが足りなくなると、自動的に Claude に切り替えて処理を継続してくれました ― それは私の指示ではなく、ログから学んだ結果でした。

実行中にクラッシュが頻発しました。長い CLI ジョブはセッションタイムアウトで終了し、スクリプトは終了時に結果を書き込むため、途中で死ぬと全て失われました。4 回目の試みで「バッチごとに新しいプロセスを起動するべきだ」と言ったら、それが解決策となりました ― 1 バッチあたり新規プロセスを起動し、ハードコール制限で終了、キャッシュから再開。Codex はそれを修正し、tmux セッションで実行し、ETA を 12 時間から 3 時間へ短縮しました。夜中に処理が止まるのを何度も経験した後に得られた、まさに「その場で気付く」解決策でした。

11 345 枚のレシートが処理されました。本来一晩かけて終わるはずだった作業が寝る前に完了しました。


自分自身の基準を上回った分類器

まずは正確なラベル(グランドトゥルース)が必要でした。Claude にキーボード主体のラベリングツールを構築させました ― 左側がレシート画像、右側が分類データ、矢印キーで移動し、1 文字入力で判定。22 分で Flask アプリ全体を作成しました。私は手動で 375 枚のレシートにラベル付けしました。

正規表現は「egg」と言及する 650 枚を見つけました。これら 375 のラベルと比較すると、88 % のリコールでした。欠損は省略コードや OCR の乱れ、短縮説明などのケースでした。「STO LRG BRUNN」はキーワード検索で捕捉できません。

解決策:手動でラベリングしたエッジケースを少数ショット例として LLM 分類器に投入。2003 年のサーマルプリントから 20 個の「卵」の例を与え、10 枚ずつバッチで呼び出し、8 本並列ワーカーで実行。2 時間で 11 345 枚が分類されました。

最終精度は 99 %+。LLM が「見逃した」ものの多くはグランドトゥルース自体に誤り(自転車店レシート、バーコードのみスキャン、卵麺など)でした。さらに QA を行い、弱い画像 497 枚を目視で確認するツール(「Space」で無卵、Xで有卵)、欠損フィールドがある 95 枚のデータ入力ツール(ナンパッド最適化、自動進行)など、4 本のツールを数分で構築しました。


品質

どれほど良いか? 372 個のランダムサンプルを手作業でチェックした結果、96 % 正確でした。主なエラーは古いスキャンの OCR が乱れたものです。1 件は幻覚 ― レシートに卵が存在しないにもかかわらず、パイプラインが偽造データを生成しました。

実際のデータはこんな風に汚れています:

  • 何年もまたり続けるフォルダ名タイプミス:「Reciepts」(2016‑2017)と「Recipts」
  • レシートが逆さまにスキャンされたケース ― Claude は OCR を文字ごとに鏡映してデコード
  • メールレシートは
    text/plain
    を優先し、価格行が HTML 部分だけにある場合を落としてしまう

品質を高めたのは、何かを検出するときにエージェントにそのパターンを見せ、全てで修正させることです。住所情報が OCR ノイズに埋もれているケース(「915 Ny 45th St」が実際は 915 NW 45th St)を示したら、40 件の欠損ロケーションレシートを回収し、すべて解決しました。


数値で見る

指標
経過時間(ウォールクロック)14 日間 (2026年2月8日〜22日)
実際の作業時間15 時間
トークン消費量16 億
推定トークンコスト$1,591
確認済み卵レシート数589
合計卵支出額$1,972
卵総数8,604

Codex と Claude はツール構築と構造化データ抽出に優れていますが、画像のセグメンテーションや OCR エンジン置き換えはできませんでした。正解は SAM3(セグメンテーション)、PaddleOCR(文字認識)、Codex/Claude(それ以外)という専門モデルのスタックです。最初にシンプルな道を試した結果、こうなるとは思っていましたが、その価値は十分でした。

これらは奇跡と驚きの日々です。30 年分の卵がどうなるか、楽しみにしています。

同じ日のほかのニュース

一覧に戻る →

2026/03/23 3:23

**PC Gamer 推奨RSSリーダー(37 MBの記事でダウンロードが止まらない場合)** - **Feedly** - クラウドベースでデバイス間同期が可能。 - カテゴリー分けやタグ付け機能が充実しています。 - **Inoreader** - 高度なフィルタリングと検索機能を備えています。 - オフライン閲覧モードもサポートします。 - **The Old Reader** - シンプルで軽量、Googleアカウント連携が可能です。 - 共有リストやコメント機能があります。 - **NewsBlur** - AIによるトピック分類と学習機能を提供。 - モバイルアプリも充実しています。 - **Reeder (macOS/iOS)** - Appleデザインに合わせた直感的なUIです。 - 多数のリーダーサービスと連携可能です。 **注意点** - 大容量の記事をダウンロードし続ける場合は、**「オフライン保存」機能**をご利用ください。 - **キャッシュクリア**や**ブラウザ拡張機能無効化**で問題が解決することもあります。 - それでも解決しない場合は、PC Gamerのサポートへ問い合わせるか、別のリーダーを試してください。

## Japanese Translation: PC Gamerの記事は、読者に通知ポップアップ、背景を暗くするニュースレターオーバーレイ、そして少なくとも5つの閉じにくいバナー広告でページを襲撃していることを示しています。ウェルカムマットを回避した後でも、その広告は記事のタイトルとサブタイトルの横に残ります。初期ページロードは37 MBです;5分以内にサイトはさらに約0.5ギガバイトの広告素材をダウンロードします。NetNewsWire、Unread、Current、Reeder など多くの RSS リーダーはこれらの侵襲的要素をフィルタリングでき、よりクリーンな閲覧体験を提供します。これはユーザーが PC Gamer サイトの煩わしさを避けるために広告なしの RSS フィードに切り替える可能性があることを示唆しており、出版社は読者の関与を維持するために過度な広告戦術を減らす圧力を受けるかもしれません。

2026/03/23 4:02

「最適化のゴールドスタンダード:ローラーコースター・タイクーンの内部を探る」

## Japanese Translation: クリス・ソーヤーの *RollerCoaster Tycoon*(1999)は、ほぼすべてのコードをアセンブリで書き、細部にわたる低レベル最適化を施したことで、滑らかなゲームプレイのベンチマークを確立しました。金額は最大想定範囲にちょうど合ったデータ型(ショップ価格は1バイト、総公園価値は4バイト)で保存されており、後にオープンソース再実装 OpenRCT2 ではこれらを統一的な8バイト変数へ移行し、現代のCPUアーキテクチャに合わせました。乗算・除算の代わりにビットシフト(`<<`/`>>`)が使用されており、コンパイラが自動で行うはずだった処理を手動で実装しています。 ゲームデザインの決定は性能制約と密接に結びついています。ソーヤーはデザイナー兼プログラマーとして、CPUフレンドリーな計算を優先する設計選択が可能でした。ゲストの移動はアトラクションへ向かう完全な経路探索ではなくランダムウォークに依存しており、多数のエージェントによる高価な計算を大幅に削減しました。パスファインディングは特定のシナリオ(例:乗物修理のメカニック、出口を探すゲスト)でのみ呼び出され、深さ制限が設けられています—デフォルトでは5つのジャンクション、条件に応じて7または8に増加し、フレームスパイクを回避します。混雑した道では同一タイルに複数のゲストが存在でき、衝突回避は完全に省かれ、近接による幸福度計算のみが影響を受けます。 OpenRCT2 はこの元のロジックをリバースエンジニアリングし、現代CPU向けに変数サイズを標準化し、パスファインダーの制限を拡張することで更新しました。これにより、レガシートリックが新しいハードウェアに適応できることが示されました。将来のアップデートでは、衝突チェックや厳密なデータサイズといった古い制約を緩和しつつ、今日のマシンで性能を損なわずにコア体験を保持することが可能です。 これらの洞察は、デザイナーとプログラマーの緊密な協働と意図的な低レベル最適化が、小規模チームでも高性能ゲームを構築できることを示しており、大手スタジオも採用すべきアプローチです。 ## Text to translate (including missing points):** Chris Sawyer’s *RollerCoaster Tycoon* (1999) set a benchmark for smooth gameplay by writing almost all of its code in Assembly and applying meticulous low‑level optimizations. Money values were stored in data types sized exactly to their maximum expected range (1‑byte for shop prices, 4‑bytes for total park value), and the original engine later shifted these to uniform 8‑byte variables in the open‑source reimplementation OpenRCT2 to match modern CPU architecture. Bit shifting (`<<`/`>>`) was used instead of multiplication/division by powers of two, a manual trick that compilers no longer perform automatically. Game‑design decisions were tightly coupled with performance constraints: Sawyer served as both designer and programmer, allowing design choices to favor CPU‑friendly calculations. Guest movement relied on random walking rather than full pathfinding toward attractions, drastically reducing expensive calculations for thousands of agents. Pathfinding was invoked only in specific scenarios (e.g., mechanics repairing rides, guests seeking exits) and had a depth limit—default 5 junctions, increased to 7 or 8 under certain conditions—to avoid frame‑spikes. Overcrowded paths allowed multiple guests on the same tile; collision avoidance was omitted entirely, with only happiness calculations affected by proximity. OpenRCT2 reverse‑engineered this original logic and modernized it—standardizing variable sizes for current CPUs and extending pathfinder limits—showing how legacy tricks can be adapted to new hardware. Future updates could relax some of these old constraints (such as collision checks or strict data sizing) without harming performance on today’s machines while still preserving the core experience. These insights underscore that close collaboration between designers and programmers, coupled with deliberate low‑level optimization, enables small teams to build high‑performance games—an approach larger studios might emulate.

2026/03/23 0:16

**バージョン管理の未来** バージョン管理は、従来型のリポジトリやブランチモデルを超えて進化しています。新たに浮上している動向としては、AI 主導の変更分析、分散したチーム間でのリアルタイム協働、および継続的デリバリー・パイプラインとの緊密な統合が挙げられます。コードベースがより大規模かつ複雑化するにつれて、これらの革新はワークフローを合理化し、マージコンフリクトを減少させ、全体的なソフトウェア品質を向上させることを約束しています。

## Japanese Translation: **Manyana** は、Conflict‑Free Replicated Data Types(CRDTs)がバージョン管理にどのように利用できるかを示すデモプロジェクトです。ユーザー体験を向上させます。 ファイルは *weave* として表現されます——1 つのデータ構造が、追加または削除された各行とメタデータを記録し、行順序を永続化し、同時挿入に対してマージ全体で一貫した順序を提供します。 CRDTs は順序非依存ですので、マージが失敗することはありません。衝突はファイルの同じ部分を編集したときだけ発生し、不透明なマージブロブではなく明確な競合マーカーが生成されます。 システムはまた、リベースが履歴を破壊せずに行えることも示しています:コミットは新しいベース上で再実行され、「プライマリー・アニサスター」注釈によって完全な祖先関係が保持されます。 チェリーピッキングとローカル Undo はまだ実装されていませんが、470 行の Python デモ(パブリックドメイン)は、CRDTs がバージョン管理における難しい UX 問題を解決し、現在のツールよりも明確な競合表示を提供できることを示しています。