MaiML Studio は、 MaiML(Measurement Analysis Instrument Markup Language) に準拠したファイルをビジュアルにデザイン・エクスポートするWebアプリです。
HTMLファイルを Chrome / Edge で開くだけで動作し、追加のインストールは一切不要です。
- インストール不要 —
.htmlファイルをダブルクリックするだけで起動 - ブラウザ完結 — Chrome / Edge(最新版)があれば Windows / Mac / Linux で動作
- マルチメソッド対応 — 複数の実験・分析メソッドを、縦積みレーンで並べた統合キャンバス上で一括編集
- プロジェクト保存/復元 — JSON形式での保存・読み込みに対応
- MaiML インポート — エクスポート済みの
.maiml/.xmlファイルを読み込み、再編集可能な状態に復元 - MaiML エクスポート — MaiML標準規格に準拠したXMLファイルを生成・ダウンロード
- ダーク/ライトモード — OSの設定を初期値として自動反映
- Excel インポート機能 — Excelファイルから定義を一括で読み込み
- AI ペトリネット生成 — 実験手順のテキストから Place / Transition / Arc / Template を自動生成(クラウドの Gemini API またはローカルの Ollama)
- XML 暗号化機能 — AES-256-GCMによる機密データの秘匿
- XMLデジタル署名機能 — RSA-SHA256による改ざん検知可能なMaiMLファイルの出力(W3C XML Signature 準拠)
- ファイル連携機能 — 複数MaiMLファイルのハッシュベース連携(
<chain>/<parent>)
MaiMLStudio.htmlをダウンロード- Chrome または Edge で開く
- 各タブを順番に編集してMaiMLファイルをデザインする
- ヘッダーの Export MaiML ボタンで
.maimlファイルを出力
MaiMLファイル全体のメタデータを編集します。
| セクション | 内容 |
|---|---|
| General Information | Document ID・UUID・Document Name・Description を設定 |
| Namespaces | Property / Content の Key に使用する名前空間接頭辞(Prefix)とURIを登録。登録したPrefixはKey入力時の補完候補として表示される |
| Global Properties | ファイル全体に付与するプロパティ(Key / Type / Value / Description)を階層構造で追加・編集。propertyListType によるネスト構造に対応 |
| Vendors | 使用機器のメーカー情報を登録 |
| Instruments | 使用した分析機器を登録 |
| Owners | データオーナーを登録 |
| Creators | データ作成者を登録。登録済みの Vendor・Instrument とのリンクが可能 |
- Key フィールドはQName形式(
[a-zA-Z_][a-zA-Z0-9_.-]*またはprefix:localName)に準拠した入力チェック付き - 禁止文字が入力された場合はフィールドが赤枠で警告表示
実験・分析プロセスをペトリネットとして設計します。全メソッドが点線区切りのレーンとして縦に並ぶ統合キャンバスで、1画面上でスクロールしながら複数メソッドを編集できます。
ノード操作
| 操作 | 方法 |
|---|---|
| Place(円)の追加 | ツールバーの Place ボタン選択後、キャンバスをクリック(クリックしたレーンに追加) |
| Transition(矩形)の追加 | ツールバーの Transition ボタン選択後、キャンバスをクリック(クリックしたレーンに追加) |
| Arc(矢印)の接続 | ツールバーの Arc ボタン選択後、始点ノードから終点ノードへドラッグ(同一レーン内のみ) |
| TemplateRef(青破線)の接続 | TemplateRef ボタン選択後、Place から Place へドラッグ(レーンを跨いで接続可) |
| InstanceRef(緑破線)の接続 | InstanceRef ボタン選択後、Place から Place へドラッグ(レーンを跨いで接続可) |
| ノードの移動 | Select モードでノードをドラッグ(同じレーン内でのみ移動) |
| ノードの削除 | Select モードでノードをクリック → 右パネルの Delete Node |
| Auto Layout | ツールバーのDagreアイコンで、選択中メソッドのPlace/Transitionのみを自動整列(キャンバスの表示位置は変わらない) |
| キャンバスのパン | キャンバス背景をドラッグ |
| ズーム | マウスホイール |
統合キャンバス(レーン)
- 各メソッドは点線境界のレーンとして縦に並んで表示され、Place / Transition / Arc の追加・移動はレーン内に限定されます
- TemplateRef / InstanceRef のみレーンの境界を跨いで他メソッドのPlaceと直接接続できます
- レーン下端の点線をドラッグすると高さを手動で調整できます(ノードを配置していくと自動でも拡張されます)
- メソッドタブをクリックすると該当レーンへスクロールし、そのレーンが選択状態(枠線ハイライト)になります
- 旧バージョンで作成したプロジェクト(Proxy Place 使用)を読み込むと、自動的にレーン間の直接参照に変換されます
マルチメソッド
タブバーの + New Method でメソッドを追加すると新しいレーンが追加されます。タブバー右端の 🐦 Overview タブで全メソッドの俯瞰図を表示できます(閲覧専用)。
メソッド名はプロジェクト内で一意である必要があり、既存のメソッド名と同じ名前は作成できません。新規追加時のデフォルト名には、既存の名前と重複しない連番が自動的に割り当てられます。
ツールバーの ✨ ボタンで「AI Petri Net Generator」モーダルが開きます。実験手順のテキストを入力すると、Place / Transition / Arc / Template を自動生成してキャンバスに追加します。
① LLM プロバイダーの選択
| プロバイダー | 説明 |
|---|---|
| ☁️ Cloud (Gemini) | Google AI Studio で取得した Gemini API キーを入力し、モデルを選択。APIキーはブラウザの localStorage に保存され、Google Gemini API 以外には送信されません。高精度・高速(数秒)ですが、データが Google のサーバーに送信されます |
| 🖥️ Local (Ollama) | ローカルの Ollama を使用。データが外部に送信されないため機密性の高い実験データに適し、ネットワーク環境がなくても利用できます。処理時間は PC のスペック(特に GPU)に依存し、GPU 非搭載 PC では数分〜十数分かかる場合があります |
② 実験手順テキストの入力
自由形式でも入力できますが、以下の推奨構造形式を使うと精度が向上します。
[STEP] ステップ名(動作を示す動詞句)
[IN:material] 原材料・試薬・装置名(数量なし)
[IN:condition] 条件名 | param:値 単位, param:値 単位
[IN:result] 前のSTEPの出力(名前を一字一句再利用)
[OUT:condition] 中間状態名 | param:値 単位
[OUT:result] 最終生成物・測定結果名
同じラベルを複数の STEP で使うと、自動的に共有 Place(アークで接続)として扱われます。
③ オプションと実行
- Generate Templates(既定 ON)— 各 Place に対応するテンプレートのプロパティ(型・単位付き)も同時生成します
- Generate — 生成を実行します。処理中は経過時間タイマーが表示されます
- プレビュー確認 — 生成された Place / Transition / Arc / Template の一覧を確認します
- Apply to Canvas — 生成結果をキャンバスに追加します。追加後に Dagre Auto Layout が自動適用されます
Ollama のセットアップ(ローカルモードを使う場合)
- https://ollama.com からインストーラーを取得して実行
- モデルを取得(例:
ollama pull gemma4:e4b) - Ollama を起動し、タスクバーの通知領域にアイコンが出れば準備完了
- AI Generate モーダルで 🖥️ Local (Ollama) を選び、Fetch Models でモデル一覧を取得
「Connection failed」と表示される場合は、Ollama を終了してから PowerShell で以下を実行し、再起動してください(CORS 設定)。
[System.Environment]::SetEnvironmentVariable("OLLAMA_ORIGINS", "*", "User")Petri Net Design で定義した Place ごとにカードが表示され、各カードの右上にあるボタンでその Place に紐づくデータテンプレート(スキーマ)を追加・編集します。
- + Add material — 試料データのテンプレートを追加
- + Add condition — 条件・パラメータデータのテンプレートを追加
- + Add result — 結果・出力データのテンプレートを追加
各テンプレートには property(単一値)と content(リスト値)を追加でき、propertyListType によるネスト構造にも対応しています。他のメソッドのテンプレートをベースに継承(TemplateRef)したテンプレートは読み取り専用で表示されます。
手動入力の代わりに、Excelファイルから一括で定義を読み込めます。対象のExcelファイルには、Placeと同じシート名が必要です。Key列に>記号を使ってネスト構造を表現できます。
認識される列は Element / Key / Type / Units / Description / Value / Size / Axis / ScaleFactor / FormatString の10種類です(後半4列は content 行向け)。
| Element | Key | Type | Units | Description | Value | Size | Axis | ScaleFactor | FormatString |
|---|---|---|---|---|---|---|---|---|---|
| property | Temperature | propertyListType | 温度設定 | ||||||
| property | >Set_Temp | doubleType | °C | 設定温度 | 180 | ||||
| property | >Control | propertyListType | 制御パラメータ | ||||||
| property | >>PID_P | doubleType | P値 | 1.2 | |||||
| content | >>Time_Log | contentDoubleListType | s | 時間記録 | 0 10 20 | 3 | t | 1 | 0.00 |
| property | Operator | stringType | 担当者 | Tanaka |
ネスト構造のルール: > = 1階層、>> = 2階層。親要素は必ず propertyListType である必要があります。
並び順の規定: 各階層レベルごとに property を先に、content を後に記述してください。ルートレベルでも、ネストした子要素グループ内でも同じ順序が必要です。親レベルに戻れば、再び property から記述できます。
Templates で定義したスキーマをもとに、実際の計測データ・イベントを入力します。
左パネル(Source Templates)
- Data Templates — 登録済みテンプレートの一覧。各カード下部の + Add Instance ボタンでインスタンスを生成
- Transitions (Events) — ペトリネットで定義したトランジション(各メソッドに1つ)。各トランジションカードで以下のフィールドを編集できます。
Transition(eventLog)カードのフィールド
| フィールド | 説明 |
|---|---|
| lifecycle | イベントのライフサイクル状態を選択(started / completed 等) |
| timestamp | ISO 8601形式(YYYY-MM-DDThh:mm:ss.sssTZD)で日時を入力。空白のままにするとエクスポート時に現在時刻が自動セットされる |
| UUID | イベントのUUID。手動入力またはボタンクリックで自動生成 |
| creatorRef | Document Metadata の Creators に登録済みのCreatorをドロップダウンで参照 |
| ownerRef | Document Metadata の Owners に登録済みのOwnerをドロップダウンで参照 |
creatorRef / ownerRef は任意項目です。選択すると、エクスポートされるMaiMLの <eventLog> 内に <creatorRef> / <ownerRef> 要素として出力されます。
右パネル(Results Groups / インスタンス一覧)
生成されたインスタンス・イベントが一覧形式で表示されます。各インスタンスカードで以下の操作が可能です。
- テンプレート由来の Property / Content の値を直接編集
- インスタンス固有の Property / Content を追加
- 外部ファイル(測定データ等)の挿入情報(URI・UUID・Hash)を追加
Results Groups(結果グループ)
Data & Events タブの上部にあるタブバーで、インスタンスとイベントを複数のグループに分けて管理できます。
タブひとつが MaiML の <results> 要素ひとつに対応します。イベントはアクティブなタブに属し、エクスポート時に <resultsRef ref="タブ名"/> として記録されます。
| 操作 | 方法 |
|---|---|
| グループの追加 | タブバー右端の + Add Results ボタンをクリック |
| グループ名の変更 | タブのペンアイコンをクリック |
| グループの削除 | タブの × ボタンをクリック(グループ内のインスタンス・イベントも同時に削除)。最後の1つは削除できません |
| グループの切り替え | タブをクリック |
各メソッドは独立した Results Groups を持ちます。グループを切り替えると、右パネルの表示内容もグループに対応した内容に切り替わります。
<results id="..."> の ID 属性値として使われます。ID はファイル内で一意である必要があるため、以下のルールに従ってください(入力ダイアログがリアルタイムで検証します)。
- 使用できる文字は英数字・
_・-・. - 先頭は英字または
_(数字や記号は不可) - 他のタブと重複する名前は不可
- 予約語(
document/protocol/data/eventLog)は使用不可
| 操作 | 説明 |
|---|---|
| Save Project (JSON) | 編集中の状態をJSONファイルとして保存(再編集可能) |
| Load Project (JSON) | 保存したJSONファイルを読み込み、状態を復元 |
| Import MaiML | エクスポート済みの .maiml / .xml ファイルを読み込み、再編集可能な状態に復元(詳細は次項) |
| Export MaiML | MaiML標準規格に準拠した .maiml XMLファイルを生成・ダウンロード |
| Export MaiML(+Sign) | RSA-SHA256によるXMLデジタル署名付きの .maiml ファイルを生成・ダウンロード |
エクスポート済みの .maiml / .xml ファイルを読み込み、再編集可能な状態に復元します。Studio がエクスポートしたファイルだけでなく、他のツールが生成した MaiML ファイル(単一メソッドのもの)も読み込めます。
MaiML ファイルはペトリネットの座標情報を持たないため、Place / Transition の配置はインポート時に自動レイアウトで再構成されます。
| 項目 | 内容 |
|---|---|
| 対応範囲 | 単一メソッド(<method> 1件)のMaiMLファイルのみ対応。複数メソッドを含むファイルは現時点では非対応(インポート時にエラー表示) |
| テンプレート収集 | protocol / method / program のいずれの階層下にあるテンプレートも収集 |
| 暗号化データ | <xenc:EncryptedData> を検出した場合はパスワード入力を求めて一括復号(最大3回まで再試行、失敗時はインポート全体を中止) |
| 未対応構造の警告 | propertyListType 以外の型が子 property / content を持つ構造(スキーマ上は合法だがStudio未対応)を検出した場合、対象一覧を表示する確認モーダルが表示され、続行(該当の子要素を破棄)または中止を選択できる |
| 改訂履歴の自動登録 | インポートに成功すると、インポート元ファイルは自動的に <parent key="revised"> として登録されます(確認なしの自動処理。「インポート=改編する」という運用ルールに基づく)。インポート元ファイルが既に <parent> を持っていた場合、その情報は新しい parent の子要素として入れ子で保持され、改訂の連鎖が維持されます |
| 署名の扱い | インポート元に <ds:Signature> があった場合は破棄されます(再編集により署名は無効になるため。警告が表示されます) |
- ヘッダーの Import MaiML ボタンをクリックし、
.maiml/.xmlファイルを選択 - 編集中の内容がある場合は、現在の内容を破棄してよいかの確認ダイアログが表示されます
- 暗号化データがある場合はパスワード入力ダイアログが表示されます
- 未対応のネスト構造が検出された場合は内容を確認し、続行するか中止するかを選択します
- インポートが完了すると、Document Metadata・Petri Net Design・Templates・Data & Events の各タブに内容が復元されます
注意: インポート元ファイルを直接上書きすることは想定されていません。「別名で保存し、改訂履歴(
<parent>)で連鎖をたどる」という運用を前提としています。
MaiML規格(JIS K0200)に準拠したXML暗号化機能です。property要素やcontent要素を選択的に秘匿できます。
| 項目 | 説明 |
|---|---|
| 暗号化アルゴリズム | AES-256-GCM(認証付き暗号化・改ざん検知内蔵) |
| 鍵導出 | PBKDF2-SHA256(反復回数 100,000 回) |
| 暗号化方式 | コンテンツ暗号化(Type=#Content)— 親要素タグ・属性はそのまま残し、子要素のみ暗号化 |
| 準拠仕様 | W3C XML Encryption 1.1 / JIS K0200 |
- Templates タブまたは Data タブで、暗号化したい property / content 行の右端にあるロックアイコンをクリック
- アイコンが🔐(アンバー色)に変わると「暗号化対象」としてマークされます
- 通常通り Export MaiML ボタンをクリック
- 暗号化パスワードの設定ダイアログが表示されます。4文字以上のパスワードを2回入力
- 出力されたMaiMLファイル内で、対象要素の子要素が
<xenc:EncryptedData>に置き換えられます
MaiML規格(JIS K0200)の <chain> 要素を使ったファイル連携機能です。複数のMaiMLファイルを関連付け、改ざん検知(ハッシュ値による整合性確認)を実現します。ブロックチェーンのように「このファイルは別のファイルの内容を受け継いでいる」という時系列の連鎖を記録できます。
| 項目 | 説明 |
|---|---|
| ハッシュ方式 | SHA-256(署名付きファイルは <ds:DigestValue>、署名なしはファイル全体のバイト列) |
| 出力位置 | <document> 要素内の <date> 要素の直後 |
| key属性 | 規定値は key="chain" |
- Document Metadata タブの一番下にある Chained Files セクションを表示
- Add Chain ボタンをクリックし、連携先の
.maimlファイルを選択 - 選択したファイルの
//document/uuid値と SHA-256 ハッシュ値が自動的に取得・表示 - 通常通り Export MaiML ボタンをクリックすると、
<chain>要素がMaiMLファイルに書き出されます
<document id="...">
...
<date>2025-06-01T10:00:00+09:00</date>
<chain id="chain_001" key="chain">
<uuid>0bce8354-55f1-4047-b221-988e00c87c79</uuid>
<hash method="SHA-256">B1sDhiK3...</hash>
</chain>
</document>MaiML規格(JIS K0200)の <parent> 要素を使った改訂元ファイルの登録機能です。あるMaiMLファイルが別のMaiMLファイルを改訂・派生させたものであることを記録し、ハッシュ値による改ざん検知を実現します。
| 項目 | 説明 |
|---|---|
| ハッシュ方式 | SHA-256(署名付きファイルはDigestValue、署名なしはファイル全体) |
| key属性 | 固定値 key="revised" |
| 登録上限 | 1件のみ(1ファイルにつき改訂元は1つ) |
- Document Metadata タブ下部の Parent File セクションを表示
- Set Parent ボタンをクリックし、改訂元の
.maimlファイルを選択 - 選択したファイルの
//document/uuid値と SHA-256 ハッシュ値が自動的に取得・表示 - 通常通り Export MaiML ボタンをクリックすると、
<parent>要素がMaiMLファイルに書き出されます
補足: Import MaiML 機能を使ってファイルを読み込んだ場合は、インポート元ファイルがこの
<parent>として自動的に登録されます(手動での Set Parent 操作は不要)。ここで説明する手動登録は、インポートを使わずに改訂元を明示したい場合に利用します。
MaiML規格(JIS K0200)に準拠したXMLデジタル署名機能です。Export MaiML(+Sign) ボタンで出力したMaiMLファイルには、W3C XML Signature仕様に準拠した署名が埋め込まれ、ファイルの改ざんを検知できます。
| 項目 | 説明 |
|---|---|
| 署名アルゴリズム | RSA-SHA256(xmldsig-more#rsa-sha256)。鍵長 2048 bit |
| 署名方式 | Enveloped Signature(署名要素がファイル内に埋め込まれる) |
| 正規化 | Canonical XML 1.0 inclusive(REC-xml-c14n-20010315、コメントなし) |
| 変換 | enveloped-signature → c14n |
| 参照 | URI=""(文書全体) |
| 鍵情報 | <ds:KeyInfo> に <ds:KeyValue><ds:RSAKeyValue>(Modulus / Exponent) |
| 署名要素の位置 | <document> の先頭の子要素(JIS K 0200 6.2.2) |
| 鍵管理 | 署名のたびに新しい鍵ペアを生成(公開鍵は署名内に埋め込み) |
| 準拠仕様 | W3C XML Signature(XMLDSig Core) / JIS K0200 |
この6項目(アルゴリズム・正規化・変換・参照・鍵情報・署名位置)を固定したものを
MaiML 署名プロファイルとして扱っています。.NET の SignedXml など他実装との
相互運用を実測で確認済みです。
- ヘッダーの Export MaiML(+Sign) ボタン(緑色)をクリック
- 通常の Export MaiML と同様に
.maimlファイルが生成・ダウンロードされます - 出力ファイル内の
<ds:Signature>要素に署名値・公開鍵が格納されています
注意: 鍵ペアはエクスポートのたびに新規生成されます。署名検証が必要な場合は、出力ファイル内の公開鍵(
<ds:KeyValue>)を使用してください。
⚠️ この署名が保証する範囲: 検証に使う公開鍵はファイル自体に同梱されています。したがってこの機能が確認できるのは「署名後にファイルが変更されていないか」という完全性までです。内容を書き換えた者は自分の鍵で署名し直せるため、「誰が署名したか」という署名者の真正性は保証しません(信頼の起点となる証明書/PKI を持たないため)。MaiML の署名構造を手軽に確認する目的の機能と位置づけてください。