Houdini 21.0 ネットワークとパラメータ

レシピのデータ形式

レシピのデータ形式の詳細を説明します。

On this page

概要

HOMオブジェクトの様々なasData()メソッドは、レシピで使用されている形式と同じJSONライクなデータを生成または受け取ります。 これらのデータ構造には、JSONに対応した型(浮動小数点数、整数、ブール、None/null、辞書/オブジェクト、リスト/配列)のみが含まれます。 このページでは、Pythonの型名(例えば、JSONのarrayの代わりにlist)を使用しています。

詳細は、レシピの保存方法と使用方法を参照してください。

Tip

Pythonシェルでレシピデータを綺麗に表示したいのであれば、json.dumps()関数にindent引数を使用したり、または、pprint関数を使用すると良いでしょう。

>>> from json import dumps
>>> print(dumps(data, indent=4))
...
>>> from recipeutils import pprint
>>> pprint(data)

json.dumps()は、辞書の値を別々の行に配置するため、縦方向のスペースをより有効に活用することができます。 pprintは、値を同一行にまとめ、前の行のインデントに合わせるため、横方向のスペースをより有効に活用することができます。

パラメータ値

ここには、パラメータの値を格納します。 パラメータは一つ以上のコンポーネントを持ち、各コンポーネントにはリテラル値(浮動小数点数、整数、文字列)、エクスプレッションキーフレームデータを設定することができます。 単一コンポーネントのパラメータは、これら3つのタイプのどれかを返しますが、複数コンポーネントのパラメータは、これら3つのタイプをどれも含めることができるリストを返します。

[
    1.0,
    {
        "expression": "sin($T)"
    },
    {
        "keyframes": [
            {
                "frame": 1,
                "value": 0.0,
                "slope": 0.0,
                "accel": 0.0,
                "inaccel": 0.33,
                "expression": "bezier()"
            },
            {
                "frame": 48,
                "value": 1.0,
                "slope": 0.0,
                "accel": 0.0,
                "inaccel": 0.65,
                "expression": "bezier()"
            }
        ]
    }
]

関連項目:

エクスプレッション

これは、エクスプレッションを含んだパラメータコンポーネントを表現します。 以下のキーを持つことができます:

expression: str

エクスプレッションの文字列表現。

language: str

そのエクスプレッションの言語。

エクスプレッションデータの例:

{
    "expression": "$F",
    "language": "Hscript"
},

キーフレーム

これは、キーフレームを含んだパラメータコンポーネントを表現します。

keyframes: list[Keyframe Data]

Keyframe Dataのリスト。

frame: float

キーフレームのフレーム番号。

time: float

キーフレームの時間(秒)。

epxression: str

キーフレームのエクスプレッション。

value: float

キーフレームを出る値。

invalue: float

キーフレームに入る値。

slope: float

キーフレームを出る勾配。

inslope: float

キーフレームに入る勾配。

accel: float

キーフレームを出る加速度。

inaccel: float

キーフレームに入る加速度。

accelasratio: bool

加速度を比率で解釈すべきかどうか。

extrapolation_before: str

最初のキーフレーム前の外挿を返します。 これは、キーフレーム範囲外でのパラメータ値の評価方法を定義します。

extrapolation_after: str

最後のキーフレーム後の外挿を返します。 これは、キーフレーム範囲外でのパラメータ値の評価方法を定義します。

2つのキーフレームデータを持つ浮動小数点パラメータのキーフレームデータの例:

{
    "keyframes": [
        {
            "frame": 1,
            "value": 1.0,
            "slope": 0.0,
            "accel": 0.0,
            "inaccel": 0.33,
            "expression": "bezier()"
        },
        {
            "frame": 24,
            "value": 2.0,
            "slope": 0.0,
            "accel": 0.0,
            "inaccel": 0.33,
            "expression": "bezier()"
        }
    ]
}

パラメータ

パラメータは、その値と関連付けられることが多いですが、その値だけがパラメータが保持できるプロパティではありません。 パラメータは、以下のキーを持つことができます:

value: Parm Value Data

パラメータの各コンポーネントの値。

lock: bool | list[bool]

パラメータの各コンポーネントのロック状態。

visible: bool

パラメータをパラメータペインに表示するかどうか。

points: list[Ramp Point Data]

