I ported JustHTML from Python to JavaScript with Codex CLI and GPT-5.2 in hours

2025/12/17 7:48

I ported JustHTML from Python to JavaScript with Codex CLI and GPT-5.2 in hours

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

要約

Japanese Translation:

Summary

著者は、大規模言語モデル(LLM)がPythonのHTMLパーサー JustHTML を迅速にポートし、完全機能かつ依存関係のないJavaScriptライブラリ simonw/justjshtml に変換できることを示しています。Codex CLI と GPT‑5.2 を約4時間使用して、LLM は 43 の Git コミットにわたり 625 k 出力トークンを生成し、html5lib‑tests スイートの 100 % カバレッジ(tokenizer 6810/6810, tree 1770/1782, serializer 230/230, encoding 82/83)を達成しました。結果として得られたリポジトリは約9,000 行の JavaScript を含み、

<html><head></head><body><p>Hello</p></body></html>
を解析し正しい DOM ツリーとテキスト「Hello」を返しエラーなし(CI で
node scripts/smoke.js
によって検証)というスモークテスト、すべてのテストを実行する GitHub Actions ワークフローを備えています。公開 API の追加としては
stream()
、CSS‑セレクタメソッド
query()
/
matches()
、および
toMarkdown()
があり、これらはすべて
src/index.js
を通じてエクスポートされています。ブラウザプレイグラウンド(
playground.html
)はソースツリーから ES モジュールをロードし、GitHub Pages で
https://simonw.github.io/justjshtml/playground.html
にホストされています。このプロジェクトは月額 $20 の ChatGPT Plus サブスクリプションで完了しました。トークンコストはそのプランに含まれていたため、追加の金銭的費用は発生しませんでした。作業全体を通じて LLM は多数のツール呼び出し(GitHub Actions CI、シェルコマンド)を行い、最小限の監督で複雑な数時間にわたるコーディングタスクが実現できることを示しました。著者は迅速な LLM 生成ライブラリポートに関する法的・倫理的問題(著作権帰属、プロダクションレディネス、エコシステムへの広範な影響)を強調し、Python JustHTML プロジェクトが数ヶ月で1,215 コミットを必要としたのに対し、LLM ポートはわずか数時間で同等のテストカバレッジを達成し、著しい効率向上を示しています。

本文

2025年12月15日

昨日は JustHTML について書きました―Emil Stenström が純粋な Python でコード・エージェントを使い、網羅的な

html5lib-tests
ライブラリに対して標準規格に準拠した新しい HTML5 パーサーを構築するプロジェクトです。
好奇心から昨夜は Codex CLI と GPT‑5.2 を使い、Python 版 JustHTML を JavaScript に最小限の手間で移植してみました。予想以上にうまく動きました。

TL;DR
私は simonw/justjshtml ― 依存関係を持たない JavaScript の HTML5 パーサーライブラリを構築しました。このライブラリは

html5lib-tests
スイートの9 200件のテストに合格し、Emil の JustHTML API デザインを模倣しています。
プロセスは最初の2回のプロンプトと数回のフォローアップで完了しました。GPT‑5.2 は数時間連続実行され、1 464 295 入力トークン(+97 122 176 キャッシュ)を消費し、625 563 出力トークン を生成、43 件のコミットに渡り 9 000 行の完全テスト済み JavaScript を作成しました。
アイデアから完成まで:約4時間――その間にクリスマスツリーを買い、家族と飾り付け、そして Knives Out を観ました。


背景

  • HTML5 仕様は不正なマークアップの扱いが詳細に定義されており、ブラウザは一貫してそのような文書を処理できるようになっています。
  • Simon Pieters の著書 “Idiosyncrasies of the HTML parser” はこれら規則を深掘りしています(第3章:「The HTML parser」)。
  • html5lib-tests
    は実装に依存しないテストスイートで、相互運用性テストのゴールドスタンダードとなっています。Servo はこのテストセットを使い、Rust の高速パーサー
    html5ever
    を構築しました。
  • Emil の JustHTML は純粋な Python 実装で完全スイートに合格します。彼は数か月かけて反復し、リポジトリには1 215件のコミットがあります。

私のプロジェクトは Codex CLI に導きられた、Python コードを JavaScript に「直線的に」移植したものです。


プロセス

cd ~/dev
git clone https://github.com/EmilStenstrom/justhtml
git clone https://github.com/html5lib/html5lib-tests
mkdir justjshtml && cd justjshtml

Codex CLI(GPT‑5.2)を

--yolo
で起動し、承認プロセスをバイパスしました。

codex --yolo

最初のプロンプト
「既存コードを調査し、JustHTML の API を模倣した新しい JavaScript ライブラリの仕様を作成してください。」
AI は

spec.md
を生成し、私は早期 “smoke test” マイルストーン(0.5)を追加しました。

マイルストーン 0.5 – エンドツーエンドスモークパース

