【テクニカル・上級編】【上級プロフェッショナル向け】図面オープン時の「外部参照パス」自動解決とリマッピング保存 – AutoCAD VBA解析バイブル

スポンサーリンク

伝説のアーキテクトが解き明かす AutoCAD VBA:図面オープン時の外部参照パス自動解決とリマッピング保存 – レガシーシステム保守とシステム連携の極意

諸君、伝説のチーフアーキテクトである私が、今宵、AutoCAD VBAの世界、特に図面ファイル(DWG/DXF)の深淵に分け入り、君たちが直面するであろう最も厄介な問題の一つ、「外部参照(Xref)のリンク切れ」に終止符を打つための、極限の知見を授けよう。サーバー移行、ファイル移動、あるいは単なるパスの typo。原因は様々だが、結果として図面を開けば「外部参照が見つかりません」の嵐。これに泣かされてきたエンジニア、システム管理者は数知れないはずだ。

本稿は、単なるリファレンスの羅列ではない。何十年にもわたりAutoCAD VBAシステムとレガシーアーキテクチャの最前線で戦い続けてきた、この私の経験と、Windows APIの深奥、そしてメモリ管理の鉄則といった、真に「知る者」だけが到達できる領域からの洞察である。君たちが、日々の開発現場で、あるいは古びたシステムを保守する際に、この知識を武器として最大限に活用できるように、魂を込めて書き記す。

1. 外部参照(Xref)リンク切れの現実と、その根本原因

まず、なぜ外部参照がリンク切れを起こすのか、そのメカニズムを正確に理解することが、解決への第一歩だ。AutoCADは、外部参照ファイルを検索する際に、いくつかのルールに基づいたパスを辿る。

  • 指定されたパス: DWGファイルに直接記録されているパス。これが最も一般的だが、最も壊れやすい。
  • 参照ファイルパス: 外部参照を挿入した際の相対パスまたは絶対パス。
  • プロジェクトパス: AutoCADのオプションで設定される「プロジェクトパス」。
  • サポートファイル検索パス: AutoCADのオプションで設定される「サポートファイル検索パス」。
  • レジストリ: 過去のバージョンや特定の環境設定に依存するパス。

サーバー移行などでファイルが移動すれば、当然ながら「指定されたパス」は無効になる。プロジェクトパスやサポートファイル検索パスが更新されていれば、まだ救われる可能性はあるが、それらもまた、手動での更新が必要になる場合が多い。

この「リンク切れ」は、単に図面が見栄え悪くなるというレベルの問題ではない。参照先のファイルがなくなれば、その参照先の情報(オブジェクト、レイヤー、ブロック定義など)は当然ながら図面から失われる。さらに、保存時にAutoCADが「リンク切れした外部参照」をどのように扱うか、ここにVBAによる自動修復の肝がある。

2. VBAによる自動解決の核心:`Application.ActiveDocument.ResolveXRefs` の誤解と真実

多くのVBA開発者は、外部参照のパス解決に `Application.ActiveDocument.ResolveXRefs` メソッドを使おうとする。しかし、これは「リンク切れした外部参照」を自動的に新しいパスに「リマッピング」する機能ではない。このメソッドの真の目的は、既に存在する外部参照(リンク切れしていないもの)のパスを、設定された検索パスに基づいて解決し直すことにある。

つまり、リンク切れした外部参照に対して `ResolveXRefs` を呼び出しても、AutoCADが新しいパスを「推測」して自動的に解決してくれるわけではないのだ。このメソッドは、あくまでAutoCADが「探せる範囲」で、外部参照を「見つけ直す」ためのものだ。

では、どうすればリンク切れした参照を「リマッピング」し、新しいパスで保存できるのか。これは、AutoCADの内部的なオブジェクトモデルを深く理解し、Windows APIの力を借りることで初めて可能になる。

3. Windows APIを駆使した「リンク切れ」の検知と「パスリマッピング」の実現

AutoCAD VBAは、COMオブジェクトモデルを通じてAutoCADの機能にアクセスする。しかし、ファイルシステムレベルの操作や、より低レベルな情報へのアクセスには、Windows APIが不可欠となる。

3.1. リンク切れした外部参照の検知:`XrefStatus` プロパティの深掘り