ランプ型パラメータは、このキーの下にランプポイントデータのリストを格納します。 このリストの長さがランプ上のポイント数を制御します。

Ramp Point Dataには以下の項目が含まれます:

pos: float

ランプ上のポイント位置。

value: float | Sequence[float]

Float Rampの場合は単一のfloatColor Rampの場合は3つのfloatのタプル。

interp: str

ランプポイントの補間関数。

Black To Orange に設定されたColor Rampを格納したpointsキーの例:

[
    {
        "pos": 0.0,
        "value": [
            0.0,
            0.0,
            0.0
        ],
        "interp": "linear"
    },
    {
        "pos": 1.0,
        "value": [
            1.0,
            0.324,
            0.1
        ],
        "interp": "linear"
    }
]

関連項目:

dictionary: dict[str, str]

Key-Value Dictionary型のパラメータは、このキーの下に辞書を格納します。

geometry: str

Geometry Data型のパラメータは、このキーの下にジオメトリを格納します。

multiparms: list[Parameters]

2セットのマルチパラメータインスタンスを格納したmultiparmsキーの例。

[
    {
        "export_enable#": True,
        "export_fieldname#": "density",
        "export_visible#": "smoke"
    },
    {
        "export_enable#": True,
        "export_fieldname#": "temperature",
        "export_visible#": "invisible"
    },
]

関連項目:

metadata: Parm Meta Data

パラメータに関する追加情報を格納します。

type: str

パラメータのタイプ(例えば、floatramp_rgb)。

label: str

パラメータのラベル。

spare: bool

パラメータがSpare(ユーザ定義)パラメータであるかどうかを格納します。

path: str

このパラメータのフルパス。

metadataキーの例:

{
    "type": "toggle",
    "label": "Enable Blending",
    "spare": False,
    "path": "/obj/geo1/attribblur1/enableblending"
}

関連項目:

パラメータ

これは、パラメータ名をパラメータデータにマッピングします。

以下は、パラメータセットの例です:

{
    "group": {
        "value": "group1"
    },
    "attributes": {
        "value": "P"
    },
    "method": {
        "value": "uniform"
    },
    "iterations": {
        "value": 1
    },
    "mode": {
        "value": "laplacian"
    },
    "frequency": {
        "value": 0.1
    },
    "stepsize": {
        "value": 0.5
    }
    "blurramp": {
        "points": [
            {
                "pos": 0.0,
                "value": 0.0,
                "interp": "monotonecubic"
            },
            {
                "pos": 0.5,
                "value": 1.0,
                "interp": "monotonecubic"
            },
            {
                "pos": 1.0,
                "value": 0.0,
                "interp": "monotonecubic"
            }
        ]
    }

}

どの.asData()関数にも、brief(またはparms_as_brief)オプションが用意されており、デフォルト値や一部の単一キー辞書を省略することで、よりコンパクトな出力を実現します。 例えば、パラメータデータにvaluepointsmultiparmsのいずれかの単一キーしかない場合にbrief=Trueを渡すと、辞書は値のみに置換されます。例:

{
    "group": "group1",
    "attributes": "P",
    "method": "uniform",
    "iterations": 1,
    "mode": "laplacian",
    "frequency": 0.1,
    "stepsize": 0.5,
    "blurramp": [
        {
            "pos": 0.0,
            "value": 0.0,
            "interp": "monotonecubic"
        },
        {
            "pos": 0.5,
            "value": 1.0,
            "interp": "monotonecubic"
        },
        {
            "pos": 1.0,
            "value": 0.0,
            "interp": "monotonecubic"
        }
    ]
}

パラメータデータに他のキーが含まれている場合(例えば、lockキーとvalueキーが共存する場合)、そのパラメータデータは完全な辞書となります。例:

{
    "group": "group1",
    "attributes": "P",
    "method": "uniform",
    "iterations": {
        "value": 1,
        "locked": True
    },
    "mode": "laplacian",
    "frequency": 0.1,
    "stepsize": 0.5,
    "blurramp": [
        {
            "pos": 0.0,
            "value": 0.0,
            "interp": "monotonecubic"
        },
        {
            "pos": 0.5,
            "value": 1.0,
            "interp": "monotonecubic"
        },
        {
            "pos": 1.0,
            "value": 0.0,
            "interp": "monotonecubic"
        }
    ]
}

関連項目:

パラメータテンプレート

これは、パラメータペイン内のパラメータを記述するためのテンプレート用データです。

type: str

hou.parmTemplateInterfaceType に基づくパラメータのタイプです。

label: str

パラメータペインに表示されるラベル。

label_hidden: bool

パラメータペインにおけるラベルの非表示状態。

num_components: int

このパラメータのコンポーネント数。

help: str

パラメータペインでパラメータラベルにマウスカーソルを置いた時にHoudiniが表示するヘルプ。

hidden: bool

パラメータペインにおける表示状態。

joins_with_next: bool

このパラメータをパラメータペインで次のパラメータと同じ行に表示するかどうか。

disable_when: str

このパラメータをパラメータペインで無効にする条件。

hide_when: str

このパラメータをパラメータペインで非表示にする条件。

no_cook_when: str

クックされない条件。

tab_disable_when: str

タブフォルダをパラメータペインで無効にする条件。

tab_hide_when: str

タブフォルダをパラメータペインで非表示にする条件。

tags: dict[str, Any]

パラメータテンプレートに格納される追加データの辞書。

script_callback: str

このパラメータが変更された時にHoudiniが実行するスクリプト。

script_callback_language: str

このパラメータが変更された時にHoudiniが実行するスクリプトの言語。

default_value: Parm Value Data

新しいパラメータインスタンスのデフォルト値。

default_points: list[Ramp Point Data]

新しいパラメータインスタンスのデフォルトのランプポイント。

min_value: float

パラメータの最小値。

max_value: float

パラメータの最大値。

strict_min: bool

最大値を厳格に適用するかどうか。

strict_max: bool

最小値を厳格に適用するかどうか。

icon_names: str

メニュー項目に呼応するアイコン。

item_generator_script: str

メニュー項目を生成するために使用されるスクリプト。 スクリプトが存在しない場合は空っぽの文字列。

item_generator_script_language: str

メニュー項目を生成するために使用されるスクリプト言語。

column_labels: list[str]

ラベルパラメータテンプレートの各カラムのラベル。

show_controls: bool

このランプパラメータのコントロールをデフォルトで展開するかどうか。

color_type: str

カラーランプキーを補間するカラースペース。

folder_names: str

このセット内のフォルダの名前。

tab_group_end: bool

このフォルダがフォルダセットの最後かどうか。

tab_conditionals: str

このパラメータテンプレートによって生成されるフォルダタブに影響を与える条件。

parmtemplates: Parm Template Data Dict

これがフォルダまたは複数パラメータのパラメータテンプレートである場合のネストされたパラメータテンプレートの辞書。

以下は、パラメータテンプレートのデータの例です:

{
    "type": "integer",
    "label": "Start Frame",
    "tags": {
        "script_callback_language": "python"
    },
    "menu_type": "normal",
    "default_value": 1,
    "min_value": 1,
    "max_value": 240,
    "strict_min": True
}

パラメータテンプレート

これは、テンプレート名をパラメータテンプレートデータ にマッピングします。

トグルおよび浮動小数点のパラメータテンプレートの例:

{
    "enablestartframe": {
        "type": "toggle",
        "label": "Enable Start Frame",
        "label_hidden": True,
        "joins_with_next": True,
        "tags": {
            "script_callback_language": "python"
        }
    },
    "startframe": {
        "type": "integer",
        "label": "Start Frame",
        "disable_when": "{ enablestartframe != 1 }",
        "tags": {
            "script_callback_language": "python"
        },
        "menu_type": "normal",
        "default_value": 1,
        "min_value": 1,
        "max_value": 240,
        "strict_min": True
    }
}

パラメータテンプレートブロック

この辞書は、そこに含まれているテンプレートを既存のどのテンプレートの後に挿入するかを示します。

ノードにSpareパラメータが追加されている場合、このデータはSpareパラメータテンプレートの連続したブロックのみを格納するのに役立ちます。

insert_after: str

パラメータテンプレートブロックの前に配置されるパラメータテンプレートの名前。

insert_first: str

パラメータテンプレートブロックがフォルダ内で1番目となる場合のフォルダパラメータテンプレートの名前。

parmtemplates: パラメータテンプレート

このパラメータテンプレートブロックに含まれる連続したパラメータテンプレートの辞書。

ネットワークアイテム

