38
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

TRIAL&RetailAIAdvent Calendar 2024

Day 24

CUEって何?

Last updated at Posted at 2024-12-22

はじめに

TRIAL&RetailAI Advent Calendar 2024 の 24日目の記事です。

昨日は@takudooonさんの🎄X'masにRustで南無阿弥陀仏🙏という記事でした。
Rustで動くマイコンを使って仏教音楽を流すという記事でしたが、選曲が気になりますね。
組み込み開発は疎い方ですが、自分で何か動くモノを作ってみるのは楽しそうだと思いました。本日はCUEについて、ざっくりと紹介していきたいと思います。

CUEとは?

簡単にいうと言語です。データの構造や設定、仕様を定義するための言語だそう。

特徴は?

CUEの特徴を以下に記述します。

  • 宣言的なデータ定義
    データの構造を宣言的に定義できます。
  • データの検証
    データが期待する形式やルールに従っているかを検証できます。
  • バージョン管理
    データ定義のバージョン管理を簡単に行うことができます。
  • 型推論と柔軟性
    CUEは型推論を行い、柔軟なデータ構造を定義できます。

CUEは、特に構成管理や設定のテンプレート化、マイクロサービス環境などでのデータ構造の管理に有用です。

書いてみよう

CUEの記述方法はシンプルで直感的です。以下にいくつかの基本的な例を示します。

  • 基本的なデータ定義
    例えば、以下のように簡単な構成を定義できます。
    こちらの例はスキーマ定義になりますが、具体的な制約を加えることも可能です。
person.cue
person: {
    name: string
    age:  int
    active: bool
}
  • データの検証
    CUEでは、データが期待する形式に従っているかどうかを検証できます。
person.cue
person: {
    name:  string & >0   // 名前は0文字以上
    age:   int & >=18    // 年齢は18歳以上
    active: bool         
}
  • デフォルト値の設定
person.cue
person: {
    name: string
    age:  int | 30 // デフォルトで30歳
    active: bool
}
  • データの統合
    データ定義を統合することも可能です。
person.cue
// 同じフィールドが異なる場所で定義されている場合
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
    型と値の関係を階層(格子)として捉え、統合や比較を行います。
    この格子構造の論理が、スキーマ定義と制約を同時に行う基盤となります。

image.png

補足

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ではエンジニアを募集しています。
興味がある方はご連絡ください!

38
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
38
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?