OCaml Weekly News

先週号 上へ 次週号

こんにちは

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

Table of Contents

発表募集: Caml in the Capital II

Sacha Ayoun が発表しました

皆さん、こんにちは :waving_hand:

前回のイベントの成功を受けて、Caml In the Capital(ロンドン開催)の第2回目を企画しています。前回の参加者からのフィードバックを踏まえ、今回はより短いトークとより多くの交流の時間を設けます 🍕

現時点では 5月14日 を予定しており、会場が確保でき次第、正式に確定します。もし私たちが把握していない重要なイベントと日程が重なる場合はお知らせください。

日程と発表内容が確定したら、こちらおよび専用の Zulip チャンネルウェブサイト にも投稿します。

発表募集

OCaml コミュニティ全体に関心を持たれるトークを募集しています。 トピックの例(これに限りません):

  • OCaml ツール(ビルドシステム、パッケージ管理、lsp、ドキュメントなど)
  • 現在開発中のライブラリの紹介
  • OCaml 関連の研究(専門外の人にもわかりやすく説明できるもの)
  • OCaml エコシステムの紹介(ocaml.org、OCaml Software Foundation など)
  • OCaml の産業利用事例
  • その他

トークをご希望の方は、タイトルと簡単なアブストラクトを添えて、私か @Alistair に直接メッセージをお送りください。

OCaml の求人を OCaml.org の求人ボードに掲載しましょう

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

以下の求人情報を掲載したいと思います。

YAMLx: pure-OCaml YAML 1.2/1.1 ライブラリ

Martin Jambon が発表しました

こんにちは、

YAML 1.2 および 1.1 標準の完全な実装である YAMLx の公開をお知らせします。これは、新しいアプリケーションでの設定ファイル形式としての利用や、他のアプリケーションの YAML ファイルの解析など、YAML のほとんどの用途をサポートすることを目的としています。

詳細については、リリースノートをご覧ください。

opam install yamlx で始めることができます。その後、yamlx コンパニオンコマンドを使って、お気に入りの YAML ファイルが正しく解析・解釈されるか確認してください。

以下は、ライブラリを使って YAML を JSON に変換する例です:

(* YAMLx で stdin から YAML を読み込み、Yojson で JSON を stdout に出力する

   これは YAMLx ライブラリをデフォルト設定で使用する方法を示すデモです。
   'YAMLx.Values.one_of_yaml_exn' には入力言語を制限したり、
   YAML 1.2 の代わりに YAML 1.1 として解釈を強制するオプションがあります。

   コンパイル:
     ocamlfind opt -o yaml-to-json \
       -package yamlx,yojson -linkpkg yaml_to_json.ml
*)

open Printf

