OCaml Weekly News
こんにちは
2026年6月30日から7月7日までの週の OCaml Weekly News をお届けします。
Table of Contents
opam-minver 0.2.0 — 依存関係の最小バージョンを自動的に特定する
onetimerobot が発表しました
opam-minver 0.2.0 を公開しました(以前のバージョンは一般公開されていませんでした)。このツールは二分探索を使用して、プロジェクトの opam ファイルに記載された依存関係の最小通過バージョンを見つけ出し、必要に応じて opam ファイルに直接書き出します。別のプロジェクト(まだ未公開)に取り組んでいたとき、すべての依存関係を列挙した後、どのバージョンと互換性があるのか全くわからないことに気づき、このツールを作成しました。このツールはそれを自動的に調べてくれます。
現時点でかなり洗練されており、cmdliner インターフェースを持ち、状態を json ファイルに保存するためセッションを再開できるほか、最小コンパイラバージョンを特定し、たとえばプロジェクトが初期の OCaml 5 バージョンで動作しない場合などの分割された OCaml コンパイラバージョン境界も処理します。これは新規プロジェクトだけでなく、バージョン境界が正確に決定されていない既存プロジェクトのバージョン制約を緩和するためにも使用できます。
ホームページと README はこちら: https://github.com/luminous-moose/opam-minver
Zanuda — OCaml linter 実験
このスレッドを継続して、Kakadu が発表しました
Zanuda 2.1.0 が opam-repository にマージされました
- OCaml 5.5 サポート
- lint を
[@@@zanuda "-name"]で無効化できるようになりました - ocamlfind パッケージとして表現された lint をランタイムにロードし、zanuda コードベース外で定義できるようになりました。このモジュール性は現時点では実験的です。
rpgm-decrypt — OCaml による形式検証済み RPG Maker アセット復号化ツール
LulLaS が発表しました
皆さん、こんにちは))) :slightly_smiling_face:
rpgm-decrypt を紹介します。これは RPG Maker のアセットアーカイブ(XP / VX / VX Ace の .rgssad / .rgss2a / .rgss3a、および MV / MZ の XOR 暗号化アセットと .pak アーカイブ)を復号化・展開する小さなコマンドラインツールです。
クリーンルーム再実装として始まりましたが、実際のプロジェクトで OCaml の正確性検証ツールをできる限り活用する機会になりました:
- 純粋なコア部分への Gospel 仕様(
.mli内の(*@ ... *)) - 鍵導出、リトルエンディアン読み取り、Zip-Slip パス安全性不変条件の Why3 + Z3 による演繹的証明(23/23 ゴール解決)
- ユニットテストスイートと並行した QCheck プロパティテスト(ラウンドトリップ/不変条件)
- CI でのパーサに対するカバレッジガード付き afl-fuzz(クラッシュなし)
- bisect_ppx カバレッジ + 小規模な指向性ミューテーションテストパス
dune --profile staticによる単一静的バイナリとして配布。外部依存は MZ.pakパス用のcamlzip(zlib)のみ
ネイティブ Windows OCaml スイッチと Linux の両方でビルド・テストが動作します。 Apache-2.0 ライセンス。
実行例:
$ rpgm-decrypt "MyGame" out scanned=1817 decrypted=1685 passthrough=132 skipped=0 failed=0 formats=[MV=1817]
リポジトリ、ドキュメント、Windows/Linux 用ビルド済みバイナリ:
https://github.com/rolanfreeman6-png/rpgm-decrypt
spec/proof のセットアップに関するフィードバックを特に歓迎します — Gospel + Why3 を本格的に使うのは今回が初めてなので、実際のコードでどのように構成するか、ぜひ聞かせてください。
menhirformat 0.1.0
Federico が発表しました
こんにちは、
menhirformat の最初のリリースを発表できることをうれしく思います。これは Menhir と ocamllex のソースコードをフォーマット・インデントするコマンドラインツールです。ocamlformat RPC を使用してレキサーやパーサの OCaml セクションをきれいに出力します。またコメントの元の位置をできる限り保持しようとします(ただし、この点はまだ改善が必要です)。
これは、この 2 つの OCaml 方言に LSP サポートを追加するという、進行中の大規模プロジェクト menhir-lsp の衛星プロジェクトです。フォーマット機能はもともと LSP サーバーにドキュメントフォーマットリクエストを処理するために組み込まれていましたが、この issue を受けてスタンドアロンアプリケーションとして分離しました。
opam install menhirformat でお試しいただけます。CLI は ocamlformat に大きく触発されており、フォーマットするファイルを引数として受け取ります(例: menhirformat calc.mly)。フォーマッタの動作を調整できる小さな設定を公開しています。使用可能なオプションは menhirformat --help で確認できます。
また、Menhir と ocamllex 用の dialects を設定することで、dune プロジェクトに統合することもできます:
(dialect
(name menhir)
(implementation
(extension mly)
(format
(run menhirformat %{input-file}))))
(dialect
(name ocamllex)
(implementation
(extension mll)
(format
(run menhirformat %{input-file}))))
その後 dune build @fmt を実行すると、プロジェクトの .mll ファイルと .mly ファイルがフォーマットされ、差分が表示されます。
IDE でのフォーマット保存なしには生きていけない人間として、OCaml エコシステムに Menhir と ocamllex ファイル向けのフォーマッタが存在しないことをずっと寂しく感じていました。menhirformat がその空白を埋めることを願っています。
出力の品質についてのご意見や、設定のカスタマイズポイントに関するご提案をお待ちしています。以下にコメントするか、GitHub の issue からお知らせください!
- opam ページ: https://ocaml.org/p/menhirformat/latest
- ソースコード: https://github.com/dalps/menhir-lsp/tree/main/prettyprint
お楽しみください!
Solo5 0.12.0
Hannes Mehnert が発表しました
Solo5 0.12.0 のリリースをお知らせできることを嬉しく思います。このリリースには 2 つの重要な機能があります。初めての貢献者 Michael Neumann による DragonFlyBSD nvmm 向けの新しい hvt バックエンドと、virtio ユニカーネルのソフトパワーオフ — 長年のフィーチャーリクエスト で、solo5 を Google Compute などで使用する際に大幅に改善されます。これはもともと Michael Bacarella がドラフト実装を含めてリクエストし、Romain Calascibetta が実装してマージされました。
その他の注目すべき修正として、configure.sh が C コンパイラのバージョンを確認 するようになり、GCC バージョン 9 以上または clang バージョン 10 以上が必要となりました。solo5-hvt-debug は(solo5 0.11.0 以降)厳しすぎる seccomp ルールが適用されてクラッシュしていました — Felix Solcher がissue を開き、再び Romain Calascibetta が修正してくれました。
opam-repository へのマージ待ち: https://github.com/ocaml/opam-repository/pull/30182
Landmarks 1.7
Nicolas Ojeda Bar が発表しました
コミュニティの皆さん、
OCaml 向けのシンプルなランタイムプロファイラ Landmarks の新しいリリースをお知らせします。
https://github.com/LexiFi/landmarks/releases/tag/v1.7
このリリースの主な新機能は、外部ビューアで利用できるレポートを生成するカスタムバックエンドを定義できるようになったことです。https://www.speedscope.app/ レポートを生成するバックエンドの例が新ライブラリ landmarks-speedscope に含まれています。カスタムバックエンドは landmarks 自体を変更することなく外部ライブラリで定義できます。このサポートは @mjambon によって追加されました。
ハッピープロファイリング!
よろしくお願いします、 Nicolas
Ocsigen が(今のところ)Lwt を使い続ける理由
Vincent Balat が発表しました
2025 年を通じて、Ocsigen スタック全体(ocsigenserver、Eliom、ocsigen-toolkit、ocsigen-start)を Lwt から Eio へ移行しました。移行はコンパイルが通り、テストスイートもパスしています。それでも私たちはリリースしないことを決め、今のところ Lwt に留まることにしました。その理由をまとめました。
2 つの障壁が私たちを止めました:
- 関数の色付けの喪失。 Lwt では、型中の `_ Lwt.t` により、呼び出しが中断したり I/O を行う可能性があることがわかります。Eliom のようなマルチティアフレームワークでは、これが非常に重要です。同じ共有式がサーバー上ではローカル呼び出しに、クライアント上ではネットワークラウンドトリップになる可能性があります。色付けがなければ、呼び出し元でスピナーをどこに置くべきかがわからず、リアクティブコンビネータ(
React/map_s)がそれらが純粋であるという保証をサイレントに失ってしまいます。 - Eio のハンドラモデル対ブラウザイベント。 クライアント側では、DOM イベントハンドラはスタック上に Eio ハンドラが存在しない状態でブラウザから直接呼び出されるため、`perform` が実行されるとクラッシュします。一般的な回避策(
Eio_js.start)はsetTimeout(0)を介してボディを遅延させますが、これはイベント伝播の後に実行されるためpreventDefault/stopPropagationが機能しなくなります。
これはEio への反論ではありません。エフェクトは OCaml 5 の大きな成果であり、マルチコアチームに感謝しています。モナドスタイルも実際には問題ありません(let* を使えば快適に書けます)。また、モナドが嫌いな方向けに Lwt_direct もあります。
私たちの幅広い懸念はエコシステムの統一性です。非常に大規模な Lwt コードベースが存在し、資金不足のプロジェクトはそのような移行を行う余裕がなく、分断は既に小さいコミュニティを傷つけることになります。支援のため、ciao-lwt(Lwt から Eio への移行ツール)をリリースしました。NLnet の NGI Zero Core および Tarides によって資金提供されています。Lwt 自体の改善(io_uring、エフェクト、マルチコア)を含め、私たちの障壁を取り除く方向性についてエフェクトコミュニティのご意見をぜひ聞きたいです。
詳細な記事: https://ocsigen.org/blog/posts/why-ocsigen-stays-on-lwt-for-now.html
フィードバック、アイデア、建設的な意見を歓迎します。
Dune 3.24
Shon が発表しました
Dune チームは dune 3.24.0 のリリースをお知らせできることを嬉しく思います。
主なハイライトは以下の通りです:
- Dune パッケージ管理がすべてのサポートされているコンパイラバージョンに対してデフォルトで relocatable コンパイラを使用するようになりました。これにより、ビルド済みのコンパイラバージョンを再利用できる多くのケースでワークスペースのセットアップが大幅に高速化されます。(ocaml/dune#14357、@Alizter)
- ディレクトリターゲットが一般提供になりました (ocaml/dune#14579)。これにより、ツールがディレクトリツリー全体をターゲットとして生成できるようになります。詳細は ディレクトリターゲットのドキュメント をご覧ください。
- パス処理が改善され、プラットフォーム間でのパスの一貫性が向上しました (ocaml/dune#14278 および ocaml/dune#14278)。また、
%{bin:NAME}変数展開のためのより一貫した規律ある場所を使用するようになりました (ocaml/dune#14432)。 - パス値を持つパーセント形式(
%{bin:...}、%{dep:...}、%{path:...}など)は、同一ディレクトリのパスを先頭の./付きで展開するようになりました。これにより、(bash ...)や(system ...)アクションのbashなどのシェルが、PATHで検索する代わりに直接実行するようになります (ocaml/dune#15156)。これは、パスを素朴に扱い、テストフィクスチャや他の文字列の構築に使用する前に表現を正規化することを怠っていた設定にとっては破壊的変更です。 - 非推奨の
lang coqは予定通り削除され、lang rocqに置き換えられました。詳細は ocaml/dune#12788 をご覧ください。
すべての新機能と修正、そしてそれらを可能にした貢献者への帰属については 完全な変更履歴 をご覧ください。貢献者の皆さん、ありがとうございます!
このリリースで問題が発生した場合は、issue トラッカーにご報告ください。
過去の CWN
CWN を見逃した場合は、メッセージを送っていただければメールでお送りします。また、アーカイブやRSS フィードもご覧いただけます。
毎週メールで受け取りたい場合は、caml-list を購読してください。