はじめに
TRIAL&RetailAI Advent Calendar 2024 の 24日目の記事です。
昨日は@takudooonさんの🎄X'masにRustで南無阿弥陀仏🙏という記事でした。
Rustで動くマイコンを使って仏教音楽を流すという記事でしたが、選曲が気になりますね。
組み込み開発は疎い方ですが、自分で何か動くモノを作ってみるのは楽しそうだと思いました。本日はCUEについて、ざっくりと紹介していきたいと思います。
CUEとは?
簡単にいうと言語です。データの構造や設定、仕様を定義するための言語だそう。
特徴は?
CUEの特徴を以下に記述します。
- 宣言的なデータ定義
データの構造を宣言的に定義できます。 - データの検証
データが期待する形式やルールに従っているかを検証できます。 - バージョン管理
データ定義のバージョン管理を簡単に行うことができます。 - 型推論と柔軟性
CUEは型推論を行い、柔軟なデータ構造を定義できます。
CUEは、特に構成管理や設定のテンプレート化、マイクロサービス環境などでのデータ構造の管理に有用です。
書いてみよう
CUEの記述方法はシンプルで直感的です。以下にいくつかの基本的な例を示します。
- 基本的なデータ定義
例えば、以下のように簡単な構成を定義できます。
こちらの例はスキーマ定義になりますが、具体的な制約を加えることも可能です。
person: {
name: string
age: int
active: bool
}
- データの検証
CUEでは、データが期待する形式に従っているかどうかを検証できます。
person: {
name: string & >0 // 名前は0文字以上
age: int & >=18 // 年齢は18歳以上
active: bool
}
- デフォルト値の設定
person: {
name: string
age: int | 30 // デフォルトで30歳
active: bool
}
- データの統合
データ定義を統合することも可能です。
// 同じフィールドが異なる場所で定義されている場合
person: {
age: 30 // 1つ目の定義
name: "John" // 1つ目の定義
}
person: {
age: 30 // 2つ目の定義 (一致)
name: "John" // 2つ目の定義 (一致)
}
person: {
height: 180 // 身長
weight: 75 // 体重
}
データの統合ができていることを確認するために、以下のコマンドで上記のファイルをJSON形式で出力します。
cue
コマンドはHomebrewでインストールしました
cue export person.cue --out json
出力結果
{
"person": {
"age": 30,
"height": 180,
"name": "John",
"weight": 75
}
}
CUEの中核概念
CUEのロジックについて、一部紹介したいと思います。
(トップダウンの理解と参照枠を得るのに役立ちますが、言語の習得には必要ありません)
- Types are values
どういうことかというと、型も値と同じということです。 - The Value Lattice
型と値の関係を階層(格子)として捉え、統合や比較を行います。
この格子構造の論理が、スキーマ定義と制約を同時に行う基盤となります。
補足
CUEにおける「制約」の役割
CUEの制約は、単なる「入力データの検証」に留まらない。
- 型+制約 = スキーマ定義
型と制約を同時に定義できる。これがCUEの強みである。
例:value: int & >0 & <=100
→ これは「整数かつ0より大きく100以下」という制約を型に組み込んでいる。 - 制約 = データの期待値を示す
データがどのような条件を満たすべきかを表現する。
→ つまり、これを使って「データがスキーマに合致しているか?」を検証することができる。
「バリデーション」との違い
CUEの「制約」は、通常のバリデーションよりも 宣言的 に表現される。
- 通常のバリデーション:
データを受け取り、コードで条件を確認する(命令的) - CUEの制約:
スキーマに制約を組み込むことで、検証とデータモデリングを同時に行う(宣言的)
まとめ
CUEは、データ構造の定義と検証を効率化する宣言的な言語です。
型と制約を一体化して管理でき、統合や整合性チェックもシンプルに行えます。
「設定ファイルの複雑さを減らし、保守性を上げたい」という方に最適なツールです。
CUEでできることは色々あるみたいなので、気になったものを以下にまとめます。
- Protobuf を CUE に変換する
- Kubernates の制御
- Terraform のプランポリシーの作成
この辺で「CUE を使って何かしらやってみた」系で記事を書こうと思ったのですが、Kubernates やTerraform はGCP やAWS のアカウントが必要だったので見送りました。
興味がある方は、ぜひ試してみてください。
さいごに
明日は@10longさんの「leanによる定理証明AIエージェント遊戯」という記事になります。
お楽しみに〜
RetailAIとTRIALではエンジニアを募集しています。
興味がある方はご連絡ください!