new JustHTML("<html><head></head><body><p>Hello</p></body></html>")
  .returns a tree with the expected tag structure and text nodes.
doc.toText() → "Hello"
doc.errors is empty

コードは動作したので Codex に次を指示しました:

  1. GitHub Actions (
    test.yml
    ) を設定し、毎コミットで実行するように。
  2. コミット&プッシュ。

その時点で私のリポジトリをプライベートに初期化し、「頻繁にコミット&プッシュ」ループを走らせました。クリスマスツリーを買う間も同じです。

トークン予算
$20/月の ChatGPT Plus プランで 5 時間のウィンドウが与えられ、6:35 pm に切れました。リセット待ち(7:14 pm)後に “Keep going.” と入力しました。

9:30 pm に Codex は次の概要で完了報告:

  • html5lib-tests
    が CI で合格:トークナイザー 6810/6810、ツリー 1770/1782、シリアライザ 230/230、エンコーディング 82/83。
  • パブリック API 拡張(
    stream()
    query()/matches()
    toMarkdown()
    )。
  • セレクタ・ストリーム・マークダウン用のノー deps ユニットスクリプトを追加し CI に組み込み。
  • <br>
    <p>
    を閉じるバグ修正。

次に Codex にプレイグラウンドを追加させました:

playground.html
を作成し、
./src/...
の ES モジュールを読み込み、https://tools.simonwillison.net/justhtml と同等の機能を JavaScript ライブラリで実装してください。」

ファイルが生成され正しくロードされ、プライベートリポジトリに GitHub Pages を有効化しました。
プレイグラウンド URL: https://simonw.github.io/justjshtml/playground.html

最後に、ブラウザと Node.js での使用方法、帰属表示、ビルド詳細を網羅した README を要求しました。

総トークン数:2 089 858(入力 1 464 295 + キャッシュ 97 122 176;出力 625 563)。
$29.41/トークンで約 $61 000 に相当しますが、ChatGPT Plus の下では費用はゼロでした。


学んだこと

  • 最先端 LLM は多くのツール呼び出しと最小限の監督で複雑かつ数時間にわたるタスクを実行できます。
  • 強力なテストスイート(ここでは
    html5lib-tests
    )があれば、エージェントは自信を持って成功へ向けて反復できます ― これを “agentic loop の設計” と呼んでいます。
  • LLM を使ったオープンソースライブラリの言語間移植は非常にうまく機能します。
  • コードは安価です;検証済み動作コードは、エージェントが自己チェックできる現在、ほとんどコストを伴いません。

未解決の質問

  1. 著作権

    • このライブラリは Rust または Python のオリジナルに侵害しているのでしょうか?
    • 法的には問題ないとしても、このような方法でライブラリを生成することは倫理的でしょうか?
  2. エコシステムへの影響

    • LLM による高速移植がオープンソースコミュニティに害を与えるのでしょうか?
  3. 著作者と責任

    • ほとんどの作業が LLM により生成された場合、私はこのライブラリに対して著作権を主張できるでしょうか?
    • このようなライブラリを公開することは責任ある行為と言えるのでしょうか?
  4. 品質 vs 時間

    • エキスパートチームが数ヶ月で作成した場合、どれほど優れたものになるでしょうか?

このプロジェクトを共有するのは、LLM 主導型ソフトウェア開発の未来について議論を喚起するためです。

同じ日のほかのニュース

一覧に戻る →

2025/12/18 1:42

Gemini 3 Flash: Frontier intelligence built for speed

## Japanese Translation: > **概要:** > Google は、低コストで高速な AI モデル Gemini 3 Flash をリリースしました。これは Flash レベルのレイテンシーでプロ級の推論性能を提供します。Gemini アプリと Search の AI Mode では既にデフォルトエンジンとなり、Gemini 2.5 Flash は世界中で追加料金なしで即座に置き換えられます(Gemini 3 Pro が公開された直後)。ベンチマーク結果では、GPQA Diamond で 90.4 %、Humanity’s Last Exam(ツール無し)で 33.7 %、MMMU Pro で 81.2 %、SWE‑bench Verified で 78 % を獲得し、より大きなフロンティアモデルを上回ります。Gemini 3 Flash は Gemini 2.5 Pro より約30 %少ないトークン数で同等以上の性能を発揮します。価格は入力トークンあたり 0.50 USD、出力トークンあたり 3 USD(音声入力は 1 USD/百万トークン)です。JetBrains、Bridgewater Associates、Figma など多くの企業がこのモデルを活用し、コーディング、データ分析、設計ワークフローの高速化に役立てています。開発者は Gemini API(Google AI Studio)、Antigravity、Gemini CLI、Android Studio、Vertex AI、および Gemini Enterprise を通じて Gemini 3 Flash にアクセスできます。このモデルは Gemini アプリと Search 経由で全ユーザーへ展開されるほか、プレビュー API でも利用可能です。

2025/12/18 6:13