各外部参照オブジェクト(`AcadXRef`)は、`Status` プロパティを持っている。このプロパティは、外部参照の状態を示す列挙型だが、その値の意味を正確に理解する必要がある。

  • `acXrefUnloaded`: ロードされていない。
  • `acXrefLoaded`: ロードされている。
  • `acXrefResolved`: パスが解決され、ロードされている。
  • `acXrefAttachment`: 添付ファイル。
  • `acXrefOverlay`: オーバーレイ参照。
  • `acXrefFileNotFound`: これが重要!ファイルが見つからない状態を示す。

VBAでは、この `acXrefFileNotFound` を検知することで、リンク切れした外部参照を特定できる。

‘ リンク切れした外部参照をリストアップする例
Sub ListBrokenXrefs()
Dim acadApp As AutoCAD.Application
Dim acadDoc As AutoCAD.Document
Dim xrefObj As AutoCAD.XRef
Dim brokenXrefPaths As Collection

On Error Resume Next ‘ エラーハンドリングを有効に
Set acadApp = GetObject(, “AutoCAD.Application”)
If acadApp Is Nothing Then
MsgBox “AutoCADが起動していません。”, vbCritical
Exit Sub
End If
Set acadDoc = acadApp.ActiveDocument
If acadDoc Is Nothing Then
MsgBox “アクティブな図面がありません。”, vbCritical
Exit Sub
End If

Set brokenXrefPaths = New Collection

‘ 外部参照コレクションをループ
For Each xrefObj In acadDoc.PlotConfigurations.Item(1).ExternalReferences ‘ PlotConfigurations は存在しない可能性があるので注意。本来は acadDoc.ExternalReferencesCollection
‘ XrefオブジェクトのStatusプロパティをチェック
If xrefObj.Status = acXrefFileNotFound Then
brokenXrefPaths.Add xrefObj.Name & ” | ” & xrefObj.Path
Debug.Print “リンク切れ: ” & xrefObj.Name & “, 元パス: ” & xrefObj.Path
End If
Next xrefObj

‘ XrefオブジェクトはAcadDocumentの直接のプロパティではなく、
‘ AcadDocument.ExternalReferencesCollection に格納されているはず。
‘ 上記は簡略化のため、実際には下記のようにアクセスする
Dim acadXref As AcadXRef
For Each acadXref In acadDoc.ExternalReferencesCollection
If acadXref.Status = acXrefFileNotFound Then
brokenXrefPaths.Add acadXref.Name & ” | ” & acadXref.Path
Debug.Print “リンク切れ: ” & acadXref.Name & “, 元パス: ” & acadXref.Path
End If
Next acadXref

If brokenXrefPaths.Count > 0 Then
MsgBox “以下の外部参照でリンク切れが検出されました:\n” & brokenXrefPaths.Join(vbCrLf), vbInformation
Else
MsgBox “リンク切れした外部参照は見つかりませんでした。”, vbInformation
End If

Set brokenXrefPaths = Nothing
Set acadDoc = Nothing
Set acadApp = Nothing
End Sub

【重要】 上記コードの `acadDoc.PlotConfigurations.Item(1).ExternalReferences` は、典型的な間違いの例として示しています。`ExternalReferences` は `AcadDocument` オブジェクトの直接のプロパティではなく、`AcadDocument.ExternalReferencesCollection` に格納されています。正しいアクセス方法に修正しました。

3.2. パスリマッピングのための「新しいパス」の特定

リンク切れした参照の「新しいパス」をどうやって特定するか。これがVBA自動化の最も難しい部分であり、システム連携の腕の見せ所だ。

  • ルールベースのマッピング: サーバー移行前後のパス構造が一定であれば、文字列置換で新しいパスを生成する。

例: `C:\OldServer\Share\Drawing` を `\\NewServer\Share\Drawing` へ置換。

  • ファイル名からの検索: リンク切れした外部参照のファイル名 (`.dwg`) をキーとして、指定された検索ディレクトリ(Windows APIで取得)を走査し、該当するファイルを見つける。
  • データベース連携: 外部参照と新しいパスのマッピング情報を格納したデータベース(SQL Server, Accessなど)を参照する。

ここでは、最も汎用的な「ルールベースのマッピング」と「ファイル名からの検索」を組み合わせたアプローチを例示しよう。

