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)。手書きの実験ノートの写真や PDF も AI OCR で読み取れる
- 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)を階層構造で追加・編集(Property / Content の両方)。どの型の要素も子の property / content を持てる |
| 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 使用)を読み込むと、自動的にレーン間の直接参照に変換されます
- ノードが1つも無いレーンには、中央に薄い文字で始め方(ツールバーで手描きする/AI Generate で生成する)が表示されます。ノードを置くと消えます
マルチメソッド
タブバーの + New Method でメソッドを追加すると新しいレーンが追加されます。タブバー右端の 🐦 Overview タブで全メソッドの俯瞰図を表示できます(閲覧専用)。
メソッド名はプロジェクト内で一意である必要があり、既存のメソッド名と同じ名前は作成できません。新規追加時のデフォルト名には、既存の名前と重複しない連番が自動的に割り当てられます。
ツールバー最上段の AI Generate ボタン(回路の入った頭部のアイコン)で「AI Petri Net Generator」モーダルが開きます。実験手順のテキスト、または手書きノートの画像から、Place / Transition / Arc / Template を自動生成してキャンバスに追加します。
モーダルは左右2カラム構成です。
| 領域 | 内容 |
|---|---|
| 上部の設定バー | 生成先のメソッド(Target Method)と、使用中のプロバイダー・モデル・API キーの状態を1行で表示。Change で詳細設定を開きます(未設定のときは自動で開きます) |
| ① 左カラム(入力) | ノート画像の追加 → AI OCR ↓ で書き起こし → 手順テキスト → Generate → |
| ② 右カラム(結果) | 生成された Structured Protocol(編集可)と Petri Net Preview |
| 下部のフッタ | エラー・リトライ状況・経過時間の表示と、Cancel / Apply to Canvas |
① LLM プロバイダーの選択(設定バーの Change から)
| プロバイダー | 説明 |
|---|---|
| ☁️ Cloud (Gemini) | Google AI Studio で取得した Gemini API キーを入力し、モデルを選択。APIキーはブラウザの localStorage に保存され、Google Gemini API 以外には送信されません。高精度・高速(数秒)ですが、データが Google のサーバーに送信されます |
| 🖥️ Local (Ollama) | ローカルの Ollama を使用。データが外部に送信されないため機密性の高い実験データに適し、ネットワーク環境がなくても利用できます。処理時間は PC のスペック(特に GPU)に依存し、GPU 非搭載 PC では数分〜十数分かかる場合があります |
- Gemini のモデルは、Fetch Models を押す前は
gemini-flash-lite-latest(既定)とgemini-flash-latestの2つが候補に出ます。Fetch Models で、そのキーで使える最新のモデル一覧を取得できます - Gemini が混雑している(
high demandなどの一時的なエラー)場合は、2 → 4 → 8 秒の間隔で最大3回まで自動で再送します。待機中はフッタに状況が表示されます
② 手書きノートの読み取り(AI OCR) — 任意
- Add notebook images で、実験ノートの写真やスキャン画像を追加します(複数可。貼り付け・ドラッグ&ドロップも可。PDF は Cloud のみ)
- サムネイルの ◀ ▶ でページの順番を並べ替えます。クリックすると拡大表示されます
- サムネイルの右に表示される AI OCR ↓ を押すと、画像の内容が順番どおりに手順欄へ書き起こされます(既に入力済みのテキストがあれば、その下に追記)
- 書き起こし結果を画像と見比べて、必要なら手順欄で直してから Generate します
AI OCR には画像入力に対応したモデルを選んでください。Gemini の flash / flash-lite 系は対応していますが、Fetch Models の一覧には音声合成用(-tts)や音楽生成用(lyria)など OCR に使えないモデルも含まれます。Ollama ではモデルごとに異なり、テキスト専用のモデルや派生版(名前に TextOnly などが付くもの)は使えません。
⚠️ lite 系のモデルやローカルの小型モデルは、読めない文字を □ にせず、もっともらしい語や数値に置き換えることがあります(例:「8 h」→「6 h」)。数値は必ず元の画像と照合してください。画像を追加しただけで手順欄が空のまま Generate を押すと、先に AI OCR を実行するよう案内が表示されます。
③ 実験手順テキストの入力
自由形式でも入力できますが、以下の推奨構造形式を使うと精度が向上します。
[STEP] ステップ名(動作を示す動詞句)
[IN:material] 原材料・試薬・装置名(数量なし)
[IN:condition] 条件名 | param:値 単位, param:値 単位
[IN:result] 前のSTEPの出力(名前を一字一句再利用)
[OUT:condition] 中間状態名 | param:値 単位
[OUT:result] 最終生成物・測定結果名
同じラベルを複数の STEP で使うと、自動的に共有 Place(アークで接続)として扱われます。
測定結果などの表は、[TABLE] ブロックとして扱われます。表は列ごとの content を持つテンプレート(propertyListType の下に列ごとの content)に変換され、セルの値は書かれた文字列のまま保持されます。
[OUT:result] XRF_Result (XRF分析結果)
[TABLE] XRF_Quantification (XRF定量結果) | unit:mass%
| Point (点) | Fe | Cr | Ni |
| A1 | 70.2 | 18.5 | 8.3 |
| A2 | 69.8 | 18.9 | 8.1 |
④ 生成・確認・適用
- Generate Templates(既定 ON)— 各 Place に対応するテンプレートのプロパティ(型・単位付き)も同時生成します
- Generate →(左カラム下)— 生成を実行します。処理中はボタン上に経過時間が表示されます。
[STEP]形式で書かれた入力は AI を呼ばずにそのまま変換されます - Structured Protocol(右カラム) — AI が手順テキストを変換した中間表現です。直接編集でき、編集すると下の Petri Net Preview が即座に更新されます
- データ欠落のチェック — 元のテキストにある数値が生成結果に見当たらない場合は、プレビューに警告が出ます。元の表が
[TABLE]として出力されていない、同じ名前の Place に異なる値が合流する、といった構造上の問題が見つかった場合は、AI に1回だけ自動で修正を依頼します - Apply to Canvas(フッタ)— 生成結果をキャンバスに追加します。追加後に Dagre Auto Layout が自動適用されます
Ollama のセットアップ(ローカルモードを使う場合)
- https://ollama.com からインストーラーを取得して実行
- モデルを取得(例:
ollama pull gemma4:e4b) - Ollama を起動し、タスクバーの通知領域にアイコンが出れば準備完了
- AI Generate モーダルの設定バーで Change を押し、🖥️ Local (Ollama) を選んで Fetch Models でモデル一覧を取得
AI OCR(画像の読み取り)には、画像入力に対応したモデル(例:qwen3-vision、画像対応版の gemma4)が必要です。
「Connection failed」と表示される場合は、Ollama を終了してから PowerShell で以下を実行し、再起動してください(CORS 設定)。
[System.Environment]::SetEnvironmentVariable("OLLAMA_ORIGINS", "*", "User")An existing connection was forcibly closed by the remote host のようなエラーが出る場合は、PC のメモリ不足で Ollama がモデルを読み込めていない可能性があります。他のアプリを閉じてから Ollama を再起動してください。
Petri Net Design で定義した Place ごとにカードが表示され、各カードの右上にあるボタンでその Place に紐づくデータテンプレート(スキーマ)を追加・編集します。
- + Add material — 試料データのテンプレートを追加
- + Add condition — 条件・パラメータデータのテンプレートを追加
- + Add result — 結果・出力データのテンプレートを追加
各テンプレートには property(単一値)と content(リスト値)を追加でき、どの型の要素も子の property / content を持てます(値と子の併存も可。各行右端の「+ property」「+ content」で追加)。他のメソッドのテンプレートをベースに継承(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階層。どの型の要素も親にできます(値と子を両方持つ親も可)。
並び順の規定: 各階層レベルごとに 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回まで再試行、失敗時はインポート全体を中止) |
| ネスト構造 | どの型の property / content も、子の property / content を持つ構造をそのまま取り込む(値と子を両方持つ親も保持)。Global Properties と <document> 直下の content にも対応 |
| 改訂履歴の自動登録 | インポートに成功すると、インポート元ファイルは自動的に <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 の署名構造を手軽に確認する目的の機能と位置づけてください。