デプロイ可能な MATLAB コードの記述
MATLAB® コードをパッケージ化してデプロイするには、エラーを回避するためにコードが特定のガイドラインに従っている必要があります。MATLAB 関数から生成された API を使用してデプロイ済みの MATLAB コードにアクセスするアプリケーションを実装できます。
パッケージ化に使用可能なファイル タイプ
デプロイ アプリケーションを使用するパッケージ化で有効なファイル タイプと無効なファイル ファイプは次のとおりです。
ターゲット アプリケーション | 有効なファイルのタイプ | 無効なファイルのタイプ |
---|---|---|
スタンドアロン アプリケーション | MATLAB MEX ファイル、MATLAB スクリプト、MATLAB 関数、および MATLAB クラス ファイル。これらのファイルには単一のエントリ ポイントが必要です。 | 保護された関数ファイル ( |
ライブラリ コンパイラ | MATLAB MEX ファイル、MATLAB 関数、および MATLAB クラス ファイル。これらのファイルには単一のエントリ ポイントが必要です。 | MATLAB スクリプト、保護された関数ファイル ( |
MATLAB Production Server | MATLAB MEX ファイルおよび MATLAB 関数。これらのファイルには単一のエントリ ポイントが必要です。 | MATLAB スクリプト、MATLAB クラス ファイル、保護された関数ファイル ( |
パッケージ化されたアプリケーションは実行時に MATLAB ファイルを処理しない
コンパイラではコードが無断で変更されないように保護されます。デプロイ可能な MATLAB ファイルはコンパイルの時点で停止または凍結されます。これは柔軟なアプリケーションをデプロイできないということではなく、柔軟性を念頭に置いてアプリケーションを設計しなければならないことを意味します。たとえばエンド ユーザーが 2 つの異なる方法から選択できるようにする場合、デプロイ可能なアーカイブ内で両方の方法とも利用できなければなりません。
MATLAB Runtime は、デプロイ可能なアーカイブのビルド時に暗号化された MATLAB コードでのみ動作します。新しい MATLAB コードを動的に生成する関数またはプロセスは、MATLAB Runtime では機能しません。
Deep Learning Toolbox™ 製品など一部の MATLAB ツールボックスでは、MATLAB コードが動的に生成されます。MATLAB Runtime は暗号化された MATLAB ファイルのみを実行し、Deep Learning Toolbox は暗号化されていない MATLAB ファイルを生成するため、Deep Learning Toolbox の一部の関数はデプロイできません。
同様に、MATLAB 関数ファイルのコンテンツを調べる必要がある関数もデプロイできません。たとえば HELP
は動的なため、デプロイ モードでは使用できません。MATLAB 関数プロトタイプを共に提供すると、デプロイ モードで LOADLIBRARY
を使用できます。
MATLAB コードを生成する関数をコンパイルしてデプロイせずに、次のタスクを実行します。
MATLAB でコードを 1 回実行して、生成された関数を取得します。
MATLAB コードをパッケージ化し、生成された関数を含めます。
ヒント
EVAL
または FEVAL
を使用する代わりに、無名関数ハンドルを使用することもできます。
動的なランタイム処理を行うために MATLAB コードの作成機能が必要な場合、エンド ユーザーのコンピューターに MATLAB のコピーがインストールされていなければなりません。
デプロイするツールボックスの機能の適切なライセンスの入手
デプロイ可能な MATLAB コードの作成にツールボックスを使用する場合は、ツールボックスの有効な MathWorks® ライセンスがなければなりません。エンド ユーザーは、パッケージ化されたツールボックス コードを実行するためにライセンスを所有している必要はありません。
関数 isdeployed を使用して、デプロイ固有のコード パスを実行する
関数 isdeployed
を使用すると、MATLAB コードのどの部分がデプロイ可能でどの部分がデプロイ可能でないかを指定できます。そのように指定することで、コンパイルのエラーを減らし、効率的で維持可能なコードを作成しやすくなります。
たとえば、startup.m
を記述する場合、addpath
を使用することは避けられません。ismcc
と isdeployed
を使用することで、いつ何をパッケージ化し、実行するかを指定します。
if ~(ismcc || isdeployed) addpath(mypath); end
MATLAB ファイルの実行をディレクトリまたはパスの変更で制御しない
一般に、プログラミング手法では、コード内のプログラム検索パスを動的にリダイレクトしない方が良いとされています。多くの開発者は、通常コマンド ラインで実行されるアクションに似ているため、この動作を行いやすい傾向があります。ただし、これはコードをデプロイするときに、問題の原因となる可能性があります。
たとえば、デプロイ アプリケーションでは、MATLAB パスと Java パスは固定されており、変更できません。そのため、これらのパスを (cd
コマンドまたは addpath
コマンドを使用して) 変更しようとしても、失敗します。
addpath
の呼び出しを MATLAB コードに配置する以外に方法がない場合は、ismcc
および isdeployed
を使用してください。詳細については、関数 isdeployed を使用して、デプロイ固有のコード パスを実行するを参照してください。
デプロイ不可能な関数に依存するアプリケーションの段階的リファクタリング
isdeployed
を使用する、コンパイルやデプロイが不可能な関数の含まれた MATLAB コードを徐々にリファクタリングし、合理化し、モジュール化します。最終的な目標は、デプロイ不可能なコードを「正常に下位変換」していくことにあります。言い換えれば、コードがもつデプロイ時の障害を、エンド ユーザーに対してできるだけ減らしていき、最終的には実質的にそのような障害が無くなるようにしなければなりません。
コードを設計時コード セクションと実行時コード セクションに分割します。
"設計時コード" は現在まだ発展中のコードです。ほぼすべてのコードは、頻繁に書き換え、デバッグ、最適化を行う段階を経ていきます。Deep Learning Toolbox 製品のような一部のツールボックスでは、コードはさまざまなデータ置換やデータ パターンに反応して自己学習を重ねます。そのようなコードはほとんどの場合、デプロイを対象としたものではありません。
"実行時コード" は一方、固まっている、または安定しているコードです。完成した状態であり、エンド ユーザーによるデプロイを行う準備が整っています。
デプロイ対象ではないコードや、デプロイ不可能なコードを呼び出すコード用に別のディレクトリを作成することを検討してください。
一定でない静的状態変数を作成または使用しない
以下の使用は控えてください。
MATLAB コード内のグローバル変数
MEX ファイルの静的変数
Java コードの静的変数
これらの変数の状態は永続的であり、プロセス内のすべてで共有されます。
アプリケーションをデプロイするときに永続変数を使用すると、MATLAB Runtime プロセスが 1 つのスレッドで実行されるため、問題の発生することがあります。複数のこれらの一定しない静的変数を同じプロセスに読み込むことはできません。さらに、これらの静的変数はマルチスレッド アプリケーションではうまく機能しません。
パッケージ化後の MATLAB コードを念頭に置いてプログラミングするときには、新しいクラスのインスタンスごとに MATLAB Runtime のインスタンスが 1 つ作成されることを覚えておく必要があります。別の変数名を使用して同じクラスが再度インスタンス化されると、同じクラスの前のインスタンスによって作成された MATLAB Runtime インスタンスに追加されます。つまり、アセンブリに一意のクラスが n 個含まれている場合、MATLAB Runtime のインスタンスが最大 n 個生成され、そのそれぞれがクラスのいずれかの 1 つ以上のインスタンスに対応します。
静的変数を使用しなければならない場合は、インスタンスにバインドしてください。たとえば、Java クラスでインスタンス変数を定義した方が、変数を static
として定義するよりも好ましいと言えます。