nawatech 20131123
DESCRIPTION
2013/11/23 NAWA Tech にて利用したスライドTRANSCRIPT
WF で夢見る世界 Ahf(小尾 智之)
自己紹介
魂の VB 使い
WF メイニア
CLR/H スタッフ
てすとぶろぐ http://blogahf.blogspot.jp/
@twit_ahf
Tomoyuki.Obi @IT エンジニアライフ
地方からの戯言
プロレス好き
DDT / BJW / K-DOJO
本日のアジェンダ
Workflow Foundation 概略
WF で運用管理
Workflow Foundation
WPF や WCF と同じく
.NET Framework コンポーネント
直観的な
デザイナ
WF 3.x と
WF 4.x
アクティビティと
ワークフロー
サービスの作成
• アクティビティ
デザイナー
• ワークフロー
サービス
WF と 関連技術
WCF WPF
• 永続化機構
(標準提供)
SQL Server
• ワークフロー
サービス
IIS
WF を利用している製品
SharePoint
BizTalk
TFS
~2010 は WF 3.x
2013 は WF 4.x
2010~ は WF 4.x
2010~ は WF 4.x
WF を利用しているコンポーネント
PowerShell PowerShell 3.0 より利用
PowerShell は内部で WF 4.x を利用
PowerShell Workflow は PowerShell のスクリプトをワークフロー化させて WF ランタイム上で動作
WF ワークフローは PowerShell で呼び出し / 実行可能
PowerShell のコマンドレットは
WF アクティビティとしても提供
WF と PowerShell Workflow
Workflow
Foundation
PowerShell
Workflow workflow Get-Sample
{
Dir
}
実行
Xaml に変換
WF と PowerShell Workflow
Workflow
Foundation
PowerShell
Workflow
実行
LoadModule で読込
Workflow
Foundation
実行は WF 上
WF と PowerShell Workflow
Workflow
Foundation
PowerShell
Workflow
PowerShell のスクリプト
WF のワークフロー
どちらを利用しても同様のことが可能
どちらを利用しても相互変換可能
次世代の WF
Workflow
Manager
Workflow のホスティングを行うアプリケーション
オンプレミス/クラウド上を問わずに簡易に
ワークフローホスティングを行うアプリケーション
IIS の設定等が不要
セキュリティ要件が厳しめに変更され
WF 4.x アクティビティの一部が利用不可
基本演算を行うアクティビティなどが大量に追加
別名 Azure Workflow Services
WF 3.x と 4.x
WF 3.x のデザイナーは
流れを表す
WF 4.x のデザイナーは
流れと設定を表す
WF 3.x と 4.x
3.x と 4.x はクラス構成も
変更され全くの別物
基底クラスから全て異なる
3.x で実装された処理を
4.x で利用する特殊措置
Interop アクティビティ
CodePrex で移行キットを提供
基本は作り直し
WF 3.x を利用してないのなら
気にしないのが幸せです
WF 4.x での主な改善点
WF 3.x よりもパフォーマンス向上
全面的に向上しすぎ
今まではなんだったんだ
http://msdn.microsoft.com/ja-jp/library/gg281645.aspx
参考:MSDN:Windows Workflow Foudation 4 のパフォーマンス
アクティビティとワークフロー
アクティビティ
アクティビティ
アクティビティ
アクティビティ
アクティビティ
アクティビティ
アクティビティ
アクティビティ
アクティビティ
ビルド ビルド
アクティビティを設置したワークフローをビルドすることで
ワークフロー自体がアクティビティとなり再利用できる
アクティビティデザイナー
WPF によるユーザー
コントロール作成と同じ
Express 環境の場合は ActivityDesigner クラスを
利用するよう xaml を書き換えることで作成可能
デザイナーのメリット
WPF 画面の作成と同様 WPF でできることは
同じく実現可能
デザイナー上での入力 プロパティダイアログを
見なくても設定可能
インテリセンス対応 WF 固有の ExpressionTextbox
ではインテリセンス自作可能
WF サービス
WF サービスプロジェクトの初期状態
メッセージの受信と結果の送信が既に用意されている
間に処理を挟むことで
サービスとして作成
スクリプト資産
MS-DOS
VBS
WSH
PowerShell
似ていても微妙に
違うスクリプトの
大量発生
スクリプト資産
MS-DOS
VBS
WSH
PowerShell
スクリプト改修には
知識が必要なケース
スクリプト資産
MS-DOS
VBS
WSH
PowerShell
スクリプトを
ラップする中間層
何を利用しているかを
意識する必要がない
プログラム 開発では
よく利用する方法
スクリプトのラップ
ラップする方法は多種多様
既存スクリプトを Process.Start で実行
.NET のライブラリを利用
MS-DOS VBS WSH PowerShell
スクリプトを
ラップする中間層
どの方法を用いても良いが
ラップする手法自体は統一しておくと楽
運用管理の基本形
WMI
WMF
エージェント
アプリ
ケーション
運用管理するためのベース
WMF のリリースによって楽になっているがWMI ベースは変化していない
WMF PowerShell
WinRM
WMI
WinRS
WMI を利用するアクティビティ
WMI を直接操作
スクリプトを実行
PowerShell のクラスを利用
Dim objWMIResult
Dim objLocator
Dim objService
Dim objWMIClass
Dim strPCName
'ローカルコンピュータに接続しクエリを実行する
objLocator = WScript.CreateObject("WbemScripting.SWbemLocator")
objService = objLocator.ConnectServer
objWMIResult = objService.ExecQuery("Select * From Win32_ComputerSystem")
‘結果の取得
For Each objWMIClass In objWMIResult
strPCName = objWMIClass.Name
Next
ローカルのホスト名取得
VBS スクリプト
Get-WmiObject Win32_ComputerSystem | select Name
ローカルのホスト名取得
PS スクリプト
Imports System.Activities
Imports System.Management
Public Class WMIComputerSystem
Inherits CodeActivity(Of String)
Protected Overrides Function Execute(context As CodeActivityContext) As String
Dim result = ""
Dim wmScope As New ManagementScope("¥¥" + My.Computer.Name + "¥root¥cimv2")
wmScope.Connect
Dim wmQuery As New ObjectQuery("SELECT * FROM Win32_ComputerSystem")
Using searcher As New ManagementObjectSearcher(wmScope, wmQuery)
Using queryCollection = searcher.Get()
For Each wmResult In queryCollection
result = wmResult("Name").ToString
Exit For
Next
End Using
End Using
Return result
End Function
End Class
ローカルのホスト名取得
WF4 アクティビティ
作成したアクティビティをワークフローに配置し実行
実行結果は問題ないが
見た目で処理がわかりにくい
見た目の分かりやすさ
日本語で記述するだけでイメージが変わる
見た目の分かりやすさ
WF4.5 からは注釈を設定でき
より見た目で理解しやすく
アクティビティデザイナーは WPF
ワークフローデザイナーは WPF 上で動作するので
アクティビティデザイナーも当然 WPF で動作する
WPF アプリケーションでできることは
WF のアクティビティデザイナーでも実現可能
音声を流すデザイナーも作成できるので
利用を補助する「声によるコメント」も可能
WMI プロバイダの作成
System Center は WMI プロバイダから値を
取得するのをサポートしているのでプロバイダを
自作することで色々なものを監視することができる
WMI プロバイダ
基幹システム 3rdパーティ製品
既存監視
スクリプト
WMI だけでは
難しい監視
WMI プロバイダ
アプリケーションから WMI に情報を配信するための仕組みが用意されており
独自に実装することができる
分離型
• セルフホスト型
• 実行中のみ可能
• 管理者権限が必要
インプロセス型
• WMI サービスホスト
• 常に利用可能
• GAC への配置が必要
作成したアセンブリを
InstallUtil.exe で登録する必要がある
管理者権限で実行
インプロセス型の場合GAC に登録が必要
アセンブリの署名必須
Imports System.Management.Instrumentation
Public Class Form1
Private wmiProvider As New SampleWMIProvider(Diagnostics.Process.GetCurrentProcess.Id)
Private executeTimer As System.Threading.Timer = Nothing
Private Sub Closed(sender As Object, e As FormClosedEventArgs) Handles Me.FormClosed
InstrumentationManager.Revoke(wmiProvider)
End Sub
Private Sub Form1_Shown(sender As Object, e As System.EventArgs) Handles Me.Shown 'タイマーにて1秒ごとにテキストボックスの内容を出力
executeTimer = New Timer(New TimerCallback(AddressOf OutputData), Nothing, 0, 1000) ' WMI プロバイダの公開
InstrumentationManager.Publish(wmiProvider)
End Sub
Private Sub OutputData()
wmiProvider.DisplayText = TextBox1.Text
End Sub
End Class
Imports System.Management.Instrumentation
Imports System.ComponentModel
''' <summary>WMI プロバイダインストーラクラス</summary>
<RunInstaller(True)>
Public Class SampleWMIProviderInstaller
Inherits DefaultManagementInstaller
End Class
インストーラクラス
入力用フォーム
Imports System.Management.Instrumentation
' アセンブリに対しての WMI 設定指定
<Assembly: WmiConfiguration("root/clrh",
HostingModel:=ManagementHostingModel.Decoupled,
IdentifyLevel:=False)>
<ManagementEntity(name:="clrh")> <ManagementQualifier("Description", Value:="サンプル WMI プロバイダで誰でも利用可能です")>
Public Class SampleWMIProvider
#Region "プロパティ定義"
<ManagementKey()> <ManagementQualifier("Description", value:="プロセス Id を取得します")>
Public Property Id As Integer
<ManagementConfiguration()> <ManagementQualifier("Description", value:="表示されている文字列を取得します")>
Public Property DisplayText As String
#End Region
#Region "コンストラクタ"
Public Sub New(ByVal Id As Integer)
Me.Id = Id
End Sub
#End Region
End Class
WMI プロバイダ
WF で運用管理
WF サービス
監視情報を公開するサービスの提供
監視アクティビティ
ワークフロー
情報を公開する土壌を WF で作成することで
見た目に理解しやすい形になるのでカスタマイズの
難易度も低下できる
WF サービスとストアアプリ
ストアアプリで手軽に外部サービスを
利用する方法がサービス参照
.NET アプリしか接続できない
WF を組み合わせることでストアアプリの
監視ツールを作成するのが容易に
「できる人を増やす」ために
専門的
直観的
大小混ぜた粒度
• 見た目で処理の概要がわかるよう
• 適度なコメント
• 汎用さは多くの指定が必要に
• 無駄が生み出す理解しやすさ
• 部品の粒度はこだわらなくて良い
• 小回りが利く≠利用しやすい
最初のうちは処理の中身まで知る必要はなく
「なんとなく」でもできるようになるのを優先
まとめ
既存資産を置き換える必要はなく WF でラッピングすることにより利用しやすく
WF はコードを書かない非開発者向け
開発者視点で WF を利用する利点はなく
いかに他の人に利用しやすくするか
スクリプトを書くよりも敷居が低いので
処理を作成する難易度を下げられる
理想は「全員が技術に精通すること」だが
そこを目指すために WF でまずは使わせることも
一つの手段としてはありだと思います。
Appendix
The Activity Designer (http://blogs.msdn.com/b/tilovell/)
AppFabric Team Blog(旧 The .NET EndPoint) (http://blogs.msdn.com/b/appfabric/)
MS 松崎さん Blog (http://blogs.msdn.com/b/tsmatsuz/)
てすとぶろぐ (http://blogahf.blogspot.com/)
恐らく退職などでもう更新されていない MSDN Blog Matt W's Windows Workflow Place
(http://blogs.msdn.com/b/mwinkle/)
Go with the Flow (http://blogs.msdn.com/b/flow/)
Cathy Dumas’s Blog (http://blogs.msdn.com/b/cathyk/)
Kushal Shah – Workflows (http://blogs.msdn.com/b/kushals/)