OCaml Weekly News

先週号 上へ 次週号

こんにちは

2026年4月7日から14日までの週の最新OCaml週刊ニュースをお届けします。

Table of Contents

発表募集: Caml in the Capital II

Sacha Ayoun が発表しました

みなさん、こんにちは :waving_hand:

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

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

日程と発表内容が決まり次第、こちらおよび専用のZulip チャンネル公式ウェブサイトにも掲載します。

発表募集

OCaml コミュニティ全体にとって興味深いトークを募集しています。 トピックの例(これらに限りません):

  • OCaml ツール(ビルドシステム、パッケージ管理、LSP、ドキュメントなど)
  • 現在取り組んでいる素晴らしいライブラリ
  • OCaml 関連の研究(専門外の人にもわかりやすく説明できるもの)
  • OCaml エコシステムの中で広く知ってほしいもの(ocaml.org、OCaml Software Foundation など)
  • OCaml の産業での利用事例
  • その他

トークを発表したい方は、タイトルと短いアブストラクトを添えて、私または @Alistair に直接メッセージをお送りください。

OCaml.org の求人ボードに OCaml ポジションを掲載しましょう

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

以下の求人を掲載させてください。

YAMLx: 純粋 OCaml 製の YAML 1.2/1.1 ライブラリ

Martin Jambon が発表しました

こんにちは、

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

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

opam install yamlx で始められます。インストール後は yamlx コマンドを使って、お気に入りの YAML ファイルが正しくパースおよび解釈されることを確認してください。

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

(* Read YAML from stdin with YAMLx, print JSON to stdout with Yojson

   This is a demo showing how to use the YAMLx library with the default
   settings. 'YAMLx.Values.one_of_yaml_exn' offers options to restrict
   the input language or to force the interpretation as YAML 1.1 instead of
   YAML 1.2.

   Compile with:
     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 チャレンジを実行して証明書と秘密鍵を生成するユニカーネル。通常は私たちのプライマリ DNS サーバーである primary-git と連携して動作します。
  • contruno: TLS リバースプロキシとして動作し、HTTP チャレンジを実行できるユニカーネル。現在 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日で純粋 OCaml 製の YAML ライブラリを作成し、その経緯を記事にしました
  • 2026年4月、私も同様のことを行い、時間をかけて完全な本番品質の YAML 1.2/1.1 ライブラリ YAMLx を作成し、こちらで発表しました

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

Vincent Balat が発表しました

Ocsigen チームは、OCaml 向けのシンプルで実用的な国際化ライブラリ ocsigen-i18n 5.0 のリリースをお知らせします。

今回のリリースにおける大きな変更点: ocsigen-i18n は Eliom との依存関係がなくなりました。これにより、あらゆる OCaml プロジェクトで使用できるようになり、必要に応じて Tyxml や Eliom 向けのオプション拡張も利用できます。

ocsigen-i18n はもともと Be Sport の @sagotch によって書かれました。このリリースは Habib の作業によって実現され、IRILL の資金提供を受けています。

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 によって2つの文字列を切り替えるオプション

コード中では、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];

(* Switching language explicitly *)
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 要素のリストを生成します:

(* Builds an HTML fragment, ready to drop into a Tyxml tree *)
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]]   (* string output *)

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]                          (* default module *)
[%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 を購読してください。