OCaml Weekly News

先週号 上へ 次週号

こんにちは

2026年10月6日から13日までの週の OCaml Weekly News をお届けします。

Table of Contents

betacalendars 1.0.0 — 決定論的な日付・カレンダーユーティリティ

Beta Calendars が発表しました

betacalendars の最初の安定版リリースを発表できて嬉しいです。これはタイムゾーンに依存しない市民日付演算と決定論的なカレンダー生成のための OCaml ライブラリです。

このライブラリは、グレゴリオ暦の日付演算、設定可能な月・年グリッド、有界な繰り返しルール、日付範囲およびカレンダー境界ユーティリティを提供します。ローカルタイムゾーンに依存せず、日付のみを扱う予測可能な処理向けに設計されています。

opam でインストールできます:

opam update
opam install betacalendars

このパッケージは OCaml 4.14 および 5.5 でテストスイートと生成ドキュメントを含めてテスト済みです。フィードバックやご質問をお待ちしています。

Sedlex 3.8.1

Hhugo が発表しました

Sedlex 3.8.1 がリリースされました! 🎉

Sedlex は OCaml 向けの Unicode 対応レキサージェネレータで、もともと LexiFi の Alain Frisch によって書かれ、現在は ocaml-community の傘下でメンテナンスされています。

目玉機能は 名前付きキャプチャグループ です。サブパターンを OCaml の as 構文で束縛し、アクション内で読み返すことができます:

match%sedlex buf with
| (Plus ('0'..'9') as num), '.', (Plus ('0'..'9') as frac) ->
    let n = Sedlexing.Utf8.of_submatch num in
    let f = Sedlexing.Utf8.of_submatch frac in
    Printf.printf "integer=%s fractional=%s\n" n f
| _ -> ()

キャプチャはタグ付き DFA で実装されているため、生成されるレキサーはバックトラックなしの単一パスのままです。as を使用しないレキサーは以前と同じコードを生成します。サブマッチは最長マッチ内で左端優先の貪欲マッチです。as は Star、Plus、Opt、Rep、Compl、Sub、Intersect の下では使用できません。

このリリースには他にも以下の変更が含まれています:

  • Unicode 18.0.0 への対応
  • Latin1、UTF-8、UTF-16 における lexeme、sub_lexeme、of_submatch の高速化

リリースノートは https://github.com/ocaml-community/sedlex/releases/tag/v3.8 (未リリース)および https://github.com/ocaml-community/sedlex/releases/tag/v3.8.1 でご覧いただけます。

まもなく opam でも利用可能になる予定です。

opam 2.6.1

Kate が発表しました

皆さん、こんにちは。

opam 2.6.1 が公開されました。

このリリースでは、2.6.0 からのリグレッションを修正しています。具体的には、opam install --deps-only がリクエストされたパッケージの depexts フィールドをインストールしない問題です。

また、docker コンテナなどにおける Git リポジトリの処理が改善され、Git-for-Windows 2.56.0.windows.1(例:GitHub Actions で同梱されているもの)のバグへの回避策も追加されています。

:open_book: 詳細についてはブログ記事をご覧ください。

お試しください!

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

Unix システムの場合

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

Windows システムで PowerShell から実行する場合

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

問題があればバグトラッカーにご報告ください。

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

太字のテキストは、読みやすく素早く内容を把握できるようにする実験として散りばめています

shakuhachi v0.4.0

EruEri が発表しました

皆さん、

shakuhachi v0.4.0 のリリースを発表できて嬉しいです。

Shakuhachi は引き続き音楽コレクションマネージャーです。

このリリースでは、主な未実装の 2 つの機能が実装されました:

  • コマンドラインから float/date プロパティをクエリできるようになりました

    # 例: 過去 24 時間以内に再生された *Googoosh* の全楽曲を一覧表示
    $ skhc list %played_at:1dago..now %artist:Googoosh
    # または S 式構文で
    $ skhc list -Q "(and %played_at:1dago..now %artist:Googoosh)"
    
  • アーティストのクエリ時に複雑な統計がようやく計算されるようになりました

    # 例: アルバムが 2 枚以上あるすべてのアーティストを一覧表示
    $ skhc list -Iartist %album_count:2..
    

