Product Documentation

Forward PathシナリオでのEffort Calculator変数の使用

Jul 08, 2016

このトピックでは、Forward PathシナリオでのEffort Calculator変数の使用について紹介します。 例を使用して、これらの機能の使用方法を紹介します。

Effort Calculator変数について

Effort Calculatorでは、(AppDNAレポートにより表される)対象のプラットフォームに展開するための、アプリケーションポートフォリオの修復に関連する費用と作業を見積もります。 計算には主に2つの種類の変数を使用します。

  • ユーザー定義の変数 – テスト要員、修復要員、およびプロジェクトマネージャーの1日あたりの費用、通常の稼働日の稼働時間、さまざまな複雑度(単純、標準、複雑)のアプリケーションの、修復アクションの難易度(容易、中度、困難)を考慮に入れた修復平均時間などの値を格納します。 これらの変数は、[Effort Calculator]画面でAppDNAレポートごとに個別に設定できます。
  • アプリケーションレベルの変数 – AppDNA解析に由来し、アプリケーションの持つファイルとレジストリエントリの数に基づくアプリケーションの複雑度と、選択したレポートにおいてアプリケーションの修復に必要なアクションの難易度を含みます。

Effort Calculatorではこの情報を使用して、エンタープライズアプリケーションポートフォリオを新しいプラットフォームに移行するための費用を見積もります。 このリリースでは、たとえば、各アプリケーションの修復費用を見積もるために、これらの変数をForward Pathシナリオで使用できるようになりました。 このトピックでは、その方法を比較的単純な例を挙げて説明します。 AppDNA組み込みのサンプルシナリオには、より複雑で洗練されている例が含まれます。

Effort Calculator変数と使用方法について詳しくは、「Effort Calculator」を参照してください。

ユーザー定義のEffort Calculator変数の取得

ユーザー定義のEffort Calculator変数にアクセスするには、 EffortCalculatorSettings オブジェクトを使用します。このオブジェクトは ホスト オブジェクトを使用して取得します。 デバイスが ホスト オブジェクトはシナリオスクリプト全体で暗黙的に使用できます。 以下の抜粋ではWindows 7レポートのために EffortCalculatorSettings オブジェクトを取得しています。

Private Dim vars As EffortCalculatorSettings  ' Get the Windows 7 Effort Calculator settings object.       vars = Host.GetEffortCalculatorSettings("Win7Module")

Windows 7のEffort Calculator変数を取得するために、Windows 7の内部レポートIDを使用したことに注目してください。 レポートIDの一覧については、「修復レポートビューへのリンク作成」を参照してください。

EffortCalculatorSettings オブジェクトのすべてのプロパティが、[Forward Path Logic Editor]画面の右側のプロパティエクスプローラーに表示されます。 プロパティ名は、[Effort Calculator]画面の変数に表示されるテキストと密接な関係があります。 たとえば、 AppStagingHours プロパティは、[Effort Calculator]画面のStaffing変数セクションのStaging time変数に対応しています。 以下の例ではこの変数を使用します。

これらの変数の値をシナリオで使用するために、次のようにしてそのシナリオ内で設定できます。

vars.TesterStagerCostPerDay = 23
注:これによりEffort Calculatorで使用される変数が変更されたり上書きされたりすることはありません。

例について

Forward Pathシナリオで2種類のEffort Calculator変数を使用してアプリケーションの修復費用の見積もりを計算する方法について、シナリオ例を使用して手順ごとに説明します。 理解を容易にするため、段階的にシナリオを構築します。

これはシナリオ例によって作成される出力画面です。

注:このトピックの例では、長い行を複数行に分割するためにアンダースコア(_)表記を使用します。 これにより、例のコードスニペットがPDF上で正しく表示されます。 この表記について詳しくは、MSDNライブラリを参照してください。

変数の初期化

AppDNAには次のForward Pathシナリオ関数があります。 Initialize() この関数をシナリオに指定すると、処理の開始点で自動的に呼び出されます。 これを使用して、後でシナリオ内で使用する変数を初期化します。 Initialize() 関数について詳しくは、「グループ化Forward Pathレポート」を参照してください。

Initialize() 関数の前に、スクリプトの初めから終わりまで使用するいくつかの変数を宣言します。

' Declare variables for use throughout the script. Private Dim vars As EffortCalculatorSettings Private Dim testingPerHour As Decimal = 0 Private Dim remediationPerHour As Decimal = 0

