OCaml Weekly News

先週号 上へ 次週号

こんにちは

2026年7月14日から21日までの週の OCaml Weekly News をお届けします。

Table of Contents

ocamlgrep 0.1.1

Nicolas Ojeda Bar が発表しました

OCaml コードを構造的に grep するツール ocamlgrep の初の公開リリースをお知らせします。

このツールは LexiFi 社内で長い間使われてきましたが、広く一般に使えるような形ではなかったため、オープンソース化を望んでいても実現できていませんでした。今回、@mjambon の尽力により、ついにそれが可能になりました。

https://github.com/LexiFi/ocamlgrep/releases/tag/0.1.1

インストール方法:

$ opam install ocamlgrep

このツールのアイデアはシンプルです。Dune プロジェクト[^1] 内でクエリを指定して呼び出すと(あらかじめ dune build @check などで .cmt~/.cmti~ アーティファクトをビルドしておく必要があります)、ソースツリー内でヒットする箇所の一覧を返します。_クエリ_ は構文上は OCaml の式であり、_穴_ __ を含むことができます。以下にいくつかの使用例を示します。

次のクエリは、アンチパターン List.rev e1 @ e2e1e2 は任意の式)を検索します。

$ ocamlgrep 'List.rev __ @ __`

このツールは OCaml の AST レベルで動作するため、同じ AST を生成する (@) (e1 |> List.rev) e2 のような形の式にもマッチします。

型制約 (e : ty) の構文はオーバーロードされており、検索対象に型条件を課すことができます。たとえば、次のクエリは第一引数が int、第二引数が string の関数呼び出しを検索します。

$ ocamlgrep '__ (__ : int) (__ : string)'

には番号を付けることができます(__1__2 など)。これにより同じ項の繰り返しを表現できます。たとえば、次のクエリは option に対するパターンマッチで Some xSome x に送る(つまり同じ値を再構築する)パターンを検索します。

$ ocamlgrep 'match __ with Some __1 -> Some __1 | None -> __'

また、float 引数に適用された多相演算子 = の使用箇所を検索することもできます。

$ ocamlgrep '(__ : float) = __'

歴史的に、このツールはコードベースの大規模リファクタリングや lint に役立ってきました。現在、そのようなリファクタリングは AI エージェントを使って行われることも多くなっています。しかし、このツールは AI エージェントが今日ではまだ少し難しいことも実現できます。たとえば、引数のひとつが特定の型である多相関数の適用箇所を検索するといったことです。これはたとえば、no-flat-float-array モードへの移行において、多相配列操作が float array の値に適用されていないかを確認する際に役立ちました。

happy grepping!

Cheers, Nicolas

[^1]: 現時点では Dune プロジェクトのみをサポートしています。他のビルドシステムへのサポート追加はそれほど難しくないはずです。issue や PR を歓迎します。

MirageOS on Unikraft

このスレッドを継続して、shym が発表しました

OCaml/Unikraft 1.2.0 がリリースされました。主な変更点は以下の通りです:

  • OCaml 5.4.1 および 5.5.0 のサポート
  • 必要な場合に Unikraft の細かい設定を使用できる仕組みの追加
  • 一部のパッケージにおけるバージョン番号スキームの変更(OCaml/Unikraft バージョンと基盤となる Unikraft バージョンを組み合わせる形式)

happy unikerneling!

ppx_deriving_melange 0.1.0 - Melange 向け eq、ord、show、map、iter deriver

Atlas07 が発表しました

皆さん、こんにちは。

Melange 対応の ppx_deriving サブセットである ppx_deriving_melange の初リリースをお知らせします: https://github.com/ahrefs/ppx_deriving_melange

なぜ作ったか

オリジナルの ppx_deriving は Melange をサポートできません。dune の Melange 統合より前に作られており、findlib META ファイルで配布されています。また、生成されたコードは Melange モードでビルドされていないランタイムライブラリに依存しています。Melange がリンクできるのは dune が Melange 向けにビルドしたライブラリのみです。そのため、フロントエンド向け OCaml を書く際には \[@@deriving eq, show\] のような一般的なパターンは使えませんでした。

ppx_deriving_melange はそのギャップを埋めます。同じ deriver、同じ命名規則とアトリビュートを、ppxlib 上で実装し Melange に対してテスト済みです。また、生成されたコードは自己完結しているため、バンドルに追加でリンクする必要はありません。

主要なユースケースは ユニバーサルコード—ネイティブと JavaScript の両方でコンパイルされるライブラリです。共有型を (modes :standard melange) のライブラリに置き、一度 derive すれば、まったく同じ equal~/~compare~/~show 関数がサーバーとブラウザの両方で動作します。(これはプロジェクト自身のテスト方法でもあります。一つのテストケースライブラリをネイティブ側では OUnit で、Melange 側では node で実行しています。)