このリリースではより合理的なタグ付け/プロパティ書き込みもサポートされています。

  • 楽曲を追加する際、プロパティ ALBUMARTISTS(それぞれ ARTISTS)が最初に参照され、*ALBUMARTIST(それぞれ *ARTIST)にフォールバックします。
  • タグ付け時に、アーティスト名とアルバムアーティスト名の間の結合フレーズを設定する 2 つの新しいオプション -j と -J が追加されました
$ skhc tag -a "Sona Jobarteh" -j '&' -a "Youssou N'Dour" Kambengwo.flac
# ARTIST を単一の値として、ARTISTS を 2 つの値を含む値として設定します
# ARTIST = Sona Jobarteh & Youssou N'Dour
# ARTISTS = Sona Jobarteh | Youssou N'Dour

https://codeberg.org/EruEri/shakuhachi

お時間をいただきありがとうございます。 どうぞよろしくお願いいたします。

Docfd: TUI マルチライン fuzzy ドキュメントファインダー - 13.1.3 + 本格的なユーザーガイド

Darren が発表しました

皆さん、こんにちは。

Docfd 13.1.3 のリリースを発表できて嬉しいです。少し時間ができたので(大規模な組織再編でレイオフされました)、散らばっていたすべての説明を本格的な(ただし基本的な)ユーザーガイドにまとめました。Docfd の優れた部分をわかりやすく紹介できていれば幸いです。

ユーザーガイド - リポジトリ

Docfd とは

テキストファイル、PDF、DOCX などに対するインタラクティブな grep のようなものですが、正規表現や行ベースではなく単語/トークンベースなので、行をまたいだ検索が簡単にできます。

Docfd は一般的なテキストエディタや PDF ビューアとの統合によって優れた UX を提供することを目指しており、キー一つで検索結果に直接ジャンプできます。

repo.gif

よろしくお願いします。 Darren

OUPS ミートアップ 2026年10月

ancolie が発表しました

次の OUPS ミートアップは 2026年11月3日(火曜日) に開催されます。パリの 4 place Jussieu にて 午後6時30分 から始まります。会場は 45A 講堂 です。建物マップもご参照ください。

ピザの注文数を把握するため、できるだけ早く meetup で登録 してください。

詳細については OUPS のウェブサイト をご確認ください。

また、運営チームが OCaml Zulip に移行したことをお知らせします。トークを提案したい方はそちらからご連絡ください。

—

今回は以下のトークが予定されています:

FFI を多用した OCaml の WebAssembly へのコンパイル:MOPSA に関するエクスペリエンスレポート – Réda Boudrouss

大規模な OCaml アプリケーションは OCaml FFI を通じてネイティブの C/C++ ライブラリに依存することが多く、ブラウザ上での実行が困難です。既存のブラウザバックエンドは OCaml を JavaScript や WebAssembly にコンパイルしますが、ネイティブ依存関係のスタックは残したままです。

本発表では、別のアプローチを探ります:Emscripten を使用して OCaml ランタイムと完全なネイティブ依存関係スタックを WebAssembly にコンパイルし、その上でオリジナルの OCaml バイトコードを実行する方法です。FFI 呼び出しは既存の FFI コードや CamlIDL が生成したバインディングを変更せずに、静的なプリミティブテーブルを通じて解決されます。

このアプローチを LLVM/Clang、GMP、MPFR、Apron、CamlIDL を組み合わせた静的アナライザー MOPSA で実証し、完全なアプリケーションがウェブブラウザ上で直接動作できることを示します。

OCaml における集合論的型ライブラリの設計 – Mickaël Laurent

このトークでは、集合論的型のライブラリを設計するために OCaml を使用した経験を共有します。集合論的型はいくつかの再帰的なコンポーネントとレイヤーで構成されているため、定義が難しいです。さらに、再帰型に対する特定の操作の停止性は、さまざまなレベルで動作する hash-consing システムに依存しています。一部の再帰モジュールの型検査を通過させることの難しさや、hash-consing システムの実装に algebraic effects をどのように活用したかなど、OCaml を使用することの課題と利点について議論します。

—

トークの後は OCaml Software Foundation のご支援によるピザが提供され、その後はいつものように近くのパブに移動する予定です。