以下が Initialize() 関数を示します。

Public Overrides Sub Initialize()      ' Get the Windows 7 Effort Calculator settings object.          vars = Host.GetEffortCalculatorSettings("Win7Module")     ' Calculate the testing and remediation cost per hour.    testingPerHour = vars.TesterStagerCostPerDay / _       vars.NormalAppTestingHours    remediationPerHour = vars.RemediatorCostPerDay / _       vars.NormalAppTestingHours     ' Sort the report in descending order of cost.    Settings.ApplicationSortBy = "Cost"    Settings.ApplicationSortDescending = true End Sub

1時間あたりのテストおよび修復費用を計算することに注目してください。 1日あたりのテストまたは修復費用を表す変数の値を、通常の1日の稼働時間を表す変数の値で割ることによってこの処理を行います。

Initialize() 関数の最後に、[Cost]列の値の並べ替え順序を降順に設定します。 アプリケーションの修復とユーザー承認テスト(UAT)の準備のために算出した費用をこの列に表示します。

メイン関数

以下がメイン関数である ForwardPath() 関数によって生成される各レポートグループで呼び出します。 レポートの実行時に選択される各アプリケーションに対して、AppDNAによりこの関数が自動的に1回呼び出されます。 例の後で内容を説明します。

Public Function ForwardPath(ByVal currentApplication _    As Application) As Output         Dim result As New Output()     ' We will use three custom columns.    result.CustomField1.Name = "Application Complexity"    result.CustomField2.Name = "Action RAG"    result.CustomField2.Value = _       currentApplication.Modules.Windows7.ActionRAG    result.CustomField3.Name = "Action Complexity"     ' Set the culture on the Cost column to US English,    ' so that the US dollar currency symbol is used.    result.Display.Cost.Culture = "en-US"      ' Test the application's main RAG status, because    ' the remediation depends on this.    Select Case currentApplication.Modules.Windows7.RAG        Case Rag.Green           ' The RAG is green, so no remediation is necessary          ' and the application can be staged for UAT.          result.Outcome = "Stage UAT"          result.RAG = RAG.Green           ' No remediation is required, so the cost is of           ' the staging only.          result.Cost = testingPerHour * vars.AppStagingHours          result.CustomField3.Value = "--"           ' Convert the unfriendly application complexity          ' "RAG" to a text.          Select Case currentApplication.Complexity             Case RAG.Red                result.CustomField1.Value = "Complex"             Case RAG.Amber                result.CustomField1.Value = "Medium"             Case RAG.Green                result.CustomField1.Value = "Simple"          End Select        Case Rag.Amber           ' The RAG is amber, so the application needs            ' remediation.          result.RAG = RAG.Amber          result.Outcome = "Remediate"           ' The cost calculation is more complicated,          ' so we will do it in a separate "GetCost()"          ' function.          result.Cost = GetCost(currentApplication, result)        Case Rag.Red           ' The RAG is red - we need to check the action          ' RAG to see if remdiation is possible.            result.RAG = RAG.Red           ' If the action RAG is red, the application          ' cannot be remediated.          If (currentApplication.Modules.Windows7.ActionRAG = _             RAG.Red) Then              result.Outcome = "Redevelop"             result.CustomField3.Value = "Hard"              ' Convert the unfriendly application complexity             ' "RAG" to a text and set an arbitrary             ' replacement/redevelopment cost.             Select Case currentApplication.Complexity                Case RAG.Red                   result.CustomField1.Value = "Complex"                   result.Cost = 3000                Case RAG.Amber                   result.CustomField1.Value = "Medium"                   result.Cost = 2000                Case RAG.Green                   result.CustomField1.Value = "Simple"                   result.Cost = 1000             End Select           ' The action RAG is not red, so remediation is          ' possible.          Else             result.Outcome = "Remediate"             result.Cost = GetCost(currentApplication, result)          End If        Case Else           ' Catch all for applications that have not been          ' analyzed or that are locked.          result.Outcome = "Unknown"          result.RAG = RAG.Unknown          result.CustomField1.Value = "--"          result.CustomField3.Value = "--"          result.Cost = 0     End Select     result.Display.SourcePath.Visible = false     ForwardPath = result  End Function

この関数が3つのカスタム列( CustomFieldn)の設定から始まることに注目してください。これらは、前の出力画面の右端の3つの列です。 これらは以下のように使用します。