提供機能

type user = {

  name : string;

  roles : string list;

}

[@@deriving eq, ord, show]



(* 生成されるもの:

   val equal_user : user -> user -> bool

   val compare_user : user -> user -> int

   val pp_user : Format.formatter -> user -> unit

   val show_user : user -> string *)

0.1.0 でサポートされる deriver: eqitermapordshow。ネイティブの ppx_deriving の規則に従っており、equalcompareprinter アトリビュートのオーバーライド、showwith_path オプション、タプル、レコード、(多相)バリアント、option、リスト、配列、result、型パラメータ、再帰型グループにも対応しています。各 deriver の正確なサポート範囲は README に記載されています。

特筆すべき設計上のポイントが二つあります:

  • 自己完結した生成コード。 ランタイムライブラリは存在しません。生成された関数は stdlib のみを使用するため、ppx はビルド時の依存のみとなります。
  • バンドルサイズを意識した show Melange は Stdlib.Format を大量の JavaScript にコンパイルするため、show は直接文字列を組み立て、型が必要とする場合(カスタムプリンタなど)のみ Format にフォールバックします。show のみを呼び出すコードは Format をバンドルに引き込みません。pp は完全に Format ベースであり、ネイティブ互換のままです。

未対応の部分(今後の予定)

一部の ppx_deriving deriver(enumfoldmake など)はまだ実装されておらず、一部の型形状(reflazy_tnativeint、functor 適用型)は現時点では対象外です。これらが必要な場合、またはネイティブの ppx_deriving と異なる動作を発見した場合は、ぜひ issue を開いてください。次に何を作るかはまさにそのフィードバック次第です。

使い方

opam install ppx_deriving_melange
(library

 (name my_frontend_lib)

 (modes melange)

 (preprocess

  (pps ppx_deriving_melange)))

ppx_deriving の作者たちに感謝します。このプロジェクトはその設計と動作に忠実に従っており、ライセンス表記も含めています。また、レビューと励ましをくれた davesnx にも感謝します。

フィードバック、issue、deriver のリクエストはぜひお寄せください!

hegel 0.12.1

Ethan Chou が発表しました

こんにちは!私は決定論的シミュレーションテストのスタートアップ Antithesis に勤めています。

このたび、OCaml 向けの Hegel をリリースしました。

Hegel は Hypothesis をベースにした PBT ライブラリファミリーで、様々な言語に対して強力で使いやすいプロパティベーステストを提供します。Hegel ではテストコードの中にデータ生成をインラインで宣言でき、ステートフルテストをネイティブでサポートしています。

インストール手順は Github リポジトリこちらに記載されています。ドキュメントはリポジトリの about セクションのリンクからご覧ください(まだリンクを2つ以上貼れないため申し訳ありません)。コントリビュートをお待ちしています!

以下は Hegel テストの例です:

let bad_map _ xs = xs

let%hegel_test bad_map_vs_map tc =
  let int_gen = integers () in
  let int_fn_gen = functions ~sexp_of_arg:Core.Int.sexp_of_t ~returns:int_gen () in
  let f = draw_silent tc int_fn_gen
  and xs = draw tc (lists int_gen ()) in
  require_equal
    tc
    (Core.List.sexp_of_t Core.Int.sexp_of_t)
    (bad_map f xs) (List.map f xs)

出力(ターミナルでは色付き):

--- Failure: bad_map_vs_map (examples/higher_order.ml:20) --------------
Falsified after 2 test cases (0 discarded):

xs = (0)
f 0 = 1
require_equal: values differ (- lhs / + rhs):
(0)  (1)

Exception: Failure("require_equal: values differ")
rerun with: [@@failure_blobs [ "AAQAAAABAQAKAQAAAAABAAAKAQAAAAE=" ]]

happy testing!

Bigarray.Genarray に iteration、mapping、folding を追加する小さな拡張

このスレッドを継続して、NAlec が発表しました

お知らせです。GenArrayIter として opam パッケージが利用可能になりました。PR はもちろん歓迎します。 ドキュメントはこちら

OCaml Security Team、2026年前半のレポート

Hannes Mehnert が発表しました

2026年前半を通じて、セキュリティチームはセキュリティアドバイザリの公開パイプライン(報告から連絡・修正を経て、セキュリティ脆弱性データベース—現在は osv.dev と CVE—への掲載まで)に取り組んできました。

チームのメンバーは以下の通りです:

  • Hannes Mehnert - @hannesm - 個人、robur.coop
  • Mindy Preston - @yomimono - 個人
  • Joe - @cfcs - 個人
  • Edwin Török - @edwintorok - 個人、Tarides
  • Nicolás Ojeda Bär - @nojb - LexiFi
  • Louis Roché - @Khady - ahrefs
  • Boning Dong - @bn-d - Bloomberg