‘ 外部参照パスを自動解決・リマッピングする関数
Function RemapXrefPath(ByVal xrefName As String, ByVal oldPath As String, ByVal newBaseDir As String, ByVal oldBaseDir As String) As String
Dim newPath As String
Dim foundPath As String

‘ 1. ルールベースのリマッピング
If InStr(oldPath, oldBaseDir) = 1 Then ‘ oldBaseDir で始まるパスの場合
newPath = Replace(oldPath, oldBaseDir, newBaseDir, 1, -1, vbTextCompare)
‘ 新しいパスが存在するか確認 (Windows APIを使用)
If FileExists(newPath) Then
RemapXrefPath = newPath
Exit Function
End If
End If

‘ 2. ファイル名から新しいパスを検索 (newBaseDir 以下を再帰的に検索)
foundPath = FindFileRecursive(Dir(newBaseDir & “\.”, vbDirectory), xrefName, newBaseDir)
If foundPath <> “” Then
RemapXrefPath = foundPath
Exit Function
End If

‘ 3. マッピングできなかった場合は、元のパスを返す(またはエラー処理)
RemapXrefPath = “” ‘ マッピング失敗を示す
End Function

‘ 指定されたベースディレクトリ以下を再帰的にファイル検索する関数 (簡易版)
Private Function FindFileRecursive(ByVal fileName As String, ByVal targetFileName As String, ByVal currentDir As String) As String
Dim subDir As String
Dim tempPath As String

‘ 現在のディレクトリを検索
tempPath = currentDir & “\” & fileName
If LCase(fileName) = LCase(targetFileName) Then
FindFileRecursive = tempPath
Exit Function
End If

‘ サブディレクトリを再帰的に検索
If GetAttr(currentDir) And vbDirectory Then
subDir = Dir(currentDir & “\.”, vbDirectory)
Do While subDir <> “.” And subDir <> “..”
If GetAttr(currentDir & “\” & subDir) And vbDirectory Then
Dim result As String
result = FindFileRecursive(subDir, targetFileName, currentDir & “\” & subDir)
If result <> “” Then
FindFileRecursive = result
Exit Function
End If
End If
subDir = Dir
Loop
End If

FindFileRecursive = “” ‘ 見つからなかった場合
End Function

‘ ファイル存在チェック (Windows APIを使用)
Private Declare Function PathFileExists Lib “shlwapi.dll” Alias “PathFileExistsA” (ByVal pszPath As String) As Long
Private Function FileExists(ByVal filePath As String) As Boolean
FileExists = (PathFileExists(filePath) <> 0)
End Function

【注意点】

  • `FindFileRecursive` は非常に簡易的な実装です。実際の運用では、パフォーマンスやエラーハンドリング(アクセス拒否など)を考慮した、より堅牢な実装が必要です。
  • `PathFileExistsA` は `shlwapi.dll` に存在します。Windowsのシステムディレクトリにあり、通常は利用可能です。
  • `Dir` 関数によるファイル検索は、大量のファイルが存在するディレクトリではパフォーマンスに影響を与える可能性があります。その場合は、`FindFirstFile` / `FindNextFile` といった Windows API を直接使用する方が効率的です。

4. AutoCADオブジェクトのライフサイクル管理とメモリ最適化:レガシーシステム保守の鉄則

AutoCAD VBAにおいて、オブジェクトのライフサイクル管理はパフォーマンスと安定性に直結します。特に、外部参照のような、図面全体に影響を与えるオブジェクト群を扱う際は、細心の注意が必要です。

4.1. オブジェクトの明示的解放 (`Set obj = Nothing`) の重要性

VBAでは、COMオブジェクトやコレクションを使い終わったら、必ず `Set obj = Nothing` を実行して明示的に解放することが推奨されます。これは、オブジェクトが占有しているメモリやシステムリソースを速やかに解放し、メモリリークを防ぐための基本的な作法です。

特に、ループ処理で多数のオブジェクトを生成・破棄する場合や、大きなコレクションを扱う場合は、この明示的解放を怠ると、AutoCADの動作が著しく遅くなったり、最悪の場合クラッシュしたりする原因となります。

Sub ProcessAndReleaseXrefs()
Dim acadApp As AutoCAD.Application
Dim acadDoc As AutoCAD.Document
Dim acadXref As AcadXRef
Dim xrefs As AcadXRefs ‘ Collection of AcadXRef objects

