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

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

Effort Calculator変数について

Effort Calculatorでは、ターゲットプラットフォーム(AppDNAレポートの1つで表される)のアプリケーションポートフォリオの修復にかかるコストと労力を見積もります。この計算では、主に次の 2 種類の変数を使用します。

  • ユーザー定義の変数 — テスター、是正者、プロジェクトマネージャの 1 日あたりのコスト、一般的な稼働日の時間数、複雑さの異なるアプリケーション(シンプル、ノーマル、コンプレックス)の修復に平均でかかった時間などの値を格納します。修復アクションの難易度(簡単、中、またはハード)。これらの変数は、Effort Calculator画面のAppDNAレポートごとに個別に設定できます。
  • アプリケーションレベルの変数 — AppDNA分析から導き出され、アプリケーションの複雑さ(アプリケーションのファイルとレジストリエントリの数に基づく)、および修復するために必要なアクションの難易度(または複雑さ)が含まれます。アプリケーションを選択します。

この情報を使用して、Effort Calculatorは、アプリケーション・ポートフォリオ全体を新しいプラットフォームに移行する際に予想されるコストを見積もります。Forward Pathシナリオでこれらの変数を使用できるようになりました。たとえば、各アプリケーションの修復にかかるコストを見積もる場合などです。このトピックでは、これを行う方法の比較的簡単な例を紹介します。AppDNAに付属するサンプルシナリオの1つに、より複雑で洗練された例があります。

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

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

EffortCalculatorSettings オブジェクトを使用して、ユーザー定義のEffort Calculator変数にアクセスできます。このオブジェクトは、Host オブジェクトから取得します。Host オブジェクトは、シナリオスクリプト全体で暗黙的に使用できます。次に、Windows 7 レポートの EffortCalculatorSettings オブジェクトを取得するスニペットを示します。

``` pre codeblock Private Dim vars As EffortCalculatorSettings

’ Get the Windows 7 Effort Calculator settings object. vars = Host.GetEffortCalculatorSettings(“Win7Module”)


Windows 7 の内部レポート識別子を使用して、Windows 7 のEffort Calculatorの変数を取得していることに注意してください。レポート ID のリストについては、[是正レポートビューへのリンクの作成](/ja-jp/dna/current-release/configure/forward-path/dna-forward-path-remediation-links.html)を参照してください。

EffortCalculatorSettings オブジェクトのすべてのプロパティは、[Forward Pathロジック・エディタ画面](/ja-jp/dna/current-release/configure/forward-path/dna-forward-path-logic-editor.html)の右側にあるプロパティエクスプローラに表示されます。プロパティの名前は、Effort Calculator 画面に表示される変数のテキストと密接に関連しています。たとえば、AppStagingHours プロパティは、\[Effort Calculator\] 画面の \[スタッフ変数\] セクションの \[ステージング時間\] 変数に対応します。この変数は、次の例で使用します。

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

``` pre codeblock
vars.TesterStagerCostPerDay = 23

注:Effort Calculatorで使用される変数は変更または上書きされません。

例について

2 種類の Effort Calculator 変数を使用して、Forward Path シナリオにおけるアプリケーションの修復にかかる見積もりコストを計算する方法を示すために、シナリオの例を順を追って説明します。理解しやすくするために、段階的にそれを構築します。

サンプルが作成する出力のスクリーンショットを次に示します。

出力例

注:このトピックの例では、長い行を 2 行以上に分割するためにアンダースコア (_) 表記を使用しています。これは、サンプルコードスニペットが PDF に含まれているときに正しくレンダリングされるためです。この表記の詳細については、 MSDN ライブラリを参照してください。

変数の初期化

AppDNAには、Initialize() と呼ばれるForward Pathシナリオ関数が含まれています。シナリオに存在する場合、AppDNAは処理の開始時に自動的にこれを呼び出します。これを使用して、シナリオの後半で使用する変数を初期化します。Initialize()関数の詳細については、グループ化されたForward Pathレポートを参照してください。

Initialize() 関数の前に、スクリプト全体で使用するいくつかの変数を宣言します。

``` pre codeblock ‘ 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() 関数は次のとおりです。

``` pre codeblock
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 日の変数の通常の勤務時間数に格納された値で除算します。

Initialize() 関数の最後に、ソート順を Cost 列の値の降順に設定します。このコラムでは、アプリケーションを修復し、UATのためにステージングするために計算されたコストを表示します。