脆弱性データベース

公開脆弱性データベース(https://github.com/ocaml/security-advisories%EF%BC%89%E3%81%8C%E6%95%B4%E5%82%99%E3%81%95%E3%82%8C%E3%80%81MirageOS プロジェクト等の過去のセキュリティアドバイザリも含めて充実しています。CI によるツールが「generated-osv」というブランチを生成しており、これが Google が運営するオープンソース脆弱性データベース(https://osv.dev)のソースとなっています。ocaml セキュリティチームの全セキュリティアドバイザリへの直接リンクはこちらです。

ツールは https://github.com/hannesm/advisories から利用できます。

監査ツール

上記の脆弱性データベースを使って「opam switch」にインストールされた脆弱なパッケージを確認するユーティリティも開発されました。https://github.com/hannesm/opam-audit で公開されています。

公開ミーティング

3月19日に OCaml セキュリティの公開ミーティングが開催され、10名が参加しました。ミーティングのメモは https://pad.data.coop/7-Ic5rG6ToynsW02hJsndg で公開されています。

opam-repository の変更ポリシー

セキュリティチームは不変性ポリシーをより厳格にすることを提案しました(https://github.com/ocaml/opam-repository/pull/29072 参照)。これはマージ済みです。公開された opam パッケージはそのソースを変更(tarball の変更、パッチの追加、ビルド手順の変更など)してはなりません。代わりに新しいバージョンを公開する必要があります。これにより、パッケージ URL(https://github.com/package-url/purl-spec%EF%BC%89%E3%81%8C%E6%84%8F%E5%91%B3%E3%82%92%E6%8C%81%E3%81%A1%E3%80%81%E6%AD%A3%E7%A2%BA%E3%81%AA%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%92%E6%8C%87%E3%81%97%E7%A4%BA%E3%81%9B%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99

グラント提案

2026年3月末まで貢献募集が行われました。セキュリティチームは提案の量と質に感銘を受けています。提案の評価と資金調達は現在も進行中です。予備的な決定がいくつかあり、2026年7月末までに申請者に連絡する予定です。

アドバイザリ

これまでに10件のアドバイザリ(OSEC-2026-01〜OSEC-2026-10)が公開されており、さらにいくつかが作業中です。主な連絡手段はメールであり、GitHub で受けた報告者にもメールで連絡を取っています。セキュリティアドバイザリを告知する公開メーリングリストも利用可能です。

内容は OCaml ランタイムの問題(Marshal バッファの過剰読み込み OSEC-2026-01 CVE-2026-28364、Bigarray.reshape の整数オーバーフロー OSEC-2026-04 CVE-2026-34353、Windows でのファイル名を介したコマンドインジェクション OSEC-2026-05 CVE-2026-41083)、opam サンドボックスエスケープ(OSEC-2026-03 CVE-2026-41082、OSEC-2026-10 CVE-2026-57825)、証明書プロパティの不十分な確認(tls において、OSEC-2026-06 CVE-2026-45388、OSEC-2026-07 CVE-2026-45389)、パストラバーサル(tar において、OSEC-2026-08 CVE-2026-45390)、メモリ枯渇(arp での無制限メモリ使用 OSEC-2026-02、albatross-console での無限ループ OSEC-2026-09)など多岐にわたります。

報告者が10件で8名と多様であることは素晴らしいことです。すべての報告者、そしてアップストリームの開発者の方々に感謝します。脆弱性の調整を行えたことは光栄でした。

今後の計画

セキュリティチームは OCaml プログラマーおよびプロジェクトメンテナー向けのセキュリティガイドの公開も予定しています。

謝辞

セキュリティチームは OCaml Software Foundation のイニシアチブであり、OCSF とそのスポンサーの支援に感謝しています。

Dune パッケージ管理のアップデート

このスレッドを継続して、Shon が発表しました

こんにちは!dune パッケージ管理のロードマップを dune の wiki に公開しました: https://github.com/ocaml/dune/wiki/Dune-Pkg-Roadmap

ロードマップについて

この living document は、現在の状況と進行中の作業の計画された軌跡を示し説明することを目的としています。私たちが取り組んでいることと、それが重要だと考える理由の両方を伝える助けになるはずです。技術的な詳細は多くありませんが、プロジェクトの軌跡についての高レベルな視点を提供することを目指しています。技術的な詳細については、追跡 issue をクリックしてご確認ください。様々な段階の検討状況が記されており、中にはとても詳細に発展しているものや、マイルストーン上の完了した作業の経緯が分かるものもあります。

このドキュメントは最新の状態に保ち、理解の深まりに合わせて予測を修正し、関係するステークホルダーからのフィードバックや指針を取り込むために適宜改訂されます。

dune 3.24 で dune パッケージ管理に relocatable コンパイラのサポートが利用可能になりました

ロードマップをご覧いただくとわかるように、@Alizter が主導し @ElectreAAS(および他のメンバー)がサポートした大規模な作業により、relocatable コンパイラが dune パッケージ管理でデフォルトで利用可能になりました。これは @dra27 によるさらに大規模な先行作業の上に成り立っており、最近のコンパイラバージョンに対して relocatability を提供するために David のオーバーレイコンパイラパッケージを活用しています。

個人的な経験として、これにより dune パッケージ管理でプロジェクトをセットアップする際の UX が決定的に改善され、加えて opam パッケージの互換性を向上させる多くの修正も一緒に提供されました。

嬉しいボーナスとして、dune パッケージ管理がソース内でシンボリックリンクを使用するパッケージのインストールをサポートするようになりました!

フィードバックとコントリビュート

ご意見やご質問はぜひお寄せください!このスレッドへの投稿や、フィードバックのための公式チャンネルを通じてお知らせいただけます。

opam 2.6.0~alpha1

Kate が発表しました

皆さん、こんにちは。

opam 2.6.0 の最初のアルファリリースをお知らせします。これは大規模な内部変更を要した2年間のチームの成果です。ぜひお楽しみください。

このバージョンはアルファ版です。安定版リリースに向けて、これまで気づかれなかったバグを発見するため、ユーザーの皆さんにテストをお願いします。

新機能のハイライト:

  • :money_bag: シェルフックを使用している方へ: このリリースでは PATH の管理方法が変わりました。以前は opam が常に先頭に来ていましたが、opam が管理するディレクトリをその場で置き換えることで、ユーザーが指定した順序を保つようになりました。この変更を有効にするには、このバージョンにアップグレードした後に一度 opam init --reinit -ni を実行してください(インストールスクリプトが既存の opam インストールを検出した場合は自動的に行われます)。(#6859#6815)。@gridbugs のコントリビュートに感謝します。
  • :wastebasket: build ディレクトリをできるだけ早く削除し、冗長なアーカイブキャッシュを削除することで opam のディスク使用量を削減しました。パッケージを再インストールすることで時間をかけてディスク使用量を減らすこともできますが、opam clean --all-switches を使うと一気に数 GB を解放できます。(#6440#4056#5448
  • :high_speed_train: opam.ocaml.org などの HTTP リポジトリが内部で保存される形式を変更することで、特定のファイルシステム(Windows の NTFS や IO 制約のあるマシンなど)でのパフォーマンスを大幅に改善しました。(#6625#5346#5741#5648#5484#5559#3050#6974)。
  • :envelope_with_arrow: .install ファイルに rootrootexec セクションを追加し、ルートプレフィックスからファイルをインストールできるようにしました(#6938#6919)。@WardBrian のコントリビュートに感謝します。
  • :woman_technologist: 特定のパッケージの available: フィールドを無視できる新しい --ignore-available-on 引数を追加しました(#6836#5283)。@WardBrian の再度のコントリビュートに感謝します。
  • :ocean: その他多くの UI の追加・改善、バグ修正など

:open_book: これらの変更の詳細についてはブログ記事をご覧ください。さらに詳しくはリリースノート変更履歴もご参照ください。

試してみましょう!

アップグレード手順は変わりません:

Unix システムの場合

bash -c "sh <(curl -fsSL https://opam.ocaml.org/install.sh) --version 2.6.0~alpha1"

Windows の PowerShell の場合

Invoke-Expression "& { $(Invoke-RestMethod https://opam.ocaml.org/install.ps1) } -Version 2.6.0~alpha1"

問題が発生した場合はバグトラッカーに報告してください。

Happy hacking, <> <> The opam team <> <> :camel:

このリリースを可能にしてくれた NHS Greater Glasgow の血液内科および骨髄移植ユニットに特別な感謝を <3

使いすぎた小さな型

Raphaël Proust が発表しました

一部の型が複数のユースケースを想定して設計されており、それが必ずしも良いとは限らないというテーマについて小さなブログ記事を書きました。導入部では Stdlib を小さな例として使っていますが、本当の焦点は Lwt です。

https://tech.ahrefs.com/the-little-type-that-could-too-much-3f21c2e80430

フィードバック(記事の内容や、議論している Lwt のポイントについて)はぜひお寄せください。近いうちに Lwt 周りの改善に取り組む予定ですので、ぜひご意見をお聞かせください。

過去の CWN

CWN を見逃した場合は、メッセージを送っていただければメールでお送りします。また、アーカイブRSS フィードもご覧いただけます。

毎週メールで受け取りたい場合は、caml-list を購読してください。