OCaml Weekly News
こんにちは
2026年8月25日から9月1日までの週の OCaml Weekly News をお届けします。
Table of Contents
- Unhandled: OCaml 5 における未処理エフェクトの静的チェッカーと、ある否定的な結果について
- mirage-crypto* リリースシリーズについて
- Rpmfile 1.0.0 と Bytream 0.2
- oxbow: Wayland コンポジター River 向けの動的タイリングウィンドウマネージャー
- cdp 0.1.0 - OCaml 向けの型付き Chrome DevTools Protocol ライブラリ
- Hardcaml ネットワーキングライブラリ - おもちゃプロジェクト
- FUN OCaml 2027 バンガロール開催(1月25〜26日)- トークとワークショップの提案を9月30日まで受付中
- ease-caml - OCaml 向けのイージングライブラリ
- opam 2.6.0~alpha1
- 過去の CWN
Unhandled: OCaml 5 における未処理エフェクトの静的チェッカーと、ある否定的な結果について
Manish Paul が発表しました
OCaml 5 のエフェクトハンドラーは型付けされていません。コンパイラは、実行されたエフェクトが処理されているかどうかを検査しないため、ハンドラーが欠けていてもクリーンにコンパイルされ、実行時に Effect.Unhandled で失敗します。私たちはそのための静的チェッカーを構築してきており、特に最も弱いと思われる部分についてご意見をいただきたいと考えています。
何をするのか。 コンパイラ自身の .cmt ファイルを読み込み、関数ごとのエフェクトセットを推論し、コールグラフの不動点伝播によって伝搬させ、ハンドラーサイトで処理されたエフェクトを差し引き、プログラムのエントリーポイントまで未処理のまま到達できる perform をすべて報告します。発見された問題には、エントリーから perform までの責任パスと、生成された witness プログラムが付属します。witness プログラムを合成し、コンパイルして実行し、エフェクトが実際に外部境界に到達した場合にのみ、その発見を確認済みとして報告します。
どのようにテストされているか。 ランタイムをオラクルとした差分テスト:ジェネレーターがプログラムを生成し、チェッカーの予測と実際にコンパイルされたプログラムを実行した結果を比較します。1000 個の生成プログラムにわたって、偽陰性は 0 件です。分岐のないプログラム:600 件、偽陽性なし。分岐のあるプログラム:400 件、5.3% の偽陽性(条件分岐の両腕を結合することによる)。witness は意図的にクラッシュメッセージをパースしません。5.4 でテストプログラムのうち 2 つについてエフェクトのペイロードが表示されなくなりましたが、何も壊れなかったため、これは便利でした。
否定的な結果(この投稿の理由)。 チェッカーが実際に発生したクラッシュを検出することを示したかったため、ドキュメント化された Effect.Unhandled 問題を修正したコミットのコーパスを構築し、各親コミットを分析しました。6 件中 0 件しか検出できませんでした。原因は、バグが存在するモジュールが私たちの環境でコンパイルされなかったため、アナライザーにそのコードが渡されなかったことです。バッチランナーは、まさにこの理由から「スコープ外」と「見逃し」を別々に報告するようになりました。
次に、eio、eio_main、picos、domainslib、riot、moonpool、miou に依存するすべての opam パッケージにわたって実行しました。dev-repo で重複を除去した後、85 のリポジトリが対象となりました。そのうち 38 がビルドを十分に完了して分析でき、合計 3,881 モジュールが対象となりました。ツールは 31 件のエスケープを報告しましたが、そのすべてが私たち自身の偽陽性でした。 4 つの原因があり、それぞれ指摘したコードを読んで判明しました:
- 私たちは「
Eio.以下の何かを呼び出す」を「Eio ランタイムを必要とする」としてモデル化しました。コンストラクターや vtable ビルダーでは誤りです:Eio.Flow.Pi.source、Eio.Stream.create、Eio.Condition.create、Eio.Buf_read.parse_string_exn。 - そのクライアント使用モデルを eio 自身のソースに適用しましたが、これはカテゴリーエラーです。eio は Eio ランタイムを必要とせずに自身を定義できます。
- アプリケーション演算子を透過的に処理しませんでした。
let@ env = Eio_main.run in bodyは( let@ ) Eio_main.run (fun env -> body)であり、演算子が不透明だとそのアプリケーションの先頭がEio_main.runでないため、スケジューラー境界が消え、プログラム全体がランタイムなしで実行されているように見えました。修正方法は、値の説明から%applyと%revapplyを読み込むことで、@@、|>、およびプロジェクト自身が定義する演算子もカバーできます。 例外を名前で指定している場合にのみ
Effect.Unhandledガードを認識していました。picos はキャッチオールとして書いており、その理由も示しています:| exception _exn -> (* This should only happen when not running under a scheduler. However, we don't match on a specific exception, because it depends on the OCaml version. *)私たちも同じ観察を独立して記録しており、その後 5.4 でエフェクトのペイロードが表示されなくなるのを目撃しました。これは同じ問題の反対側からのものです。
原因 1 と 2 は修正され、双方向でリグレッションテスト済みです。原因 3 と 4 は診断済みですが未修正です:修正の試みがテストスイートを壊したため、赤いままリリースするのを避けるためにリバートし、docs/LIMITATIONS.md に問題を起こした forester と picos のソースとともに記録しました。25 件のエスケープが修正され、6 件が残って説明済みです。
このツールがサードパーティーのコードで報告したすべてのエスケープは、私たち自身の偽陽性でした。誰かのコードで実際のバグを発見したことはありません。 これを明言することが重要だと考えています。
もし教訓があるとすれば、おそらくこれです:実際のコードに初めて向けたチェッカーは、主にチェッカー自身を測定しており、違いを判断するための唯一の方法は、指摘したソースを読むことです。
ご批評をいただきたい点。
ライブラリコントラクトの出力はあなたにとって有用ですか?picos に対しては以下を生成します:
module Picos Picos.Trigger.await may perform {Picos.Trigger.Await} Picos.Fiber.current may perform {Picos.Fiber.Current} Picos.Fiber.spawn may perform {Picos.Fiber.Spawn} Picos.Fiber.yield may perform {Picos.Fiber.Yield} Picos.Fiber.Maybe.to_fiber_or_current may perform {Picos.Fiber.Current} Picos.Fiber.Maybe.or_current may perform {Picos.Fiber.Current} Picos.Fiber.Maybe.current_if may perform {Picos.Fiber.Current} Picos.Fiber.Maybe.current_and_check_if may perform {Picos.Fiber.Current, ...unknown} module Picos_std_event__Event Picos_std_event__Event.sync may perform {Picos.Trigger.Await, ...unknown} Picos_std_event__Event.select may perform {Picos.Trigger.Await, ...unknown} module Picos_std_structured__Run Picos_std_structured__Run.spawn may perform {Picos.Fiber.Spawn, ...unknown}セット内の
...unknownは、その関数において.cmtがないものを呼び出しているためコントラクトが不完全であることを意味します。きれいなセットに丸めて見せるよりも、それを示す方が望ましいと考えています。「このライブラリが呼び出し元に処理を求めること」の機械チェック済みの記述が README や CI に含まれる価値はあるでしょうか?
- 私たちが見落としている形は何ですか?
effc分岐ボディ内で実行されるエフェクト、動的に構築されたハンドラーレコード、データ構造を通じてコールサイトに到達するクロージャー(0-CFA はまだなし)については把握しています。把握していないものを教えていただきたいです。 - スケジューラーモデル(つまり、どのエントリーポイントがどのファミリーのエフェクトのハンドラーをインストールするか)はデータであって分析ではなく、
models/schedulers.confに記載されています。eio のエントリーは特定の行に引用されています。riot、moonpool、miou のエントリーは推測であり、そのようにラベル付けされています。修正を大歓迎します。 - 実際に本番環境で
Effect.Unhandledクラッシュに遭遇したことがある方はいますか?実際の例が不足しており、「発生したが原因はあなたの設計では見えないものだった」という情報も含め、どんな手がかりでも歓迎します。
OCaml 5.3 以降が必要です。Texp_match のエフェクトケースリストが 5.3 で初めて拡張されているためです。CI は 5.3 と 5.4 で実行されます。
リポジトリ:https://github.com/manishpaulish/unhandled
アプローチが間違っていると言っていただいて構いません。
mirage-crypto* リリースシリーズについて
Hannes Mehnert が発表しました
皆さんへ、
mirage-crypto* バージョン 2.4.1(https://github.com/ocaml/opam-repository/pull/30568%EF%BC%89%E3%82%92%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E3%81%A7%E3%81%8D%E3%82%8B%E3%81%93%E3%81%A8%E3%82%92%E5%96%9C%E3%82%93%E3%81%A7%E3%81%8A%E7%9F%A5%E3%82%89%E3%81%9B%E3%81%97%E3%81%BE%E3%81%99%E3%80%827%E6%9C%88%E4%B8%8B%E6%97%AC%E3%81%AE 2.2.0 以来、一連のリリースが続いています。その背景には、いくつかの方が LLM を使って実装の問題点を発見し、私たちがそれを修正しているという経緯があります。今後もさらにリリースが続く可能性があります。各月のリリース数を制限するよう努めています。このパッケージのメンテナーである私も、できることの限界(時間的な意味で)に近づいています。このソフトウェアをお使いの方は、https://robur.coop/#contact または GitHub Sponsors 経由での寄付をご検討ください。さらに嬉しいのは、コードを読んで、プルリクエストが来たときにレビューし、コードのクリーンアップに貢献していただくことです(LLM が生成した改善案をそのまま提出するのではなく、慎重にレビューした上でお送りください)。特に、今や誰もがレッドチームにいる状況ですから。
mirage-crypto のパフォーマンスはチェックの追加により若干低下しましたが、私が使用するハードウェアで観測する限りわずかな差です。独自のベンチマーク(bench/speed.ml が利用可能)を実施し、改善案を提案していただければ幸いです。
変更内容は修正とクリーンアップから公開されたアドバイザリーまで多岐にわたります。明確な境界が常にあるわけではありません。完全なリストは CHANGES ファイルまたはコミット履歴で確認できます。全員が最新リリースに更新し、以前のリリースは使用しないことを強くお勧めします。前述のとおりいくつかのアドバイザリーが公開されており、他の修正についてはアドバイザリーが不要と判断していますが(ただし、他の実装が同様の修正に対してアドバイザリーを発行する場合もあるため、ご注意ください)、特定の修正が重要だと思われる場合は ocaml/security-advisories への PR を提出することもできます。
修正の詳細は以下のとおりです。Eric Ebinger、Thomas Gazagnaire、Anil Madhavapeddy による報告に感謝します。また、mirage-crypto のレビュー、マージ、リリースに時間を割くことを可能にしてくれた Tarides にも感謝します。
mirage-crypto-ec
- NIST ルックアップテーブルに対するタイミング攻撃 https://osv.dev/vulnerability/OSEC-2026-17 https://github.com/mirage/mirage-crypto/commit/1a61aeee7f593ec067612df1739ec905eab0450f
- blinding の使用 https://github.com/mirage/mirage-crypto/pull/285
- 無限遠点を ECDSA 鍵として受け付けないようにした https://osv.dev/vulnerability/OSEC-2026-13 https://github.com/mirage/mirage-crypto/commit/ca84f5ee8ede80bd1dd2aa4cd7cc90197752184e
- ED25519 の scalar_mult から早期リターン https://github.com/mirage/mirage-crypto/commit/3b4ba91799700561509d0c6a2de81ed249d7b2b1
- X25519 の定数時間比較 https://github.com/mirage/mirage-crypto/commit/1aa4cf5e4c92dcb3edfa83b971e569fa05b8f47d
- 圧縮点 0 の正しいエンコード https://github.com/mirage/mirage-crypto/commit/94cba54d8dbb5701c3bd7e1317b3f3987c1871e2
mirage-crypto
- AEAD タグの検証後にのみ復号を行う https://osv.dev/vulnerability/OSEC-2026-12 https://github.com/mirage/mirage-crypto/commit/25e7570aec91e092b347561c23f84b6ec39e7163
- 境界チェックの追加 https://github.com/mirage/mirage-crypto/pull/281 https://github.com/mirage/mirage-crypto/pull/290 https://github.com/mirage/mirage-crypto/commit/1f0bf67044e67cf6e46911fcd77a0ff706b6c3e7 https://osv.dev/vulnerability/OSEC-2026-15 https://github.com/mirage/mirage-crypto/commit/7b5650b72314d65602d0baccbf83ad3013cb37d4
- アンアラインドアクセスの回避 https://github.com/mirage/mirage-crypto/pull/292
- 不正な ChaCha20 鍵を拒否する https://github.com/mirage/mirage-crypto/commit/7f505b0dc232805c0c725e99b5fbfa49b1be7c7e
- adata がアラインされている場合のパディング回避 https://github.com/mirage/mirage-crypto/commit/999cac90f0de1e4b36451807c0e0dbee6edfde06
- 長すぎる CCM メッセージの回避 https://github.com/mirage/mirage-crypto/pull/304
- AEAD 暗号のカウンターラップアラウンド回避 https://github.com/mirage/mirage-crypto/pull/305 https://github.com/mirage/mirage-crypto/pull/306 https://github.com/mirage/mirage-crypto/pull/304
mirage-crypto-rng
- エントロピー収集テストが mirage-crypto-mkernel および mirage-crypto-rng-mirage の初期化時に実行されるようになった https://github.com/mirage/mirage-crypto/pull/282
- エントロピーソース ID の修正 https://github.com/mirage/mirage-crypto/commit/86161d1f51fd748038d917a69490eba714bb60d5
- urandom RNG のフォーク後に乱数が繰り返されないようにした https://github.com/mirage/mirage-crypto/pull/302
- RDSEED の適切な検出 https://github.com/mirage/mirage-crypto/commit/0f858a9e165c004e716761385284aadc119b7006
mirage-crypto-pk
- DSA のゼロ除算回避 https://github.com/mirage/mirage-crypto/pull/289
- RSA でメッセージが 2 の場合の Invalid_argument 回避 https://osv.dev/vulnerability/OSEC-2026-14 https://github.com/mirage/mirage-crypto/commit/a0f59a0c90eb067505b55a03d3bb104eacd6dd33
- ハードコードされた DH グループの修正 https://github.com/mirage/mirage-crypto/pull/297
- セパレーターなしの OAEP デコードの修正 https://github.com/mirage/mirage-crypto/commit/eca6fb33e44bfa374d4c625fa6295670efe7040b
Rpmfile 1.0.0 と Bytream 0.2
Mikhail が発表しました
どうも!
Rpmfile ライブラリ(RPM ファイルのパース用)の初のメジャーリリースと、Bytream ライブラリ(バイトのストリーミングと処理を行う最後のライブラリ)のマイナーアップデートを発表できることをうれしく思います。
let () =
let metadata =
In_channel.with_open_bin
"hello.rpm"
Rpmfile.Reader.from_channel_without_payload
in
let name, release = Rpmfile.View.(name metadata, release metadata) in
Printf.printf "%s.%s\n" name release
(* hello.1.3 *)
変更点
- Rpmfile のリーダーが Angstrom ライブラリから Bytream ライブラリに移行しました。このバージョンの最大の変更点は、入出力ストリームから RPM ファイルを読み込むために Bytream ライブラリを使い始めたことです。
- CPIO アーカイブリーダーを追加しました(RPM ファイルのペイロードを自動的に解凍しないため、自分で行う必要があります)
未実装の機能
- 署名の検証
- ペイロードの解凍
- ダイジェスト
oxbow: Wayland コンポジター River 向けの動的タイリングウィンドウマネージャー
Cole が発表しました
こんにちは!
ここ数ヶ月間取り組んできたプロジェクト oxbow を共有できることをうれしく思います。
dwm を使っていた頃に大きく影響を受けており、Hyprland や Niri などの他のウィンドウマネージャーからもいくつかアイデアを取り入れています。主な機能は以下の通りです:
- タグごとの設定(レイアウト、mfact、ギャップなど)
- even、diminish、dwindle、spiral、deck、monocle を含むタイリングレイアウト
- 4 方向へのスクロール(Niri 風)
- "alt-tab" 風のオーバービュー
- 純粋なフローティングレイアウト。oxbow はウィンドウのネイティブなドラッグとリサイズリクエストを尊重し、フローティングモードをより自然に感じさせます
- スクラッチパッド、スティッキーウィンドウ、ウィンドウスワロー、ギャップなど、dwm の人気パッチ
- タグ、出力、サイズ、位置などの初期設定を行う正規表現ベースのウィンドウルール
oxctlを介した IPC 制御で、上記すべての設定、状態の照会、イベントのサブスクライブが可能
oxbow は opam でパッケージ化されていますが、Nix/NixOS でもインストールできます。
これが私の初投稿であることにお気づきかもしれません。このプロジェクトが OCaml への初めての挑戦だからです!自分がずっと欲しかったウィンドウマネージャーを作るために oxbow を書き、同時に OCaml を学びました。とても楽しい体験で、他のいくつかのプロジェクトでも OCaml を使っていく予定です。OCaml の強みを活かすよう最善を尽くしましたが、oxbow の内部や他の側面を改善するための提案、PR 等を大歓迎します。
よろしくお願いします!
cdp 0.1.0 - OCaml 向けの型付き Chrome DevTools Protocol ライブラリ
Archive: https://discuss.ocaml.org/t/ann-cdp-0-1-0-typed-chrome-devtools-protocol-libraries-for-ocaml/18486/1
Atlas07 が発表しました
皆さんこんにちは、
ocaml-cdp の初リリースを発表できることをうれしく思います。これは Chrome DevTools Protocol 向けの型付き OCaml ライブラリです。
なぜ作ったのか
CDP を使うと、プログラムが実際の Chrome を制御できます:ページを開く、JavaScript を実行する、スクリーンショットを撮る、PDF をレンダリングする、ネットワークトラフィックを監視するといったことが可能です。
OCaml には CDP ライブラリがありませんでした。ocaml-cdp はそのギャップを埋めます。公式のプロトコル定義を型付き OCaml モジュールに変換することで、コンパイラがすべてのコマンド、イベント、フィールドをチェックします。
提供するもの
3 つのパッケージ:
| パッケージ | 場所 | 内容 |
|---|---|---|
cdp |
opam | 型付きプロトコルドメイン:レコード、enum、コマンド、イベント(JSON コーデック付き)。トランスポート非依存。 |
cdp-gen |
opam | ジェネレーター CLI:プロトコル JSON を入力として OCaml を出力。任意のリビジョン、独自のドメイン選択が可能。 |
cdp-lwt |
現時点では GitHub のみ(後述) | クライアント:Chrome を起動またはアタッチし、libcurl WebSocket で制御。 |
cdp は 10 のドメイン(Browser、DOM、Debugger、Emulation、IO、Network、Page、Runtime、Security、Target)を提供し、ジェネレーターは全 58 ドメインをカバーします。
以下はフルラウンドトリップの例です:ヘッドレス Chrome を起動し、ページを開き、タイトルを読み取ります:
let%lwt chrome = Cdp_lwt.Chrome.launch () in
let%lwt transport = Cdp_lwt.Curl_transport.connect ~url:chrome.ws_url () in
let connection = Cdp_lwt.Connection.create transport in
let call ?session command = Cdp_lwt.Connection.call connection ?session command in
let%lwt created =
call (Cdp.Target.Create_target.command (Cdp.Target.Create_target.make_params ~url:"about:blank" ()))
in
let%lwt attached =
call (Cdp.Target.Attach_to_target.command
(Cdp.Target.Attach_to_target.make_params ~target_id:created.target_id ~flatten:true ()))
in
let session = attached.session_id in
let%lwt () = call ~session (Cdp.Page.Enable.command (Cdp.Page.Enable.make_params ())) in
let loaded = Cdp_lwt.Connection.next_event connection ~session Cdp.Page.Load_event_fired.event in
let%lwt _nav =
call ~session (Cdp.Page.Navigate.command
(Cdp.Page.Navigate.make_params ~url:"https://ocaml.org" ()))
in
let%lwt _fired = loaded in
let%lwt evaluated =
call ~session (Cdp.Runtime.Evaluate.command (Cdp.Runtime.Evaluate.make_params ~expression:"document.title" ()))
in
cdp-lwt がまだ opam にない理由
cdp-lwt は curl バインディングを通じて libcurl の WebSocket API を使用しています。この API は ocurl の master ブランチにありますが、ocurl のリリースにはまだ含まれていません。cdp-lwt はクローンからは問題なくビルドできます(opam ファイルが ocurl の master を pin しています)。ocurl がリリースされ次第、cdp-lwt も opam に追加される予定です。
Hardcaml ネットワーキングライブラリ - おもちゃプロジェクト
Bohdan Purtell が発表しました
General Kenobi
ごあいさつ。
私は Bo Purtell と申します。フロリダ大学のシニアを目指している学生です。
この1年間取り組んできた小さなプロジェクトを共有したいと思います。OCaml を使ったハードウェア開発のための hardcaml エコシステム向けの小さなネットワーキングスタックです!プロジェクトはまだ初期段階ですが、非常に緩やかな IPv4 と UDP サポートを持つ 10/100Mb の全二重インターフェースを検証済みで、現在 10G アプリケーション向けの 64/66b BASE-R エンコーディングの PCS レイヤーを仕上げているところです。サーバーがカリフォルニアからフロリダに移送されてしまい、移送中に1台のリグレッションマシンを失ったため、docker の作業に再び取り組まなければならなくなりましたが、少し制限があります。
すべては数学だ
OCaml で得られた素晴らしい抽象化のレベルを経験した今、SystemVerilog を同じように書き続けることはできないと思います。OCaml における「状態」の表現方法や、OCaml の構造を説明する際に数学的な用語に手を伸ばせるという事実が、これらのシステムを構築しながら推論する上で非常に役立ちました。ある程度の検証にも役立ちます。
課題
最大の課題は、検証スイートとテストの構造化でした。floating している hardcaml プロジェクトはいくつかありますが、expect テストフレームワークとの統合は、そのような例が再利用可能なアーキテクチャや統合テストのデモとして貧弱であるため、少し難しかったです。Alcotest がより大きな統合スイートに使えるかと思いましたが、その哲学が標準的な expect テストの目的と相容れないと感じました。結局、expect テストと tuareg はよく合うため、Neovim から Emacs に移行しました。ターミナルから S 式を何度も貼り付ける作業を続けていたらおそらく爆発していたでしょう。この変更は確かに興味深いですが、設定可能性と OCaml サポートの観点からは十分に価値があります。
Quickcheck テストも非常に便利でしたが、適切な規模のプロジェクトの例がほとんどないため、完全に手探りでした。Observation.t と Snapshot.t の形成を通じて、私が慣れ親しんだ UVM ベースのイディオムの多くが多少うまく対応することがわかりましたが、実際のプロダクショングレードの hardcaml 検証がどのようなものかを見てみたいです。形式検証のバグにしっかり捕まっているため、形式検証の例もあれば良かったのですが、デッドブランチでの試行錯誤しかできませんでした。
宇宙へ!
関数型言語が業界で使われることは決してない、というのは本当に残念なことです。それを踏まえて、春と夏のダブルインターンシップを終えて、Hardcaml の 0 ではない量が宇宙を飛んでいると言えます! ご質問があれば、こちらか LinkedIn でメッセージをお送りください!
PS: hardcaml ベースの適切な検証に詳しい方で、expect システムで統合テストがどのように機能するかについて少しお話いただけませんか?巨大な 300 行の S 式を expected フィールドに放り込むだけですか?まさかそんなことはないでしょう。そういう場合に Alcotest が入ってくるのでしょうか?
FUN OCaml 2027 バンガロール開催(1月25〜26日)- トークとワークショップの提案を9月30日まで受付中
Sabine Schmaltz が発表しました
皆さんこんにちは!
FP Launchpad が FUN OCaml 2027 をバンガロールで開催する ことを発表できることを大変うれしく思います!これはインドで初めての FUN OCaml 開催(そして初の主要な OCaml カンファレンス)となります。
FUN OCaml 2027 は、OCaml の愛好家とプロフェッショナルに捧げる 2 日間のオープンソースハッキングイベントで、OCaml の実世界への影響に焦点を当て、グローバルコミュニティを結びつけます。
イベント詳細
- 日程: 2027年1月25〜26日
- 場所: MLR Convention Centre、Brigade Millennium Campus、JP Nagar 7th Phase、バンガロール
- 形式: 1 日目はトーク(基調講演を含み、オンラインでライブ配信)、2 日目はハンズオンワークショップと共同ハッキング。
Call for Participation(CFP)が公開中!
CFP は 9月30日 まで受け付けています。初めて登壇する方、業界の実践者、学術研究者、オープンソースメンテナーなど、あらゆる経験レベルからの応募を歓迎します。
特に興味深いと思っているトピック:
- ビジネスや個人プロジェクトでの OCaml の活用方法
- エコシステムの OCaml ライブラリ、フレームワーク、ツール
- 2 日目にハッキングへの意欲を刺激するハンズオンデモ
- 実際のコードとその設計決定の背後にある推論への深堀り
- 経験談と学んだ教訓
すべてのトークはライブ配信され、watch.ocaml.org と FUN OCaml の YouTube チャンネル にアップロードされます。
- 提案を提出する: https://fun-ocaml.com/%EF%BC%88%E3%81%BE%E3%81%9F%E3%81%AF%E7%9B%B4%E6%8E%A5 CFP 提出リンク から)
- 最新情報をフォロー: FUN OCaml の各種ソーシャルチャンネルをフォローし、FUN OCaml Discord サーバーに参加(ウェブサイト参照)。
皆さんの提案をお待ちしており、バンガロールでお迎えできることを楽しみにしています!
注記: 今年インドで FUN OCaml を開催することを選んだ主な理由は、(a)学生とプロフェッショナルの両方でイベントを満席にしやすいこと、(b)高品質な制作録画を再び実現できることです。OCaml ビギナーワークショップへのより高い需要と参加者を見込んでいます。一方で、インドへの渡航が EU 域内への渡航より不便であることも理解しています。
スピーカーとして渡航費用に不安がある場合は、CFP フォームのチェックボックスにチェックを入れて財政支援を申請してください。また、早めに提案を送っていただければ、セッションが採択され次第すぐにビザ申請(ビザサポートを提供しています)を開始できます。
ease-caml - OCaml 向けのイージングライブラリ
Christopher Sumnicht が発表しました
なぜ作ったのか?
ビデオゲームでは、アニメーションとトランジションを管理したいことがよくあります。通常これには、オブジェクトがある場所から別の場所に移動するように、時間をかけて浮動小数点値を一つの値から別の値へ(多くの場合継続的に)変形させることが必要です。このような変形は easing または tween と呼ばれることが多いです。tween を管理し続けることは難しい場合があります。Lua には、作成した tween を簡単に整理・管理できる hump.timer や Flux などのライブラリがあります。ease-caml はそれらのライブラリにインスパイアされており、OCaml ゲーム開発の支援を目的としています。
また、ゲームについて言及しましたが、SDL でも Raylib でも、ほぼ何でも使えます。更新ループがあれば十分です。
例
以下はバウンスするボールの小さな例です(raylib-ocaml を使用)。
type circle =
{
r: float;
x: float;
y: float ref;
}
let ball : circle = { r = 40.0; x = 400.0; y = ref ~-.40.0 }
let ty = Tween.make_tween ball.y 225.0 ~ef:Easers.bounce 1.0
let tm = Tween.new_manager ()
let setup () =
Raylib.init_window 800 450 "simple_tween";
Raylib.set_target_fps 60;
Tween.add ty tm
let rec loop () =
if Raylib.window_should_close () then Raylib.close_window ()
else (
let open Raylib in
Tween.update tm (get_frame_time ());
begin_drawing ();
clear_background Color.raywhite;
draw_circle_v (Vector2.create ball.x !(ball.y)) ball.r Color.maroon;
end_drawing ();
loop ()
)
let () = setup () |> loop
(新規ユーザーのため、リンクは 2 つまでしか貼れません。hump.timer、Flux、または raylib-ocaml を見つけるのにお困りの場合はお知らせください!)
opam 2.6.0~alpha1
このスレッドを続けて、Kate が発表しました
beta1 に引き続き、opam 2.6.0~beta2 のリリースを発表できることをうれしく思います。
このバージョンはベータ版です。安定版リリースに向けて、ユーザーの皆様にテストしていただき、これまで気づかれなかったバグを発見していただくことをお願いします。
2.6.0~beta1 との主な変更点
お試しください!
アップグレード手順は変更ありません:
Unix システムの場合
bash -c "sh <(curl -fsSL https://opam.ocaml.org/install.sh) --version 2.6.0~beta2"
または Windows システムの PowerShell から
Invoke-Expression "& { $(Invoke-RestMethod https://opam.ocaml.org/install.ps1) } -Version 2.6.0~beta2"
問題が発生した場合はバグトラッカーにご報告ください。
Happy hacking, <> <> The opam team <> <> :camel:
過去の CWN
CWN を見逃した場合は、メッセージを送っていただければメールでお送りします。また、アーカイブやRSS フィードもご覧いただけます。
毎週メールで受け取りたい場合は、caml-list を購読してください。