表示内容
CustomField1 アプリケーションの複雑度です。 Forward Pathはこれを赤、黄、緑のRAGとして格納します。 これらの値をスクリプト内でComplex、Medium、Simpleというテキストに変換します。
CustomField2 アプリケーションのアクションRAGです。 この値は Application.Modules.Windows7.ActionRAG プロパティを使用します。
CustomField3 アプリケーションの修復アクションの難易度です。 この列の値は後でスクリプト内で取得します。

[Cost]列は自動的に通貨形式で表示されます。 Forward Pathではデフォルトで、ユーザーのコンピューターの地域の設定に合わせた通貨記号が使用されます。 国際的な環境では、レポートを表示するユーザーのデバイス設定に応じて、通貨記号が変化する可能性があるということを意味します (たとえば、フランスのユーザーにはユーロ記号、イギリスのユーザーにはポンド記号、アメリカ合衆国のユーザーにはアメリカドル記号が表示される可能性があります)。そのため、この例ではユーザーの地域設定に関係なくアメリカドル記号が表示されるように、アメリカドル記号を指定します。 これを行うには、 Culture プロパティを [Cost] 列で「en-US」に設定します。この設定値はアメリカ合衆国を示します。

この関数の本体は Select Case 文から構成されます。この文は、アプリケーションのWindows 7に関するRAG状態をテストし、その状態に応じて異なる処理を提供します。 各値の制御方法を説明します。

  • 緑のRAG – アプリケーションをそのままUATにかけることができます。 1時間あたりのテスト費用( Initialize()で計算)に、アプリケーションのテストの準備にかかる時間数を表すEffort Calculator変数を掛けることによって、アプリケーションの準備費用を計算します。 修復は不要なので、アクションの複雑度を「--」に設定します。また、別の Select Case 文を使用してアプリケーションの複雑度をテストし、使いにくい「RAG」値をテキストに変換します。
  • 黄色のRAG – アプリケーションの修復が必要です。 修復費用を計算するために GetCost() 関数を呼び出して修復費用を計算します。 すぐ後でこの処理について説明します。
  • 赤のRAG – まずアクションRAGをテストします。 その状態が赤である場合は、アプリケーションは修復できず、再開発または置き換えが必要であることを意味します。 次に Select Case 文を使用して、緑のRAGについて行ったようにアプリケーションの複雑度をテストします。 ただし、今回はアプリケーションの複雑度に基づいて、任意の置き換え費用を設定します。 修復できるアプリケーション(アクションRAGが緑または黄色)については、 GetCost() 関数を呼び出して修復費用を計算します。
  • ほかのRAG値 – ほかのすべてのRAG値は Case Else 文を使用して制御します。 この文によって、解析前およびロックされている(ライセンスされていない)アプリケーションを制御します。

修復費用の計算

以下が GetCost() 関数です。この関数をメイン関数内で呼び出して、修復できる黄色および赤のアプリケーションの修復費用を計算しました。 例の後で内容を説明します。