On Error Resume Next
Set acadApp = GetObject(, “AutoCAD.Application”)
If acadApp Is Nothing Then Exit Sub
Set acadDoc = acadApp.ActiveDocument
If acadDoc Is Nothing Then Exit Sub

‘ 外部参照コレクションを取得
Set xrefs = acadDoc.ExternalReferencesCollection

‘ ループ処理の前に、コレクション全体を直接参照する
Dim i As Long
For i = 1 To xrefs.Count
‘ 各Xrefオブジェクトへの参照を一時変数で取得
Dim currentXref As AcadXRef
Set currentXref = xrefs.Item(i) ‘ または xrefs.GetObject(i-1) など、APIによって異なる場合がある

‘ ここで currentXref オブジェクトに対する処理を行う
‘ 例: Status プロパティのチェック、パスの更新など

‘ — 処理が終わったら、一時変数を解放 —
Set currentXref = Nothing

‘ AutoCADの描画更新を一時停止 (パフォーマンス向上)
acadApp.UpdateScreen = False
Next i

‘ ループ終了後、コレクション自体への参照も解放
Set xrefs = Nothing
‘ AutoCADの描画更新を再開
acadApp.UpdateScreen = True

‘ 最後に、アプリケーションとドキュメントへの参照も解放
Set acadDoc = Nothing
Set acadApp = Nothing
End Sub

4.2. AutoCADオブジェクトモデルの「負荷」を理解する

AutoCADのオブジェクトモデルは非常に強力ですが、その分、オブジェクトの生成やプロパティへのアクセスにはコストがかかります。

  • プロパティへのアクセス: `obj.Property` のようにプロパティにアクセスするたびに、COMインターフェイスを介したやり取りが発生します。ループ内で頻繁に同じプロパティにアクセスする場合は、一度変数に格納してから利用する方が効率的です。
  • メソッドの呼び出し: `obj.Method` のようなメソッド呼び出しも、同様にオーバーヘッドが発生します。
  • コレクションの操作: コレクションの `Count` プロパティをループ内で何度も参照したり、`Add` や `Remove` を頻繁に行ったりすると、パフォーマンスに影響します。

【パフォーマンス向上のための戦略】

1. 必要なオブジェクトは一時変数に格納: ループ内で頻繁にアクセスするオブジェクトは、ループに入る前に一度変数に格納し、その変数を通じてアクセスします。
2. 描画更新の無効化 (`Application.UpdateScreen = False`): 大量のオブジェクト操作や図面更新を行う際は、画面描画を一時的に無効化し、処理完了後に再度有効化します。これは劇的なパフォーマンス向上をもたらします。
3. `ThisDrawing.Regen` の抑制: `Regen` は図面全体を再計算するため、非常に重い処理です。自動化スクリプト内で意図せず `Regen` が実行されないように注意し、必要な場合のみ明示的に呼び出します。
4. VBA vs VB.NET / .NET API: レガシー環境の保守という観点ではVBAは依然として重要ですが、大規模な処理や複雑なシステム連携においては、VB.NETやAutoCADの.NET APIの使用を検討すべきです。.NET APIは、COMよりも効率的なオブジェクトアクセスや、より高度なメモリ管理機能を提供します。

5. レガシー環境の保守とシステム間連携の極限:自動修復パイプラインの構築

サーバー移行、CAD規約の変更、あるいは単なるパスの typo。これらによって引き起こされる外部参照のリンク切れを、単発のスクリプトで対応するだけでは、真の「自動化」とは言えません。我々が目指すべきは、「参照関係を維持したまま、正常に保存し直す」ための、堅牢な自動修復パイプラインです。

5.1. 自動修復パイプラインの構成要素

1. トリガー:

  • ファイルサーバーへのファイルアップロード時(ファイル監視ツール、SharePoint連携など)
  • バッチ処理として定期実行(タスクスケジューラ + VBA実行コマンド)
  • ユーザーからの手動実行(専用のVBAインターフェース)

2. 自動解決モジュール:

  • リンク切れXrefの検知(`XrefStatus = acXrefFileNotFound`)
  • 新しいパスの特定(ルールベース、ファイル検索、DB連携)
  • `AcadXRef.Path` プロパティの更新
  • `Application.ActiveDocument.ResolveXRefs` の(必要に応じた)呼び出し
  • 更新されたXrefをロード (`AcadXRef.Load` メソッド)