この辞書は、ノード、スティッキーノート、ネットワークボックス、ネットワークドット、サブネットワーク間接入力などのネットワークアイテムに関するデータを格納します。

以下のキーを持つことができます:

Note

inputsキーとoutputsキーの両方を持つことは可能ですが、レシピデータを生成する場合はどちらか1つのみを使用してください。 これは、ワイヤーを一貫して上流アイテムの出力として、または、下流アイテムの入力として指定することを意味します。 Houdiniは、レシピを作成する時にinputsキーを下流アイテムにのみ作成します。

type: str

ネットワークアイテムのタイプ。 ノードの場合、ここには、そのノードタイプ名(例えば、SOP Boxノードの場合はbox)を指定します。 スティッキーノート、ネットワークボックス、ネットワークドットの場合、ここには、それぞれStickyNoteNetworkBoxNetworkDotを指定しなければなりません。

inputs: list[Input Data]

これは、このノードの入力と他の上流ノードの出力を接続するコネクションを示したNetwork Item Input Dataのリストを格納します。

Input Dataは以下のキーを持ちます:

from: str

このノードの(to_indexで指定された)入力が接続されるノードの名前。

from_index: int | str

このノードの(to_indexで指定された)入力インデックスに接続するノードの(fromで指定された)出力インデックス。 このインデックスには、Vopコンテキストで使用されている名前付き出力も指定することができます。

to_index: int | str

このノードの入力インデックスは、fromで指定されたノードの(from_indexで指定された)出力インデックスに接続します。 このインデックスには、Vopコンテキストで使用されている名前付き入力も指定することができます。

以下は、inputsキーの例です:

{
    "from": "box1",
    "from_index": 0,
    "to_index": 0
}

関連項目:

outputs: list[Network Item Output Data]

これは、このノードの出力を他の下流ノードの入力に接続するコネクションを示したNetwork Item Output Dataのリストを格納します。

Network Item Output Dataは常に以下のキーを持ちます:

from_index: int | str

このノードの出力インデックスは、toで指定されたノードの(to_indexで指定された)入力インデックスに接続します。 このインデックスには、Vopコンテキストで使用されている名前付き出力も指定することができます。

to_index: int | str

このノードの(from_indexで指定された)出力インデックスに接続する(toで指定された)ノードの入力インデックス。 このインデックスには、Vopコンテキストで使用されている名前付き入力も指定することができます。

to: str

このノードの(from_indexで指定された)出力が接続するノードの名前。

下流でbox1という名前のノードに接続するNetwork Item Output Dataの例:

{
    "from_index": 0,
    "to_index": 0,
    "to": "box1"
}

関連項目:

color: list[float]

ネットワークエディタ内のアイテムのタイルのカラー。

size: list[float]

ネットワークエディタ内のアイテムのタイルのサイズ。

position: list[float]

ネットワークエディタ内のアイテムのタイルの位置。

comment: str

ノードのコメント文字列。

user_data: dict[str, Any]

このノード用のユーザ定義辞書データ。

parms: パラメータ

このノードのパラメータ用データを含んだパラメータデータの辞書。