Private Function GetCost(app As Application, _    cols As Output) As Decimal     Dim remediationCost As Decimal = 0    Dim testingCost As Decimal = 0     ' 1. Using the triggered algorithms, get the    ' algorithm with the hardest action. We will use this     ' in our calculations.    Dim maxAlgorithm As TriggeredRule = _       (From r in app.TriggeredRules _       Where r.ModuleIdentifier = "Win7Module" _       Where r.Action.Complexity = ActionComplexity.Hard Or _       r.Action.Complexity = ActionComplexity.Medium Or _       r.Action.Complexity = ActionComplexity.Easy _       Order By r.Action.Complexity Descending _       Select r).FirstOrDefault()     ' 2. Display the algorithm's action complexity.    cols.CustomField3.Value = maxAlgorithm.Action.Complexity     ' 3. The remediation cost depends on the application     ' complexity.    Select Case app.Complexity        ' A complex application.       Case RAG.Red           cols.CustomField1.Value = "Complex"           ' The remediation cost also depends on          ' the complexity of the action. So we will          ' calculate the time based on the number of          ' hours held in the Effort Calculator matrix.          Select Case maxAlgorithm.Action.Complexity             Case ActionComplexity.Easy                remediationCost = remediationPerHour * _                   vars.ComplexAppEasyRemediationHours             Case ActionComplexity.Medium                remediationCost = remediationPerHour * _                   vars.ComplexAppMediumRemediationHours             Case ActionComplexity.Hard                remediationCost = remediationPerHour * _                   vars.ComplexAppHardRemediationHours             Case Else                remediationCost = remediationPerHour * _                   vars.ComplexAppMediumRemediationHours          End Select           If app.Modules.Windows7.ActionRAG = RAG.Amber Then              ' Add the additional post-remediation testing             ' because the application has an amber action RAG.             testingCost = testingPerHour * _                vars.ComplexAppTestingHours                     End If        ' A medium-complexity application.       Case RAG.Amber           cols.CustomField1.Value = "Medium"           Select Case maxAlgorithm.Action.Complexity             Case ActionComplexity.Easy                remediationCost = remediationPerHour * _                   vars.NormalAppEasyRemediationHours             Case ActionComplexity.Medium                remediationCost = remediationPerHour * _                   vars.NormalAppMediumRemediationHours             Case ActionComplexity.Hard                remediationCost = remediationPerHour * _                   vars.NormalAppHardRemediationHours             Case Else                remediationCost = remediationPerHour * _                   vars.NormalAppMediumRemediationHours          End Select            If app.Modules.Windows7.ActionRAG = RAG.Amber Then              ' Add the additional post-remediation testing             ' because the application has an amber action RAG.             testingCost = testingPerHour * _                vars.NormalAppTestingHours                     End If        ' A simple application.       Case RAG.Green           cols.CustomField1.Value = "Simple"           Select Case maxAlgorithm.Action.Complexity             Case ActionComplexity.Easy                remediationCost = remediationPerHour * _                   vars.SimpleAppEasyRemediationHours             Case ActionComplexity.Medium                remediationCost = remediationPerHour * _                   vars.SimpleAppMediumRemediationHours             Case ActionComplexity.Hard                remediationCost = remediationPerHour * _                   vars.SimpleAppHardRemediationHours             Case Else                remediationCost = remediationPerHour * _                   vars.SimpleAppMediumRemediationHours          End Select                If app.Modules.Windows7.ActionRAG = RAG.Amber Then              ' Add the additional post-remediation testing             ' because the application has an amber action RAG.             testingCost = testingPerHour * _                vars.SimpleAppTestingHours                     End If     End Select     ' 4. Add the remediation and testing costs,    ' and the cost of staging for UAT.    GetCost = remediationCost + testingCost + _       (testingPerHour * vars.AppStagingHours)  End Function

以下の注は、前の例に含まれるコメントの番号に対応しています。

1. 現在のアプリケーションのWindows 7 TriggeredRules プロパティを使用します。 このプロパティは TriggeredRule オブジェクトのコレクションで、Windows 7のための解析中にアプリケーションによってトリガーされるすべてのアルゴリズムを表します。 このコレクションから最も困難な修復アクションを持つアルゴリズムを取得します。 それを使用してアプリケーションの修復費用を計算します。

2. CustomField3にアルゴリズムの修復アクションの難易度を表示します。 CustomField3

3. 次に Select Case 文を再度使用してアプリケーションの複雑度をテストします。 複雑度に応じて異なる処理を提供します。 複雑なアプリケーションの制御方法を説明します。

  • 最初に、もう1つの Select Case 文を使用して、手順1で取得したアルゴリズムに関連付けられているアクションの難易度をテストします。 次に、アクションの難易度別に修復費用を計算します。この計算は( Initialize()で計算した)1時間あたりの修復費用に、対応するアクション難易度のアプリケーションの修復にかかる時間を表すEffort Calculator変数を掛けることによって行います。
  • 次に、アクションRAGが黄色かどうかを確認します。黄色の場合は、アプリケーションの修復後に追加のテストが必要であることを意味するからです。 アクションRAGが黄色の場合のテスト費用の計算は、( Initialize()で計算した)1時間あたりのテスト費用に、複雑なアプリケーションのテストにかかる時間を表すEffort Calculator変数を掛けることによって行います。

複雑度が標準および単純のアプリケーションのコードは複雑なアプリケーションのコードと似ていますが、それぞれ、標準および単純のアプリケーションのEffort Calculator変数を毎回選択します。

4. 最後に、計算した修復とテストの費用をアプリケーションのUAT準備費用に追加し、これを戻り値に設定します。

アプリケーションによってトリガーされるすべてのアルゴリズムに関連付けられたアクションを考慮に入れて修復費用を計算する例について、AppDNAに付属するサンプルシナリオを参照してください。