主な機能

ここでは、メインForwardPath()関数があります。AppDNAは、レポートの実行時に選択されたすべてのアプリケーションに対して、これを1回自動的に呼び出します。例の後に説明の注記があります。

``` pre codeblock 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」として保存します。これらの値をスクリプト内の複雑/中/単純なテキストに変換します。 |
| CustomField2 | アプリケーションのアクション RAG。私たちは、アプリケーション.モジュール.Windows7.アクションRAGプロパティを使用して値を取得します。|
| CustomField3 | アプリケーションの修復アクションの複雑さ/難易度。このカラムの値を後でスクリプトで取得します。  |

\[コスト\] 列は、通貨形式で自動的に表示されます。既定では、Forward Path は、ユーザーのコンピューターの地域設定に通貨記号を使用します。国際環境では、通貨記号は、レポートを表示するユーザーのデバイス上の設定によって異なる可能性があることを意味します。(たとえば、フランスのユーザーのユーロ記号、イギリスのユーザーの英ポンド記号、米国のユーザーの米ドル記号を表示できます)。 したがって、この例では、ユーザーの地域設定に関係なく常に表示されるように、米ドル記号を指定します。これを行うには、\[Cost\] 列の \[Culture\] プロパティを \[en-US\] に設定します。これは米国を示します。

この関数の本体は、アプリケーションの Windows 7 の RAG ステータスをテストし、そのステータスに応じて異なる処理を提供する Select Case ステートメントで構成されます。各値をどのように処理するかを見てみましょう。

-  **グリーンRAG** — アプリケーションはUACに直接移動できます。そこで、1 時間あたりのテストのコスト (Initialize() で計算した) に、テストのためにアプリケーションをステージングするのにかかる時間数を格納する Effort Calculator 変数を掛けることによって、アプリケーションをステージングするコストを計算します。修復は必要ないため、アクションの複雑さを「—」に設定します。また、別の Select Case ステートメントを使用して、アプリケーションの複雑さをテストし、わかりやすい「RAG」値をテキストに変換します。
-  **黄色の RAG** — アプリケーションの修復が必要です。GetCost() 関数を呼び出して、修復コストを計算します。これについては、まもなく見ていきます。
-  **Red RAG** — まずアクションRAGをテストします。赤色の場合は、アプリケーションを修復できず、再開発または交換が必要であることを示します。次に、Select Case ステートメントを使用して、緑のRAGの場合と同様に、アプリケーションの複雑さをテストします。しかし、今回は、アプリケーションの複雑さに基づいて任意の交換コストを設定します。修復可能なアプリケーション(つまり、アクションRAGが緑または黄色)の場合は、GetCost() 関数を呼び出して修復コストを計算します。
-  **その他のRAG値** — Case Elseステートメントを使用して、他のすべてのRAG値を処理します。これは、分析されていないアプリケーションやロックされている(ライセンスされていない)アプリケーションを処理します。

## 修復コストを計算する

以下は GetCost() 関数です。この関数を main 関数で呼び出して、黄色のアプリケーションと修復可能な赤色のアプリケーションの修復コストを計算します。例の後に説明の注記があります。

``` pre codeblock
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 に表示します。

3. 次に、Select Case ステートメントを再度使用して、アプリケーションの複雑さをテストします。複雑さごとに異なる処理を提供します。複雑なアプリケーションをどのように処理するかを見てみましょう。

  • まず、別の Select Case ステートメントを使用して、手順 1 で取得したアルゴリズムに関連付けられたアクションの複雑さ (難易度) をテストします。次に、考えられるアクションの複雑さごとに、1 時間あたりの修復コスト (Initialize() で計算) に、対応するアクションの複雑さの複雑なアプリケーションの修復にかかる時間を表す Effort Calculator 変数を乗算して、修復コストを計算します。
  • 次に、アクションRAGが黄色であるかどうかを確認します。これは、修復の実装後にアプリケーションに追加のテストが必要であることを意味します。アクション RAG がオレンジの場合、テストコストは Initialize() で計算された 1 時間あたりのテストコストに、複雑なアプリケーションのテストにかかる時間を表す Effort Calculator 変数を乗算して計算されます。

中程度の複雑さと単純なアプリケーションのコードは、複雑なアプリケーションのコードを反映していますが、中程度のアプリケーションと単純なアプリケーションのEffort Calculator 変数を選択するたびに、それぞれです。

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

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