OCaml Weekly News

先週号 上へ 次週号

こんにちは

2026年9月22日から29日までの週の OCaml Weekly News をお届けします。

Table of Contents

elm_playground 第2リリース(初心者向けゲームエンジン)

Yoann Padioleau が発表しました

elm_playground の第2リリースをお知らせできることを嬉しく思います。これは OCaml パッケージで、画面・キーボード・マウスといったコンピュータとそのデバイスの見方を大幅に簡略化する API を使って、絵、アニメーション、さらにはビデオゲームをポータブルな方法で簡単に作成できます。このライブラリはターミナルからゲームを実行するためのネイティブバックエンドと、ブラウザでゲームを実行するための Web バックエンドを提供しています。

これは優れた Elm playground パッケージ https://github.com/evancz/elm-playground を OCaml に移植したものです。

OPAM 経由でインストールできます:

opam install elm_playground; opam install elm_playground_native.

主な変更点は、第1リリースのバグのほとんどが修正されたこと(主に Claude Code によって)、そしてネイティブバックエンドと Web バックエンドの両方がすべてのサンプルとゲームで完全に動作するようになったことです。例えば、jsoo でコンパイルされた Tetris をプレイする方法は以下の通りです:

https://aryx.github.io/ocaml-elm-playground/games/Tetris.html

以下にライブラリを使用したコードの例をいくつか示します。

まず「picture」アプリ:

(* from https://elm-lang.org/examples/picture *)
open Playground

let app =
  picture [
    rectangle brown 40. 200.
      |> move_down 80.;
    circle green 100.
      |> move_up 100.;
  ]

let main = Playground_platform.run_app app

76fc1990fe116911097764df986f64fed41c28a4_2_470x500.png

次に「animation」アプリ:

(* from https://elm-lang.org/examples/animation *)
open Playground

let view time = [
    octagon darkGray 36.
      |> move_left 100.
      |> rotate (spin 3. time);
    octagon darkGray 36.
      |> move_right 100.
      |> rotate (spin 3. time);
    rectangle red 300. 80.
      |> move_up (wave 50. 54. 2. time)
      |> rotate (zigzag (-. 2.) 2. 8. time);
  ]

let app =
  animation view

let main = Playground_platform.run_app app

e91563cbb6a0863570bbb19b057f5e8dae7164bf_2_470x500.png

そして最後に「game」アプリ:

(* from https://elm-lang.org/examples/mouse *)
open Playground

let view _computer (x, y) = [ 
  square blue 40.
   |> move x y
 ]

let update computer (x, y) =
  (x +. to_x computer.keyboard, y +. to_y computer.keyboard)

let app = 
  game view update (0., 0.)

let main = Playground_platform.run_app app

24e8ffe672cda66c6a49e02013347cda0640f771_2_470x500.png

より複雑なゲームも作れることに注意してください。例えば、簡単な Tetris アプリのスクリーンショットを以下に示します:

4ded1d55c9994935c5ec3786ae549ba3a71b8eb6.png

詳細については、https://github.com/aryx/ocaml-elm-playground の README をご覧ください。

jsoo のおかげでオンラインで試せるいくつかのクラシックなサンプルのコードもご覧ください:https://aryx.github.io/ocaml-elm-playground/games/

moonpool 0.12

Simon Cruanes が発表しました

やあ、moonpool 0.12 をリリースしました。もうすぐ近くの opam リポジトリに届くでしょう。

Moonpool(最初の発表はこちら)は OCaml 5 向けのスレッドプールライブラリで、domain を活用して複数のコアで本当に高速に動作します。moonpool のユニーク(今でも唯一?)な設計により、ユーザーは合計サイズが Domain.recommended_domain_count() を超える複数のプールを、速度低下なしに作成できます。それを実現するのは……スレッドを使うことで……です。そう。

とにかく、多数のバグ修正(#45 での病的なメモリ使用を修正するものを含む。いつものように @gasche さん :heart_hands: に感謝)、ambient-context のサポート、いくつかのクリーンアップ、テスト用の dscheck などが含まれています。

あなたとあなたのシリアルボウルに乾杯

tw 1.1.0、OCaml における Tailwind CSS

Thomas Gazagnaire が発表しました

tw 1.1.0 のリリースをお知らせできることを嬉しく思います(brew では既に利用可能で、opam にも近日公開予定)。

$ brew install samoht/tap/tw
$ opam install tw.1.1.0

tw は純粋な OCaml で実装された Tailwind CSS v4 です。これは実際に使用することをお勧めする最初のバージョンです。以前のバージョンは一部の機能しかサポートしておらず、どこで問題が起きているか不明確でした。1.1.0 リリースでは Tailwind v4 のすべてのユーティリティ、バリアント、公式プラグインをカバーし、さらに重要なことに、その出力が Tailwind のものと視覚的な差異がないことを確認する適切で機械的な方法を備えています。

tw には Tailwind CLI のドロップイン置き換えとなる CLI が付属しています。CSS エントリポイントから Tailwind プロジェクト全体をビルドし(tw -i src/app.css -o dist/app.css)、@theme、@source、@apply、カスタムユーティリティとバリアント、typography と forms プラグインをサポートします。これはすべて Node.js なし で動作します。HTML を生成する言語が何であれ、CSS で設定されたあらゆるプロジェクトで機能します。

OCaml を使っている場合は、Tw_html を通じて OCaml API を直接使用でき、独自のスタイルを持つ HTML コンポーネントを構築できます。htmlit の API を公開しますが、すべてのノードに tw クラスを付与するので、特定の HTML フラグメントを表示するためにどの CSS が必要かをクエリできます。

このリリースに至るプロセスについては私のブログ記事で詳しく読めます。issue tracker や DM でのフィードバックをお待ちしています!

Cascade: OCaml における型付き CSS ツールキット

このスレッドを続けて、Thomas Gazagnaire が発表しました

opam と Homebrew への cascade 1.2.1 のリリースをお知らせできることを嬉しく思います。このリリースは主に(多数の)バグ修正を含み、その多くはヘッドレス Chrome でスタイルシートをレンダリングしてピクセルを比較することで発見されました。

1.1.0 でビルドしたミニファイ済み CSS を配信している場合は、再生成して差異を確認してください:

$ cascade diff --diff=canonical old.css new.css

特定のページのレンダリングのピクセルレベルの差異を確認したい場合は、以下を使用できます:

$ cascade diff --browser --html page.html a.css b.css

この新しいコマンドが多数の問題の特定と修正に役立ちました。そのため、CHANGES.md には(非常に長い)修正リストがあります。

ppx_deriving_{yaml,ezjsonm,yamlx} 0.5.0

Patrick Ferris が発表しました

こんにちは!

ppx_deriving_yaml と ppx_deriving_ezjsonm バージョン 0.5.0 のリリース、および YAMLx をバックエンドとして使用する ppx_deriving_yamlx の最初のリリースをお知らせできることを嬉しく思います(@raphael-proust さんと @mjambon さんの作業とご意見をいただきありがとうございます)。3つのデライバはすべて同じコアコーデックを使用し、それぞれが特定の表現に特化しています。

このリリースには _ array 型のデライブに関するバグ修正も含まれています。これは完全に壊れていました(コードがコンパイルすらできないほど壊れていました)。

インストール

opam update
opam install ppx_deriving_yaml
opam install ppx_deriving_ezjsonm
opam install ppx_deriving_yamlx

ドキュメント

ドキュメントは ocaml.org でご覧いただけます。例えば ppx_deriving_yamlx のドキュメント。

Happy deriving :two_hump_camel:

kqueue-ml 0.5.0

このスレッドを続けて、Anurag Soni が発表しました

0.5 以降、いくつかの新しいリリースを公開しました。

  • EVFILT_USER と EVFILT_SIGNAL のサポートを追加
  • レコードのアロケートを避けるため、イベント登録のインターフェースを変更

新しいアップデートは opam で確認できます。

Windtrap: OCaml テストのためのオールインワンライブラリ

Thibaut Mattio が発表しました

こんにちは!

OCaml 向けのテストフレームワーク Windtrap のリリースをお知らせできることを嬉しく思います。このフレームワークはエコシステムのさまざまなテスト手法を1つのライブラリにまとめています:

  • ユニットテスト(Alcotest ライクな API)
  • Expect テストとスナップショットテスト(ppx_expect や ppx_inline_test と互換性のあるコンパニオン PPX があり、なしでも使用可能)
  • QCheck で見られるようなプロパティテスト(ラウンドトリップ、順序、結合則などの教科書的な法則ライブラリ付き)
  • qcheck-stm や Monolith で見られるようなステートフルテストと差分テスト(1つまたは複数のドメインで)
  • テストカバレッジ(Bisect_ppx のような)とミューテーションテスト(mutaml のような)

あらゆる種類のテストが1つのスイートと1つの出力に組み合わさり、ライブラリは OCaml 以外に 依存関係なし です(オプションの PPX は ppxlib を使用)。

以下は、ユニットテスト、教科書的な法則として述べられたプロパティ、リストに対する Stack のステートフルテストを使って標準ライブラリをテストする小さなスイートです:

open Windtrap

(* A reference for Stack: a list, its top first. *)
module Model = struct
  type t = int list ref

  let create () = ref []
  let push x m = m := x :: !m
  let length m = List.length !m

  let pop m =
    match !m with
    | [] -> raise Stack.Empty
    | x :: rest ->
        m := rest;
        x
end

let stack = abstract "s" ~pp:(fun ppf m -> Testable.pp (list int) ppf !m)

let lists =
  group "list"
    [
      test "rev reverses a list" (fun () ->
          equal (list int) [ 3; 2; 1 ] (List.rev [ 1; 2; 3 ]));
      prop "rev is an involution" (Gen.list Gen.int)
        (Law.involutive (list int) List.rev);
    ]

let stacks =
  group "stack"
    [
      stateful "behaves like a list"
        [
          command "create" (Gen.unit @-> makes stack) Model.create Stack.create;
          command "push"
            (Gen.int @-> stack ^-> returns unit)
            Model.push Stack.push;
          command "pop" (stack ^-> returns int) Model.pop Stack.pop;
          command "length" (stack ^-> returns int) Model.length Stack.length;
        ];
    ]

let () = exit (run "stdlib" [ lists; stacks ])

Windtrap は Invariant でエージェントが書いたコードをより信頼できるものにするための取り組みの一環として構築しました。エージェントはリポジトリ内で見つけたものを複製するので、強力なテストで満たされたプロジェクトにはより多くのテストが追加されます。Windtrap には適切な種類のテストへエージェントを誘導するエージェントスキルが付属していますが、人間のことも同様に重視しており、API と出力をエルゴノミックで快適にするために多くの努力を注ぎました。

詳細はアナウンス記事でお読みいただけます。サンプルスイートのウォークスルー、失敗の見た目、カバレッジとミューテーションテスト、そして Windtrap を使って OCaml 標準ライブラリをテストした実験が含まれています。

インストールするには(PR が opam-repository にマージされたら):

opam install windtrap ppx_windtrap 

マニュアル(私のガイダンスのもとエージェントが書いたもので、文章スタイルが許容範囲内であることを願っていますが、不満が多ければ手で書き直すことを検討します)には各種テストについて1ページずつ説明があります。フィードバックは大歓迎です。こちらか issue tracker にどうぞ。

Happy hacking!

—

謝辞

Windtrap はいくつかの OCaml プロジェクトのアイデアとコードを基にしています:

  • Alcotest by Thomas Gazagnaire: テスト構造とランナーの設計。
  • Craig Ferguson の Alcotest PR (#294、#247): API 設計、サブコンポーネントの差分。
  • QCheck2 by Simon Cruanes et al.: ジェネレータ設計と統合シュリンキング。
  • Monolith by François Pottier、および qcheck-stm by Jan Midtgaard et al.: 参照に対するステートフルテスト(1つまたは複数のドメインで)。
  • ppx_expect および ppx_inline_test by Jane Street: expect テストのパラダイムと dune 統合、および ppx_expect のテストコーパス。
  • Bisect_ppx by Anton Bachin et al.: カバレッジ計装とランタイム。
  • mutaml by Jan Midtgaard: PPX としての OCaml 向けミューテーションテスト。
  • mtime by Daniel Bünzli: モノトニッククロック。

Ocsigen Server 8.0.0

Vincent Balat が発表しました

こんにちは!

OCaml で書かれた Web サーバー Ocsigen Server 8.0.0 がリリースされました。実行可能ファイルとしてもライブラリとしても使用できます。主なハイライト:

  • コマンド1つ、設定ファイル不要: ocsigenserver ./public でディレクトリを配信し、ocsigenserver --reverse-proxy http://localhost:9000 でアプリの前にプロキシを置きます。圧縮とセキュリティヘッダーは既に有効です。
  • 静的ファイル が条件付きリクエスト(ETag、304)とバイト範囲に対応するようになり、動画のシーク操作やダウンロードの再開がそのまま機能します。
  • zstd 圧縮(新しい bytesrw バックエンド上で)。
  • 新しい Securityheaders 拡張。
  • 標準的なツールで読める標準 Combined Log Format のアクセスログ。
  • パブリックモジュールが改名されました(Ocsigen.Server、Ocsigen.Config、…)。新しい ocsigenserver-compat パッケージが古い名前を維持するので、既存のコードは引き続きビルドできます。

opam install ocsigenserver

Eliom および他のプロジェクトのこのバージョンと互換性のあるリリースは、数週間後に続きます。

詳細はブログ記事をご覧ください:https://ocsigen.org/blog/posts/ocsigenserver-8.0.0.html

過去の CWN

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

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