faker 0.1.1: faker-js とシード互換のフェイク(しかしリアルな)データ

Bartek Teodorczyk が発表しました

faker を発表できて嬉しいです。これは名前、住所、メールアドレス、電話番号、会社名、日付、金融データ、lorem ipsum などのフェイクだがリアルなデータを 77 のロケールで生成するライブラリです。

opam install faker

私が調べた限り、OCaml には faker スタイルのライブラリがありませんでした。QCheck のようなプロパティテストジェネレータはランダムな値を生成しますが、デモ、開発用データベースのシード、スナップショットテストのためのもっともらしくローカライズされたフィクスチャは生成しません。

faker は @faker-js/faker 10.6.0 のポートで、シード単位のパリティを持ちます:同じシードに対して、すべてのメソッドが faker-js と全く同じ値を返します。同じ MersenneTwister19937 ジェネレータと同じアルゴリズムを使用しているため、OCaml サービスと JS/TS サービスでフィクスチャを共有できます。

let () =
  let f = Faker.create ~seed:42 () in
  print_endline (Faker.Person.full_name f);
  print_endline (Faker.Internet.email f);
  print_endline (Faker.Location.city f);
  print_endline
    (Faker.Helpers.fake "{{person.firstName}} works as a {{person.jobTitle}}" f);
  let de = Faker.Locales.De.faker () in
  Faker.seed de 42;
  print_endline (Faker.Person.full_name de);
  let ja = Faker.Locales.Ja.faker () in
  Faker.seed ja 42;
  print_endline (Faker.Person.full_name ja)
Nikita Crist
Moises.Sipes-Effertz18@gmail.com
Lolaville
Jeannette works as a Forward Implementation Analyst
Melinda Dragu
吉川 結衣

同等の faker-js コードは同じ 6 行を出力します。

含まれる機能

  • faker-js のすべての 26 モジュール(Faker.Person、Faker.Internet、Faker.Location、Faker.Date、Faker.Finance、Faker.Commerce など)とすべての 77 ロケール。
  • API は faker-js を踏襲しているため、faker-js API リファレンスがすべてのメソッドを説明しています。faker インスタンスは常に最後の引数で、オプションはオプショナルなラベル付き引数です:`faker.number.int({ min: 1, max: 10 })` は `Faker.Number.int ~min:1 ~max:10 f` になります。
  • stdlib と unix 以外の依存関係なし。ロケールはオンデマンドでリンクされるため、英語のみのプログラムは他の 76 ロケールを持ち込みません。

パリティの検証方法

dune test は OCaml の出力を faker-js 自体を実行して生成したフィクスチャと比較します:すべてのケースで 3 つのシード、さらにすべてのロケールのすべてのメソッドのスイープ(約 72,000 チェック)。これらすべてをパスさせるには、ここで興味深いいくつかの問題を解決する必要がありました:

  • FMA 縮約。 arm64 では、OCaml コンパイラが a *. b +. c を単一の融合積和演算に縮約し、V8 と異なる丸めが行われます。このポートでは必要な箇所で明示的な乗算を使用しています。
  • 評価順序。 OCaml は関数の引数とレコードフィールドを右から左へ評価するため、すべてのランダムドローは faker-js の順序で let で束縛されています。
  • UTF-16 セマンティクス。 JS の文字列長、大文字小文字マッピング、NFKD 正規化が UTF-8 文字列上でエミュレートされ、テーブルは Node から生成されています。
  • 浮動小数点演算。 `location.nearbyGPSCoordinate` は V8 の fdlibm sin~/~cos のポートを使用しています。既知のプラットフォーム依存性の一つは指数分布器における Math.pow です:Node はシステムの libm を呼び出すため、faker-js 自体が FreeBSD で最後のビットを異なる丸めで処理します。opam-repo-ci がこれを発見し、0.1.1 がその修正です。

ポーティングノートは docs/PORTING.md にあり、残りの違いは README の "Known differences" に記載されています。

リンク

すべてのデータとアルゴリズムは faker-js に由来するため、faker-js チームとコントリビューターに深く感謝します。フィードバックやバグ報告、特に faker-js と出力が異なるケースはぜひお知らせください。

過去の CWN

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

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