parmtemplates: Union[パラメータテンプレート, パラメータテンプレートブロックデータ, list[パラメータテンプレートブロックデータ]

これは、このノードのパラメータテンプレートデータを格納します。

flags: dict[str, bool]

これは、このノードのフラグを格納します。

children: ネットワークアイテム

これは、このノードの子アイテム(存在する場合)のネストされた辞書を格納します。

Note

データをキャプチャする時、開かれているデジタルアセットは、そのコンテンツをchildrenキーの下にキャプチャし、閉じられたデジタルアセットは、子アイテムを持たないとみなされます。

childrenキーを含んだネットワークアイテムデータを閉じたデジタルアセットに設定した場合、そのデジタルアセットが開かれ、その内容がchildrenキーのデータで置換されます。

関連項目:

editables: ネットワークアイテム

これは、このノードのEditable Dive Targetアイテム(存在する場合)のネストされた辞書を格納します。

関連項目:

pinned: bool

ネットワークドットアイテムのピン止め状態。

box_content: list[str]

これは、ネットワークボックス内に含まれているネットワークアイテムの名前のリストを格納します。

text: str

スティッキーノートに表示されるテキスト。

text_color: list[float]

スティッキーノートに表示されるテキストのカラー。

text_size: float

スティッキーノートに表示されるテキストのサイズ。

draw_background: bool

スティッキーノートの色付き背景の描画。

minimized: bool

スティッキーノートの最小化状態。

metadata: Network Item Metadata

これは、ネットワークアイテムに関する追加情報を格納します。

Network Item Metadataには以下の項目を含めることができます:

category: str

このアイテムのカテゴリタイプ(例えば、SopDop)。

path: str

このアイテムのフルパス。

parent: bool

このアイテムの親のフルパス。

以下は、ネットワークアイテムのmetadataキーの例です:

{
    "category": "Sop",
    "path": "/obj/geo1/box1",
    "parent": "/obj/geo1"
}

以下は、ネットワークアイテムのデータの例です:

{
    "type": "box",
    "parms": {
        "divrate": [2, 2, 2],
    }
    "inputs": {
        "from": "bound1",
        "from_index": 0,
        "to_index": 0
    },
    "position": [0, 2.63],
    "color": [0.58, 0.21, 0.47],
    "flags": {
        "colordefault": False
    },
}

関連項目:

ネットワークアイテム

複数のネットワークアイテムのデータは、(ネットワークアイテムデータを格納する)この辞書の下に収集されます。 そのアイテムの名前がキーとなっています。

ネットワークアイテムデータの位置は、デフォルトではグローバルネットワーク空間の位置でキャプチャされます。 データをキャプチャする時、anchor_position(hou.Vector2)オプションを指定することで、すべての位置をそのアンカーの位置を基準に計算することができます。

{
    "box1": {
        "type": "box",
        "position": [-0.5, 2.85],
        "parms": {
            "type": "polymesh",
            "divrate": [2, 2, 2]
        }
    },
    "__dot1": {
        "type": "NetworkDot",
        "inputs": [
            {
                "from": "box1",
                "from_index": 0,
                "to_index": 0
            }
        ],
        "position": [0, 2],
        "color": [0.7, 0.7, 0.7]
    },
    "OUT": {
        "type": "null",
        "inputs": [
            {
                "from": "__dot1",
                "from_index": 0,
                "to_index": 0
            }
        ],
        "position": [-0.5, 0.85],
        "flags": {
            "display": True,
            "render": True
        }
    }
}

関連項目:

クラスタ

このデータタイプは、ネットワークアイテムデータの辞書をさらに高レベルに抽象化したものであり、ネットワークアイテムセットに加えてさらに追加情報を格納します。 これには、以下の項目を含めることができます:

tags: Cluster Tag Data

tagsは、childrenキーの下に格納された特定の目的のために、キャプチャされた1つ以上の項目に名前を付けることができます。

Cluster Tag Dataには以下の項目を含めることができます:

target_tag: str

ターゲットノードとして使用するノードの名前。

選択されたアイテムセットに対してCluster Dataがキャプチャされると、それらのアイテムのどれかをターゲットノードとしてタグ付けすることができます。 このターゲットノードの名前は、このキーに格納します。 すべてのネットワークアイテムの位置は、そのターゲットノードの位置を基準にキャプチャされます。

Cluster Dataのアイテムを作成する時、既存のノードをターゲットノードに指定することができます。 この名前で格納されたNetwork Item Dataは、代わりにその指定されたターゲットノードに適用されます。 この利点の一つは、キャプチャされたチャンネル参照が正しく新たに指定されたターゲットノードを指すようになることです。

frame_tags: list[str]

ネットワークエディタのフレームに収まるノード名のリスト。

selected_tags: list[str]

ネットワークエディタで選択されるノード名のリスト。

current_tag: str

ネットワークエディタで最後に選択されるノード名。

children: ネットワークアイテム

ここには、このクラスタが保持するすべてのネットワークアイテムのデータを格納します。

以下の例は、選択された3つのノードに対してキャプチャされたクラスターデータを示しています:

{
    "tags": {
        "target_tag": "transform1",
        "frame_tags": ["OUT", ],
        "selected_tags": ["box1", "OUT"]
        "current_tag": ["OUT"]
    }
    "children": {
        "transform1": {
            "type": "xform",
            "inputs": [
                {
                    "from": "box1",
                    "from_index": 0,
                    "to_index": 0
                }
            ],
            "position": [0, 0],
        },
        "box1": {
            "type": "box",
            "position": [0, 1],
            "parms": {
                "type": "polymesh",
                "divrate": [2, 2, 2]
            }
        },
        "OUT": {
            "type": "null",
            "inputs": [
                {
                    "from": "transform1",
                    "from_index": 0,
                    "to_index": 0
                }
            ],
            "position": [0, -1],
            "flags": {
                "display": True,
                "render": True
            }
        }
    },
}

transform2ノードがキャプチャデータを適用する(同じネットワーク内の)ターゲットノードである場合、以下の項目が作成されます。 この関数は、データ内の項目名と作成されたHoudiniオブジェクト間のマッピングを返します。

{
    "target_node": <hou.SopNode of type xform at /obj/geo1/transform2>,
    "items": {
        "box1": <hou.SopNode of type box
                    at /obj/geo1/box2>,
        "OUT": <hou.SopNode of type null
                at /obj/geo1/OUT1>
    }
}

関連項目:

レシピ

レシピは、データデジタルアセット内に格納されます。 このレシピデータは、data.recipe.jsonセクションに格納されます。

レシピデータには、以下の項目を含めることができます:

data

これは、選択されたHoudiniオブジェクトに基づいてキャプチャされたデータを格納します。

properties

ここには、このレシピが機能するのに必要な情報を格納します。

properties辞書には、以下のキーを含めることができます:

label: str

Houdiniに表示されるレシピのラベル。

name: str

レシピの内部名。 これは、Pythonシェルからレシピを呼び出す際に使用できる名前です。

nodetype_category: str

レシピをキャプチャしたノードのカテゴリタイプ。

nodetype_patterns: list[str]

Node PresetレシピおよびDecorationレシピは、そのレシピが割り当てられているノードタイプのレシピメニューに表示されます。 このリストは、それらのノードタイプを定義します。

recipe_category: str

これは、レシピのタイプを定義します。

visible: bool

これは、レシピがメニューに表示されて使用可能となるタイミングを設定します。

tool

Toolなどのレシピカテゴリの場合、これは、⇥ Tabメニューに表示されるツールに関する情報を保持します。

tool辞書には、以下のキーを含めることができます:

icon: str

⇥ Tabメニューに表示するアイコン名。

tab_submenu: list[str]`

レシピが表示される⇥ Tabメニュー内の位置のリスト。

options

レシピが作成された時に使用されたキャプチャオプションを格納します。

info

レシピに関する基本情報を格納します。

author: str

レシピの作成者。

comment: str

レシピの目的を説明したオプションのコメント。

created: str

レシピが作成された日時。

data_version: str

レシピのキャプチャに使用されたデータモデルのバージョン番号。

houdini_version: str

レシピのキャプチャに使用されたHoudiniバージョン。

以下は、レシピデータの例です:

{
    "data": {
        "type": "lsystem",
        "parms": {
            "angleinit": 27.0,
            "anglescale": 0.699999988,
            "picfile": "$HFS/houdini/pic/circle.pic",
            "premise": "A",
            "randscale": 0.5,
            "randseed": 3,
            "rule1": "A=-F+A:0.50",
            "rule2": "A=+F-A:0.50",
            "stepinit": 0.100000001,
            "stepscale": 0.5,
            "thickinit": 0.100000001,
            "thickscale": 0.899999976,
            "vertinc": 0.100000001
        }
    },
    "info": {
        "author": "sidefx",
        "comment": "",
        "created": "May 10, 2024 - 21:58:28",
        "data_version": "1.0",
        "houdini_version": "20.5.231"
    },
    "options": {
        "children": False,
        "default_parmvalues": False,
        "editables": False,
        "evaluate_parmvalues": False,
        "flags": False,
        "metadata": False,
        "nodes_only": False,
        "parms_as_brief": True,
        "parmtemplates": "spare_only",
        "verbose": False
    },
    "properties": {
        "label": "Crack",
        "name": "sop/lsystem::sidefx::crack",
        "nodetype_category": "Sop",
        "nodetype_name": "lsystem",
        "nodetype_patterns": [
            "Sop/lsystem"
        ],
        "recipe_category": "node_preset_recipe",
        "visible": True
    }
}

ネットワークとパラメータ

ネットワーク

パラメータの編集

次のステップ

エクスプレッション

レシピ

リファレンス

導師レベル