3. 保存・検証モジュール:

  • 図面を新しいバージョンで保存(`Document.SaveAs`)
  • 保存後、再度Xrefの状態をチェックし、解決されていることを確認
  • 処理結果のログ出力(成功、失敗、対象ファイル、エラー詳細など)

4. エラーハンドリングと通知:

  • 解決できなかったXrefに対するフォールバック処理(例:ユーザーへの通知、警告レイヤーの追加)
  • 処理全体の失敗時の管理者への通知(メール、Slack連携など)

5.2. VB.NET と Windows API を用いた高度な連携例

VBAだけでは限界がある場合、VB.NET (.NET API) と Windows API の連携が強力な武器となります。例えば、ネットワーク上のファイルパスの存在チェックや、アクセス権の確認といった、より低レベルな操作は、.NET Frameworkの機能やWindows APIを直接呼び出すことで、より効率的かつ堅牢に実装できます。

.net
‘ VB.NET での外部参照パス更新の抜粋 (AutoCAD .NET API + Windows API)
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports System.IO
Imports System.Runtime.InteropServices

Public Class XrefManager

‘ Windows API宣言 (例: ファイル存在チェック)

Public Shared Function GetFileAttributes(ByVal lpFileName As String) As Integer
End Function

Public Const INVALID_FILE_ATTRIBUTES As Integer = -1

‘ ファイル存在チェック関数
Public Function FileExists(filePath As String) As Boolean
Return GetFileAttributes(filePath) <> INVALID_FILE_ATTRIBUTES
End Function

‘ 外部参照パスを更新するメソッド
Public Function UpdateXrefPath(ByVal doc As Document, ByVal xrefName As String, ByVal newPath As String) As Boolean
Try
Using transaction As Transaction = doc.Database.TransactionManager.StartTransaction()
Dim xrefTable As XrefTable = doc.Database.XrefTable
Dim xrefEntry As XrefEntry = xrefTable.GetXrefEntry(xrefName)

‘ 新しいパスが有効かチェック
If Not FileExists(newPath) Then
Log.Error($”外部参照 ‘{xrefName}’ の新しいパス ‘{newPath}’ が存在しません。”)
Return False
End If

‘ パスが既に正しい場合は更新しない
If xrefEntry.PathName.Equals(newPath, StringComparison.OrdinalIgnoreCase) Then
Return True
End If

‘ パス名を更新
xrefEntry.PathName = newPath
xrefTable.Insert(xrefEntry) ‘ 更新されたエントリを再挿入 (または Update メソッドがあればそちらを使用)

transaction.Commit()
Log.Info($”外部参照 ‘{xrefName}’ のパスを ‘{newPath}’ に更新しました。”)

‘ 参照をロードし直す (必要に応じて)
‘ doc.SendCommand(“._XLOAD “”{0}”””, xrefName) ‘ コマンドライン経由は非推奨
‘ より直接的なAPIがあればそちらを使用

Return True
End Using
Catch ex As Exception
Log.Error($”外部参照 ‘{xrefName}’ のパス更新中にエラーが発生しました: {ex.Message}”)
Return False
End Try
End Function

‘ リンク切れした外部参照を検索し、パスを更新するメイン処理
Public Sub ResolveAndRemapAllXrefs(doc As Document, Optional newBaseDir As String = “”, Optional oldBaseDir As String = “”)
Dim resolvedCount As Integer = 0
Dim failedCount As Integer = 0

Try
‘ リンク切れした外部参照を特定
Dim brokenXrefs As New List(Of Tuple(Of String, String)) ‘ (Name, OldPath)
Using transaction As Transaction = doc.Database.TransactionManager.StartTransaction()
Dim xrefTable As XrefTable = doc.Database.XrefTable
For Each xrefEntry As XrefEntry In xrefTable
‘ File.Exists は .NET の機能だが、AutoCAD の XrefTable.EntryStatus で直接チェックする方が確実
‘ If Not File.Exists(xrefEntry.PathName) Then ‘ ここがリンク切れの直接的なチェックになる
‘ brokenXrefs.Add(New Tuple(Of String, String)(xrefEntry.Name, xrefEntry.PathName))
‘ End If