I got hacked: My Hetzner server started mining Monero

## Japanese Translation: ヘツナー VPS 上で Coolify をホストし、Next.js ベースの Umami アナリティクスを含む複数コンテナを実行していた。12 月 7 日に、Umami コンテナ内に Monero マイニングボット(`javae`/`xmrig`)が出現し、CPU スパイクが約 15 倍に増大した。著者はマイナーをコンテナに追跡し、CVE‑2025‑66478 ― Next.js の React Server Components “Flight” プロトコルにおける不安全なデシリアライゼーション(Puppeteer を介さずリモートコード実行が可能)を特定した。HTTP リクエストを巧妙に作成することで RCE が発動し、マイナーがインストールされた。ホストファイルシステムのチェック(`/tmp/.XIN-unix/javae`)ではエスケープは確認できず、コンテナは非 root の `nextjs` ユーザーとして実行され、特権モードやボリュームマウントも無いため、すべての悪意あるプロセスは名前空間内に留まった。 著者は侵害されたコンテナを停止・削除し、CPU 負荷を通常状態へ戻した。UFW をデフォルトで受信トラフィックを拒否するよう設定し、SSH、HTTP、および HTTPS のみ許可することで、オープンな PostgreSQL / RabbitMQ ポートを効果的に遮断した。ヘツナーは 2025‑12‑17 にネットワークスキャン検知後、アブズケース警告を送付し、著者が侵害と対策を説明するとともにチケットはクローズされた。 重要な教訓として、十分に隔離されているコンテナでも基盤フレームワークに脆弱性がある場合は突破可能であり、「Next.js を使っていない」状態が第三者ツールの依存関係によって偽りになるケースがあることを指摘した。この事例は、ファイアウォールルール、非 root ユーザー設定、特権モード無し、監視・ fail2ban の導入、およびタイムリーなパッチ適用という防御層の重要性を強調した。 ## 行動計画 - Umami を廃止する - すべてのコンテナに対してユーザー権限とマウントを監査する - SSH アクセスを強化し、アラートを設定する - セキュリティパッチを定期的に適用し、将来のインシデントを防止する ---

2025/12/18 3:15

How SQLite is tested

## Japanese Translation: > **SQLiteのテストインフラは網羅的で、コードベース全体にわたって完全な分岐カバレッジを実現しています。** > プロジェクトには約155.8 KSLOCのCソースがありますが、テストコードは92 M KSLOC以上――約590倍の量――で、すべての行が実行されることを保証しています。4つの独立したハーネスがカバレッジを提供します: > • **TCL**(27.2 KSLOC、1,390個のスクリプトファイル)で51,445件の異なるケースと数百万回の実行があります; > • **TH3**(1,055.4 KSLOC、約76.9 MBのバイナリ)で50,362件の異なるケース、完全カバレッジに必要な2.4 Mインスタンス、および約248.5 Mテストを実行するソークテストがあります; > • **SQL Logic Test (SLT)** はSQLiteとPostgreSQL、MySQL、MS SQL Server、Oracle 10gを比較し、7.2 Mクエリと1.12 GBのデータで検証します; > • **dbsqlfuzz**(libFuzzerベース)はSQLとデータベースファイルの両方を変異させ、約336個のシードファイルから16コアで1日あたり約500 Mテストを提供します。 > 追加の軽量ハーネスには `speedtest1.c`、`mptester.c`、`threadtest3.c`、`fuzzershell.c`、およびJSONBファズラ `jfuzz` が含まれます。 > 異常テストではメモリ不足、I/O障害、クラッシュ/電源損失、およびカスタムmalloc/VFSフックを使用した複合故障をシミュレートし、各障害後に整合性チェックが実行されます。 > ファズリングの歴史はAFL(2014‑2019)からOSS Fuzz(2016年以降)、その後dbsqlfuzz(2018年末)とjfuzz(2024年1月)へ進化しました。`fuzzcheck` スクリプトは毎回ビルド時に興味深いケースを再実行し、新しいバグが自動的にリグレッションテストとして生成されることを保証します。 > リソースリーク検出はTCL/TH3ハーネスに組み込まれており、メモリリーク、ファイルディスクリプタ枯渇、および不要なスレッドが自動的に監視されます。 > カバレッジは `gcov` を使用して100 %の分岐カバレッジと変異テストで達成され、マクロ(`ALWAYS`、`NEVER`、`testcase`)がMC/DCを強制し、コメント(`/*OPTIMIZATION‑IF‑TRUE/FALSE*/`)は偽陽性を防ぎます。 > 結果として、継続的に拡張される高い信頼性のテストスイートが実現し、ユーザーにSQLiteの安定性への確信を提供し、セキュリティ脆弱性から保護し、オープンソースデータベース品質保証のベンチマークとなります。

I ported JustHTML from Python to JavaScript with Codex CLI and GPT-5.2 in hours | そっか~ニュース