let rec yojson_of_yamlx (x : YAMLx.value) : Yojson.Safe.t =
  match x with
  | Null _ -> `Null
  | Bool (_, x) -> `Bool x
  | Int (_, x) -> `Intlit (Int64.to_string x)
  | Float (_, x) -> `Float x
  | String (_, x) -> `String x
  | Seq (_, xs) -> `List (List.map yojson_of_yamlx xs)
  | Map (_, xs) ->
      `Assoc (List.map (fun (loc, k, v) ->
        match (k : YAMLx.value) with
        | String (_, k) -> (k, yojson_of_yamlx v)
        | _ ->
            ksprintf failwith "%s: only string keys are supported"
              (YAMLx.default_format_loc loc)
      ) xs)

let () =
  YAMLx.register_exception_printers ();
  stdin
  |> In_channel.input_all
  |> YAMLx.Values.one_of_yaml_exn
  |> yojson_of_yamlx
  |> Yojson.Safe.pretty_to_channel stdout
  |> print_newline

資金調達について

YAMLx は現在 AGPL ライセンスで公開されています。クラウドファンディングを実施中で、目標金額に達した時点で、すべての人に対してライセンスがパーミッシブな ISC ライセンスに切り替わります。一定額以上の寄付者には即座に商用ライセンスが付与されます。詳細は GitHub Sponsors プロフィール をご覧ください。

ocaml-letsencrypt:OCaml で TLS 証明書を取得する方法

Calascibetta Romain が発表しました

ocaml-letsencrypt(バージョン 2.1.0)のリリースをお知らせします。このバージョンでは、スケジューラや HTTP クライアントに依存せず単独で動作できる新しい API が導入されています。また、新たに開発した jws ライブラリを使って書き直され、yojson の代わりに jsont ライブラリを活用しています。

ocaml-letsencrypt は、DNS、HTTP、ACME-TLS の3つの方法で証明書を取得するために必要なチャレンジを実装しています。これにより、(例えば Vif で実装された)ウェブサイトのデプロイ戦略を完全に OCaml で提供できるようになります。

私たちのコープでは、以下のようなプロジェクトで利用しています:

  • dns-letsencrypt-secondary:セカンダリ DNS サーバとして動作し、特定ドメインの DNS チャレンジを実行して証明書と秘密鍵を生成する unikernel。通常、プライマリ DNS サーバである primary-git と連携して動作します。
  • contruno:TLS リバースプロキシとして動作し、HTTP チャレンジを実行できる unikernel。現在、mnet を使って完全に書き直し中です。

ウェブサイトのデプロイにお役立てください。そして、jws も OCaml エコシステム内でライブラリとしての地位を確立することを願っています!

OCaml LSP 1.26.0 と Merlin 5.7.0-504 の新リリース

PizieDust が発表しました

皆さん、こんにちは。

merlin 5.7.0-504ocaml-lsp 1.26.0 の同時リリースをお知らせします。

今回のリリースには、クラスやオブジェクト関連の各種項目に対する型エンクロージャの動作改善、シグネチャヘルプの改善、およびいくつかのバグ修正など、多くの変更が含まれています。

問題が発生した場合は、遠慮なくバグトラッカーに issue を開いてください:

OCaml YAML ライブラリ

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

2026年のアップデート:

  • 2025年12月、@avsm が AI エージェントを使って1日でpure-OCaml の YAML ライブラリを作成し、その経緯を記事にしました
  • 2026年4月、私も同様のアプローチで取り組み、完全な本番品質の 1.2/1.1 YAML ライブラリ YAMLx として仕上げました。こちらで発表しています

I18n 5.0 — あらゆる OCaml アプリを簡単に国際化

Vincent Balat が発表しました

Ocsigen チームは、OCaml 向けの小さくも実用的な国際化ライブラリ ocsigen-i18n 5.0 のリリースをお知らせします。

今回の大きな変更点:ocsigen-i18n は Eliom への依存から解放されました。これからはあらゆる OCaml プロジェクトで使用でき、必要な場合には Tyxml や Eliom 向けのオプション拡張も利用できます。

ocsigen-i18n はもともと Be Sport の @sagotch によって書かれました。今回のリリースは IRILL の資金援助を受けた Habib の作業によって実現しました。

opam install ocsigen-i18n

仕組み

翻訳はシンプルな TSV ファイル(1行1キー、1列1言語)で記述します:

foo                 This is a simple key.        Ceci est une clé toute simple.
a_human             a human                      un humain
bar                 I am {{x}}.                  Je suis {{x}}.
baz                 There {{{c?are||is an}}} apple{{{c?s||}}} here!  Il y a {{{c?des||une}}} pomme{{{c?s||}}} ici !
bu                  I am {{x %s}} ({{n %d}}).    Je suis {{x %s}} ({{n %d}}).

ミニテンプレート言語がサポートするもの:

  • {{x}} 文字列変数 x
  • {{x %d}} 指定されたフォーマット指定子を使った型付き変数
  • {{{c?yes||no}}} 二つの文字列を切り替えるオプションの真偽値 ?c

コード内では、PPX 拡張[%i18n key] を適切な呼び出しに変換します:

print_endline [%i18n foo];
print_endline [%i18n bar ~x:[%i18n a_human]];
print_endline [%i18n baz ~c:(nb > 1)];
print_endline [%i18n bu ~x:"Jean-Michel" ~n:42];

(* 言語を明示的に切り替える *)
print_endline [%i18n foo ~lang:My_i18n.Fr];

現在の言語はミュータブルな参照に保持されており、切り替えることができます(セッション/タブごとの言語が必要な場合は Eliom スコープ付き参照に置き換えることも可能です)。

Dune との統合

このツールは Dune に非常に自然に組み込めます。TSV ファイルから OCaml モジュールを生成するルール:

(rule
 (target example_i18n.ml)
 (deps example_i18n.tsv)
 (action
  (run %{bin:ocsigen-i18n} --languages en,fr --input-file %{deps}
                           --output-file %{target})))

ライブラリ/実行ファイルに PPX を設定:

(preprocess (pps ocsigen-i18n -- --default-module Example_i18n))

純粋な OCaml プロジェクトにはこれだけで十分です。

Tyxml サポート

ジェネレータに --tyxml を渡すと、同じ [%i18n key] 式が文字列の代わりに Tyxml HTML 要素のリストを生成します:

(* HTML フラグメントを構築し、Tyxml ツリーに直接挿入できる *)
let greeting = [%i18n bar ~x:[%i18n a_human]]

変数自体も HTML ノードのリストにできるので、翻訳テキストとマークアップを自然に混在させることができます:

[%i18n bar ~x:[ txt "Jean-Michel ("
              ; txt (string_of_int id)
              ; txt ")" ]]

Tyxml モードで(属性などに)プレーンな文字列が必要な場合は、S. をプレフィックスとして付けるだけです:

[%i18n S.bar ~x:[%i18n S.a_human]]   (* 文字列出力 *)

Eliom サポート

クライアント・サーバー型の Eliom アプリの場合は --eliom を渡します。ジェネレータは .eliom ファイルを生成し(同じ翻訳が両側で利用可能になる)、--tyxml を暗示し、言語型に [@@deriving json] を追加してワイヤ越しにシリアライズできるようにします:

(rule
 (target example_i18n.eliom)
 (deps example_i18n.tsv)
 (action
  (run %{bin:ocsigen-i18n} --eliom --languages en,fr --input-file %{deps}
                           --output-file %{target})))

複数の TSV ファイル

翻訳を複数のファイルに分割できます。PPX はモジュールパスを使って適切なファイルを見つけます:

[%i18n foo]                          (* デフォルトモジュール *)
[%i18n MyI18n.foo]                   (* MyI18n.foo *)
[%i18n MyI18n.S.bar ~x:[%i18n S.foo]]

オプションの --prefix / --suffix フラグを使うと、呼び出し箇所を簡潔に保てます([%i18n Feature.foo]Pr_Feature_i18n.foo ())。

翻訳作業をお楽しみください!

ATD 4.1.0 - YAML サポートが追加されました

Martin Jambon が発表しました

ATD は、YAML ファイルやその他のフォーマットからデータを簡単に読み込むための OCaml サポートを追加しました。具体的には以下の通りです:

  1. 設定データの型を定義します。
  2. atdml --mode jsonlike app_config.atd で、ソース位置情報を含む JSON ライクな AST を設定データ構造に変換する OCaml コードが生成されます。
  3. プログラムが YAML ファイルを読み込み、JSON ライクなツリーに変換し、生成された関数を呼び出して OCaml データ構造に変換します。
  4. 設定が不正または不完全な場合、アプリケーションは有用なエラーメッセージを表示します。

サンプルがディストリビューションに含まれています。最近リリースされた YAMLx ライブラリを使用しています。

YAMLx はこれまでの作業に資金を提供し、パーミッシブな ISC ライセンスをすべての人に開放するために、寛大なスポンサーを必要としています。または、アプリケーションのソースコードをユーザーと共有することに問題がなければ、AGPL ライセンスの条件を受け入れることもできます。

ソース位置情報が利用可能であれば、他の入力ファイルフォーマットや他の YAML ライブラリも最小限の労力で同様に使用できます。そのためには、AST を JSON ライクな AST に変換するブリッジが必要です。

過去の CWN

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

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