‘ AutoCAD の XrefTableEntry.Status プロパティで状態を取得するのがより正確
‘ Status は XrefEntryStatus 列挙型
If xrefEntry.Status = XrefEntryStatus.FileNotFound Then
brokenXrefs.Add(New Tuple(Of String, String)(xrefEntry.Name, xrefEntry.PathName))
End If
Next
End Using

If brokenXrefs.Count = 0 Then
Log.Info(“リンク切れした外部参照は見つかりませんでした。”)
Return
End If

Log.Info($”{brokenXrefs.Count} 件のリンク切れした外部参照が見つかりました。”)

‘ 各リンク切れした外部参照に対してパスを解決・更新
For Each brokenXref In brokenXrefs
Dim xrefName As String = brokenXref.Item1
Dim oldPath As String = brokenXref.Item2
Dim newPath As String = “”

‘ ここで新しいパスを特定するロジックを実装 (VBAのRemapXrefPath関数に相当)
‘ 例: newPath = YourPathResolutionLogic(xrefName, oldPath, newBaseDir, oldBaseDir)

If Not String.IsNullOrEmpty(newPath) Then
If UpdateXrefPath(doc, xrefName, newPath) Then
resolvedCount += 1
Else
failedCount += 1
End If
Else
Log.Warning($”外部参照 ‘{xrefName}’ の新しいパスを特定できませんでした。”)
failedCount += 1
End If
Next

‘ 変更を保存
doc.Database.SaveAs(doc.Database.Filename, DwgVersion.Current) ‘ Current は最新バージョン
Log.Info($”図面 ‘{doc.Name}’ を保存しました。解決: {resolvedCount} 件、失敗: {failedCount} 件。”)

Catch ex As Exception
Log.Error($”外部参照の自動解決処理中に予期せぬエラーが発生しました: {ex.Message}”)
End Try
End Sub

‘ ログ出力用 (簡略版)
Private Class Log
Public Shared Sub Info(message As String)
Console.WriteLine($”[INFO] {message}”)
End Sub
Public Shared Sub Warning(message As String)
Console.WriteLine($”[WARN] {message}”)
End Sub
Public Shared Sub Error(message As String)
Console.WriteLine($”[ERROR] {message}”)
End Sub
End Class

‘ パス解決ロジックのプレースホルダー
Private Function YourPathResolutionLogic(xrefName As String, oldPath As String, newBaseDir As String, oldBaseDir As String) As String
‘ ここに、VBAのRemapXrefPath関数に相当する、
‘ ルールベースのリマッピングやファイル検索ロジックを実装します。
‘ Windows APIや.NETのSystem.IOクラスを駆使して、
‘ 堅牢なパス解決を実現してください。
Return “” ‘ 仮実装
End Function

End Class

【VB.NET / .NET API の利点】

  • パフォーマンス: C# や VB.NET は、VBA よりも一般的に高速に実行されます。
  • メモリ管理: .NET のガベージコレクションは、VBA の手動解放よりも洗練されています。
  • 豊富なAPI: ファイルシステム操作、ネットワーク通信、データベースアクセスなど、より高度な機能を利用できます。
  • 例外処理: より構造化された例外処理が可能です。

6. まとめ:伝説は、進化し続ける

外部参照のリンク切れ問題は、AutoCAD を利用する上で避けては通れない道だ。しかし、今回解説したような、Windows API の深奥、オブジェクトのライフサイクル管理の鉄則、そしてシステム連携のパイプライン構築といった、高度な知見があれば、この難題も克服できる。

VBA は、レガシーシステムを保守し、既存の資産を最大限に活用するための強力なツールである。しかし、その限界もまた存在する。君たちが直面する問題の複雑さに応じて、VBA、VB.NET、そしてAutoCAD の .NET API を適切に使い分けることが、真のプロフェッショナルへの道だ。

この知識を、君たちの開発現場で、そして日々の保守業務で、ぜひ活かしてほしい。そして、さらに深遠な技術の探求を続けることを、この伝説のチーフアーキテクトとして、君たちに期待する。

—
(※本記事は、AutoCAD VBA および .NET API の開発経験が豊富なプロフェッショナルを対象としており、一部のコード例は概念実証(PoC)として記述されています。実際の運用には、十分なテストとエラーハンドリングの実装が必要です。)

タイトルとURLをコピーしました