>  > 15インチミラL275、285系ENKEI パフォーマンスライン PF07 ダークシルバー 5.0Jx15ヨコハマ エコス ES31 165/55R15
16インチ サマータイヤ セット【適応車種:インプレッサ(GD系 スポーツワゴン)】A-TECH シュナイダー スタッグ メタリックグレー 6.5Jx16プロクセス C1S 205/55R16

15インチミラL275、285系ENKEI パフォーマンスライン PF07 ダークシルバー 5.0Jx15ヨコハマ エコス ES31 165/55R15

MicroBatchFramework – クラウドネイティブ時代のC#バッチフレームワーク

Posted on

Cy#の河合です。昨年12月に、『MagicOnion』というライブラリのリリースを告知しました。今回、再びオープンソースライブラリとして、C#のためのCLI/Batchライブラリをリリースしました。

[GitHub – Cysharp/MicroBatchFramework]

.NET CoreになってWindows/Mac/Linux問わずクロスプラットフォームなアプリケーション開発環境として機能するようになったC#ですが、

15インチミラL275、285系ENKEI パフォーマンスライン PF07 ダークシルバー 5.0Jx15ヨコハマ エコス ES31 165/55R15 最高のサービスを提供する

送料無料 245/40R20インチ サマータイヤ ホイール 4本セット HANKOOK VentusV12evo2 ハンコック K120 LEWIS ルイス RB10 8.5J 5H114;【送料無料】 225/40R18 18インチ ENKEI エンケイ PF03 7.5J 7.50-18 DELINTE デリンテ DH2(限定) サマータイヤ ホイール4本セット 輸入車;【送料無料】 285/50R20 20インチ TWG メイヘム メタル 8103 9J 9.00-20 DUNLOP ダンロップ グラントレック PT3 サマータイヤ ホイール4本セット【DUsum19】

15インチミラL275、285系ENKEI パフォーマンスライン PF07 ダークシルバー 5.0Jx15ヨコハマ エコス ES31 165/55R15;15インチカローラ フィールダー140系 全グレードENKEI オール オールワン マシニングガンメタ 6.0Jx15SINCERA SN832i 195/65R15;17インチ サマータイヤ セット【適応車種:アテンザセダン(GH系 18インチ装着車)】WEDS レオニス NAVIA 06 マットブラックリムポリッシュ 7.0Jx17LEMANS V LM5 215/50R17;155/65R14 75H DUNLOP ダンロップ ENASAVE PREMIUM エナセーブ プレミアム ENKEI CREATIVE DIRECTION CDM2 エンケイ クリエイティブ ディレクション CD-M2 サマータイヤホイール4本セット;βTITANIUM ベータチタニウム その他外装関連パーツ フロントフォーク ピンチボルトキット カラー:ダンデライオンイエロー(陽極酸化処理) タイプ:テーパーキャップ ZX-14R (12-15)

スタッドレスタイヤ ブリヂストン ブリザック VRX2 245/45R18 100Q XL & エルエムスポーツ ファイナル 7.5-18 タイヤホイール4本セット 245/45-18 BRIDGESTONE BLIZZAK VRX2, サマータイヤ 215/35R19 85Y XL ハンコック ベンタス V12evo2 K120 レイズ ヴァルツ フォージド S5-R 8.0-19 タイヤホイール4本セット, VLUSTYJEWEL セルシオ 30前期 サイドステップ, スタッドレス 18インチ 225/50R18 ミシュラン エックスアイス XI3 ワーク エモーションCR極 W タイヤホイール4本セット 国産車 CH-R CHR, イーグル 縦つり用軽量クランプ E-500kg(3-20)【E500320】 販売単位:1台(入り数:-)JAN[-](イーグル 吊りクランプ) イーグル・クランプ(株)【05P03Dec16】 オルティア EL1.2 スプリング【アールエスアール】サスペンション オルティア EL3 2000 NA [08/2~11/6] Ti2000 DOWN フロントのみ

、そして機能的には十分揃っているのですが、ちょっと気の利いたフレームワークは意外と欠けているところがあります。バッチ・コマンドラインアプリ。というと地味なトピックスですが、ゆえに基本機能以上のサポートがなかったりします。しかし、「C#の可能性を切り開いていく」という理念を掲げるCy#としては、派手・地味を問わず、現状のC#に欠けているものを埋めていくことで、C#がアプリケーションを作る環境として、より良いものなるようにしたいと思っています。

15インチミラL275、285系ENKEI 18インチ パフォーマンスライン PF07 ダークシルバー 5.0Jx15ヨコハマ エコス ES31 NLP5# 165/55R15

すでにC#にはコマンドライン引数の解析ツールはたくさんあります。とはいえ、そもそもそういうツールを使う時は「コマンドライン引数の解析」がしたいわけではなくて 、「パラメータバインディング」をしたいのが一般的と思われます。ということで、『MicroBatchFramework』はウェブフレームワークのようにメソッドを呼び出してくれる仕様にしました。

class Program
{
 static async Task Main(string[] args)
 {
 // エントリポイント。この1行でフレームワークのStartup設定は終わりです。
 await BatchHost.CreateDefaultBuilder().RunBatchEngineAsync<MyFirstBatch>(args);
 }
}
// 実際のバッチの定義
public class MyFirstBatch : BatchBase // BatchBaseを継承してもらって
{
 // void(同期)かTask(非同期)の戻り値が設定可能、パラメータはどんな型も自由(JSONからマッピングします)
 public void Hello(string name, int repeat = 3)
 { 
 for (int i = 0; i < repeat; i++)
 {
 this.Context.Logger.LogInformation(

MicroBatchFramework – クラウドネイティブ時代のC#バッチフレームワーク

Posted on

Cy#の河合です。昨年12月に、『MagicOnion』というライブラリのリリースを告知しました。今回、再びオープンソースライブラリとして、C#のためのCLI/Batchライブラリをリリースしました。

[GitHub – Cysharp/MicroBatchFramework]

.NET CoreになってWindows/Mac/Linux問わずクロスプラットフォームなアプリケーション開発環境として機能するようになったC#ですが、そして機能的には十分揃っているのですが、ちょっと気の利いたフレームワークは意外と欠けているところがあります。バッチ・コマンドラインアプリ。というと地味なトピックスですが、ゆえに基本機能以上のサポートがなかったりします。しかし、「C#の可能性を切り開いていく」という理念を掲げるCy#としては、派手・地味を問わず、現状のC#に欠けているものを埋めていくことで、C#がアプリケーションを作る環境として、より良いものなるようにしたいと思っています。

CLIツールのためのフレームワーク

すでにC#にはコマンドライン引数の解析ツールはたくさんあります。とはいえ、そもそもそういうツールを使う時は「コマンドライン引数の解析」がしたいわけではなくて、「パラメータバインディング」をしたいのが一般的と思われます。ということで、『MicroBatchFramework』はウェブフレームワークのようにメソッドを呼び出してくれる仕様にしました。

class Program
{
 static async Task Main(string[] args)
 {
 // エントリポイント。この1行でフレームワークのStartup設定は終わりです。
 await BatchHost.CreateDefaultBuilder().RunBatchEngineAsync<MyFirstBatch>(args);
 }
}
// 実際のバッチの定義
public class MyFirstBatch : BatchBase // BatchBaseを継承してもらって
{
 // void(同期)かTask(非同期)の戻り値が設定可能、パラメータはどんな型も自由(JSONからマッピングします)
 public void Hello(string name, int repeat = 3)
 { 
 for (int i = 0; i < repeat; i++)
 {
 this.Context.Logger.LogInformation($"Hello My Batch from {name}");
 }
 }
}

これは `SampleApp.exe -name “foo” -repeat 5` で呼び出すことが可能、という仕様です。

// 引数に別名や説明をつけたり
public void Hello(
 [Option("n", "name of send user.")]string name,
 [Option("r", "repeat count.")]int repeat = 3)
{
 // ...omit
}
// サブコマンドの作成や、引数順番でもバインディングなどをサポート
[Command("escape")]
public void UrlEscape([Option(0)]string input)
{
 Console.WriteLine(Uri.EscapeDataString(input));
}

煩わしい定型的な引数の解析に悩まされることなく、メソッドだけ定義すれば、あとはすべてよしなにやってくれます。

.NET Coreで作成したアプリは、ランタイムのインストールも不要な実行ファイルを Windows/Linux/Mac向けに作ることができます。また、CIに関してもCircleCIのようなコンテナベースのCIを、他の言語と遜色なく利用することが可能です。例えば以下のような記述で、実行ファイル生成をCIに任せられます。

version: 2.1
executors:
 dotnet:
 docker:
 - image: mcr.microsoft.com/dotnet/core/sdk:2.2
 environment:
 DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
 NUGET_XMLDOC_MODE: skip
jobs:
 publish-all:
 executor: dotnet
 steps:
 - checkout
 - run: dotnet publish -c Release --self-contained -r win-x64 -o ./MicroBatchSample/win-x64
 - run: dotnet publish -c Release --self-contained -r linux-x64 -o ./MicroBatchSample/linux-x64
 - run: dotnet publish -c Release --self-contained -r osx-x64 -o ./MicroBatchSample/osx-x64
 - run: apt update && apt install zip -y
 - run: zip -r MicroBatchSample.zip ./MicroBatchSample
 - store_artifacts:
 path: MicroBatchSample.zip
 destination: MicroBatchSample.zip
workflows:
 version: 2
 publish:
 jobs:
 - publish-all

この辺りは、もはやC#だからといってWindowsに縛られたり、使えるシステムに制約があったりということはなく、自由に組み合わせていくことができる証左と言えるでしょう。

また、配布に関しては.NET CoreグローバルツールというNPM Global Toolsのような仕組みも用意されています。例えば以下のようなUlid生成のためのツールをMicroBatchFrameworkと.NET Coreグローバルツールで作ってみました。

これにより、dotnetコマンドが使える環境に対するCLIツールの配布、管理が容易になっています。

バッチのためのフレームワーク

C#とバッチはけっこう相性が良いと思っています。その最たるところは並列処理で、とりあえず実行時間かかりそうなものはParallelにするだけで、バッチ突き抜け率を大幅に低減することができます。

// これを
foreach(var item in foo)
{
// なんかたくさん処理する
}
// こうするだけ
Parallel.ForEach(item =>
{
// なんか色々やる
});

というのはともかく、実際にプロダクトで使うバッチ処理は複数、むしろ山のように用意することがほとんどだと思います。それらを単一のコンソールアプリケーションで効率よく管理できるように、クラスとメソッドを定義するだけで出し分けられるシステムを用意しました。

class Program
{
 static async Task Main(string[] args)
 {
 // <T>を渡さないと複数検索モードになる
 await BatchHost.CreateDefaultBuilder().RunBatchEngineAsync(args);
 }
}
// こんなクラスや
public class Foo : BatchBase
{
 // こんなメソッドや
 public void Echo(string msg)
 {
 this.Context.Logger.LogInformation(msg);
 }
 // こんなメソッドを
 public void Sum(int x, int y)
 {
 this.Context.Logger.LogInformation($"{x + y}"); 
 }
}
// こんなクラスを
public class Bar : BatchBase
{
 public void Hello2()
 {
 this.Context.Logger.LogInformation("H E L L O");
 }
}

このように、第1引数によって実行するメソッドを切り替えられます。

SampleApp.exe Foo.Echo -msg "aaaaa"
SampleApp.exe Foo.Sum -x 100 -y 200
SampleApp.exe Bar.Hello2

さて、こうして出来たアプリケーションは、コンテナ化するのをお薦めします。.NET CoreならばC#でもコンテナ化は簡単です。

FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS sdk
WORKDIR /workspace
COPY . .
RUN dotnet publish ./MicroBatchFrameworkSample.csproj -c Release -o /app
FROM mcr.microsoft.com/dotnet/core/runtime:2.2
COPY --from=sdk /app .
ENTRYPOINT ["dotnet", "MicroBatchFrameworkSample.dll"]

例えばこれをAWS ECRにCircleCIで上げるなら、以下のようなコンフィグになるでしょう。

version: 2.1
orbs:
 aws-ecr: circleci/aws-ecr@3.1.0
workflows:
 build-push:
 jobs:
 # see: https://circleci.com/orbs/registry/orb/circleci/aws-ecr
 - aws-ecr/build_and_push_image:
 repo: "microbatchsample"

非常にシンプルに書けるし、C#だからといって特別なことはなく、一般的なエコシステムに乗っているわけです。

こうして上がったコンテナは、あとはただのコンテナなので好きなように実行すればいいわけですが、例えばAWS Batchを使えば比較的シンプルに実行もスケジューリング(CloudWatchでイベントトリガを設定可能)も定義可能です。そして、ログはCloudWatchで標準出力が確認できます。

複雑なワークフローを定義したい場合は、別途LuigiApache Airflowが使えるはずです。

Swaggerによるウェブインターフェイス

開発時など、いちいちコマンド打って確認するのも面倒な場合もあるため、ウェブでホストする機能を付けました。スタートアップとして`RunBatchEngineAsync`の代わりに`RunBatchEngineWebHosting`を使うだけです。

public class Program
{
 public static async Task Main(string[] args)
 {
 await new WebHostBuilder().RunBatchEngineWebHosting("http://localhost:12345");
 }
}

これはSwaggerによってホストされるため、実行確認等が容易になります。

MicroBatchFrameworkの.NET的な新しさ

.NET Generic Hostの上にコンソールアプリケーションを構築するというのが、MicroBatchFrameworkの新しさです。

.NET Generic Hostは、標準的な仕組みとしてロギング/コンフィグ読み込み/DIをサポートしています。これによりコンフィグのマッピング、ロギングなどを標準的な作法でフルサポートしています。

// appconfig.json
{
 "Foo": 42,
 "Bar": true
}
class Program
{
 static async Task Main(string[] args)
 {
 await BatchHost.CreateDefaultBuilder()
 .ConfigureServices((hostContext, services) =>
 {
 // mapping config json to IOption<MyConfig>
 services.Configure<MyConfig>(hostContext.Configuration);
 })
 .RunBatchEngineAsync<MyFirstBatch>(args);
 }
}
public class MyFirstBatch : BatchBase
{
 IOptions<MyConfig> config;
 ILogger<MyFirstBatch> logger;
 // get configuration from DI.
 public MyFirstBatch(IOptions<MyConfig> config, ILogger<MyFirstBatch> logger)
 {
 this.config = config;
 this.logger = logger;
 }
 public void ShowOption()
 {
 logger.LogInformation(config.Value.Bar);
 logger.LogInformation(config.Value.Foo);
 }
}

これをやっているフレームワークって意外とないのです(なぜなら.NET Generic Host自体が最近出来た仕組みなので)。この辺りもまた「現状のC#に欠けているものを埋めていく」ということです。

まとめ

C#でも存外CLIツールを書きやすいな、と思ってもらえるとうれしいですね! ちゃんと全プラットフォームで動くので、C#でCLI書くのは大いにアリです。そしてまた、C#でも特別なことはなくCircleCIやDockerなどの普通のエコシステムに乗れているということが伝わるとなおうれしいです。

個人的には、サーバーレス(FaaS)は縛りがキツすぎて自由なアプリケーション開発にならないためあまり好きではありません。インフラを気にしたくないのは事実ですが、余計なSDK、ローカル開発におけるエミュレーターやランタイムによる起動の遅さなど、デメリットが多いと感じています。

理想は、シンプルなコンソールアプリケーションで書いてコンテナ化して、それがインフラを気にせず動いてくれるということであり、そしてその中で私がアプリケーション開発者として何よりも優先したいのが「シンプルなコンソールアプリケーション」であること。インフラ面ではAWS Batchのようなフルマネージドなものから、ちょっと学習も必要ですがマネージドKubernetesが主要クラウドサービスでは使えることもあり、理想的なイメージに近づいてきている印象があります。

FaaSに関しては、FaaSだからこそシンプルに実現できること以上のことはやりたくないし、そうじゃないやり方のために MicroBatchFrameworkが助けになれればと思っていますので、ぜひお試しください!

また、Cy#では、こうした次世代のC#の研究を「.NET Core」と「Unity」を主軸に行っています。ご興味のある方は、まずは私宛てにお問い合わせください。


© Cygames, Inc.
quot;Hello My Batch from {name}"); } } }

これは `SampleApp.exe -name “foo” -repeat 5` で呼び出すことが可能、という仕様です。

// 引数に別名や説明をつけたり
public void Hello(
 [Option("n", "name of send user.")]string name,
 [Option("r", "repeat count.")]int repeat = 3)
{
 // ...omit
}
// サブコマンドの作成や、引数順番でもバインディングなどをサポート
[Command("escape")]
public void UrlEscape([Option(0)]string input)
{
 Console.WriteLine(Uri.EscapeDataString(input));
}

煩わしい定型的な引数の解析に悩まされることなく 【国内生産】ベーシック フロアマット 三菱 ランサー(H15.02~H20.06)CS2用車種別設計 抗菌 防臭 防ダニ加工02P05Nov16、メソッドだけ定義すれば、あとはすべてよしなにやってくれます。

.NET Coreで作成したアプリは、ランタイムのインストールも不要な実行ファイルを Windows/Linux/Mac向けに作ることができます。また、CIに関してもCircleCIのようなコンテナベースのCIを、他の言語と遜色なく利用することが可能です。例えば以下のような記述で、実行ファイル生成をCIに任せられます。

version: 2.1
executors:
 dotnet:
 docker:
 - image: mcr.microsoft.com/dotnet/core/sdk:2.2
 environment:
 DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
 NUGET_XMLDOC_MODE: skip
jobs:
 publish-all:
 executor: dotnet
 steps:
 - checkout
 - run: dotnet publish -c Release --self-contained -r win-x64 -o ./MicroBatchSample/win-x64
 - run: dotnet publish -c Release --self-contained -r linux-x64 -o ./MicroBatchSample/linux-x64
 - run: dotnet publish -c Release --self-contained -r osx-x64 -o ./MicroBatchSample/osx-x64
 - run: apt update && apt install zip -y
 - run: zip -r MicroBatchSample.zip ./MicroBatchSample
 - store_artifacts:
 path: MicroBatchSample.zip
 destination: MicroBatchSample.zip
workflows:
 version: 2
 publish:
 jobs:
 - publish-all

この辺りは、もはやC#だからといってWindowsに縛られたり、使えるシステムに制約があったりということはなく、自由に組み合わせていくことができる証左と言えるでしょう。

また、配布に関しては.NET CoreグローバルツールというNPM Global Toolsのような仕組みも用意されています。例えば以下のようなUlid生成のためのツールをMicroBatchFrameworkと.NET Coreグローバルツールで作ってみました。

これにより、dotnetコマンドが使える環境に対するCLIツールの配布、管理が容易になっています。

バッチのためのフレームワーク

5.0Jx15ヨコハマ 15インチミラL275、285系ENKEI 15インチミラL275、285系ENKEI PF07 ダークシルバー ES31 ES31 エコス パフォーマンスライン 165/55R15

C#とバッチはけっこう相性が良いと思っています。その最たるところは並列処理で、とりあえず実行時間かかりそうなものはParallelにするだけで、バッチ突き抜け率を大幅に低減することができます。

// これを
foreach(var item in foo)
{
// なんかたくさん処理する
}
// こうするだけ
Parallel.ForEach(item =>
{
// なんか色々やる
});

というのはともかく ガナドール パジェロ ロングボディ 4WD Vertex CBA-V93W 左シングル サークル、実際にプロダクトで使うバッチ処理は複数、むしろ山のように用意することがほとんどだと思います。それらを単一のコンソールアプリケーションで効率よく管理できるように、クラスとメソッドを定義するだけで出し分けられるシステムを用意しました。

class Program
{
 static async Task Main(string[] args)
 {
 // <T>を渡さないと複数検索モードになる
 await BatchHost.CreateDefaultBuilder().RunBatchEngineAsync(args);
 }
}
// こんなクラスや
public class Foo : BatchBase
{
 // こんなメソッドや
 public void Echo(string msg)
 {
 this.Context.Logger.LogInformation(msg);
 }
 // こんなメソッドを
 public void Sum(int x, int y)
 {
 this.Context.Logger.LogInformation(

MicroBatchFramework – クラウドネイティブ時代のC#バッチフレームワーク

Posted on

Cy#の河合です。昨年12月に、『MagicOnion』というライブラリのリリースを告知しました。今回、再びオープンソースライブラリとして、C#のためのCLI/Batchライブラリをリリースしました。

[GitHub – Cysharp/MicroBatchFramework]

.NET CoreになってWindows/Mac/Linux問わずクロスプラットフォームなアプリケーション開発環境として機能するようになったC#ですが、そして機能的には十分揃っているのですが、ちょっと気の利いたフレームワークは意外と欠けているところがあります。バッチ・コマンドラインアプリ。というと地味なトピックスですが、ゆえに基本機能以上のサポートがなかったりします。しかし、「C#の可能性を切り開いていく」という理念を掲げるCy#としては、派手・地味を問わず、現状のC#に欠けているものを埋めていくことで、C#がアプリケーションを作る環境として、より良いものなるようにしたいと思っています。

CLIツールのためのフレームワーク

すでにC#にはコマンドライン引数の解析ツールはたくさんあります。とはいえ、そもそもそういうツールを使う時は「コマンドライン引数の解析」がしたいわけではなくて、「パラメータバインディング」をしたいのが一般的と思われます。ということで、『MicroBatchFramework』はウェブフレームワークのようにメソッドを呼び出してくれる仕様にしました。

class Program
{
 static async Task Main(string[] args)
 {
 // エントリポイント。この1行でフレームワークのStartup設定は終わりです。
 await BatchHost.CreateDefaultBuilder().RunBatchEngineAsync<MyFirstBatch>(args);
 }
}
// 実際のバッチの定義
public class MyFirstBatch : BatchBase // BatchBaseを継承してもらって
{
 // void(同期)かTask(非同期)の戻り値が設定可能、パラメータはどんな型も自由(JSONからマッピングします)
 public void Hello(string name, int repeat = 3)
 { 
 for (int i = 0; i < repeat; i++)
 {
 this.Context.Logger.LogInformation($"Hello My Batch from {name}");
 }
 }
}

これは `SampleApp.exe -name “foo” -repeat 5` で呼び出すことが可能、という仕様です。

// 引数に別名や説明をつけたり
public void Hello(
 [Option("n", "name of send user.")]string name,
 [Option("r", "repeat count.")]int repeat = 3)
{
 // ...omit
}
// サブコマンドの作成や、引数順番でもバインディングなどをサポート
[Command("escape")]
public void UrlEscape([Option(0)]string input)
{
 Console.WriteLine(Uri.EscapeDataString(input));
}

煩わしい定型的な引数の解析に悩まされることなく、メソッドだけ定義すれば、あとはすべてよしなにやってくれます。

.NET Coreで作成したアプリは、ランタイムのインストールも不要な実行ファイルを Windows/Linux/Mac向けに作ることができます。また、CIに関してもCircleCIのようなコンテナベースのCIを、他の言語と遜色なく利用することが可能です。例えば以下のような記述で、実行ファイル生成をCIに任せられます。

version: 2.1
executors:
 dotnet:
 docker:
 - image: mcr.microsoft.com/dotnet/core/sdk:2.2
 environment:
 DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
 NUGET_XMLDOC_MODE: skip
jobs:
 publish-all:
 executor: dotnet
 steps:
 - checkout
 - run: dotnet publish -c Release --self-contained -r win-x64 -o ./MicroBatchSample/win-x64
 - run: dotnet publish -c Release --self-contained -r linux-x64 -o ./MicroBatchSample/linux-x64
 - run: dotnet publish -c Release --self-contained -r osx-x64 -o ./MicroBatchSample/osx-x64
 - run: apt update && apt install zip -y
 - run: zip -r MicroBatchSample.zip ./MicroBatchSample
 - store_artifacts:
 path: MicroBatchSample.zip
 destination: MicroBatchSample.zip
workflows:
 version: 2
 publish:
 jobs:
 - publish-all

この辺りは、もはやC#だからといってWindowsに縛られたり、使えるシステムに制約があったりということはなく、自由に組み合わせていくことができる証左と言えるでしょう。

また、配布に関しては.NET CoreグローバルツールというNPM Global Toolsのような仕組みも用意されています。例えば以下のようなUlid生成のためのツールをMicroBatchFrameworkと.NET Coreグローバルツールで作ってみました。

これにより、dotnetコマンドが使える環境に対するCLIツールの配布、管理が容易になっています。

バッチのためのフレームワーク

C#とバッチはけっこう相性が良いと思っています。その最たるところは並列処理で、とりあえず実行時間かかりそうなものはParallelにするだけで、バッチ突き抜け率を大幅に低減することができます。

// これを
foreach(var item in foo)
{
// なんかたくさん処理する
}
// こうするだけ
Parallel.ForEach(item =>
{
// なんか色々やる
});

というのはともかく、実際にプロダクトで使うバッチ処理は複数、むしろ山のように用意することがほとんどだと思います。それらを単一のコンソールアプリケーションで効率よく管理できるように、クラスとメソッドを定義するだけで出し分けられるシステムを用意しました。

class Program
{
 static async Task Main(string[] args)
 {
 // <T>を渡さないと複数検索モードになる
 await BatchHost.CreateDefaultBuilder().RunBatchEngineAsync(args);
 }
}
// こんなクラスや
public class Foo : BatchBase
{
 // こんなメソッドや
 public void Echo(string msg)
 {
 this.Context.Logger.LogInformation(msg);
 }
 // こんなメソッドを
 public void Sum(int x, int y)
 {
 this.Context.Logger.LogInformation($"{x + y}"); 
 }
}
// こんなクラスを
public class Bar : BatchBase
{
 public void Hello2()
 {
 this.Context.Logger.LogInformation("H E L L O");
 }
}

このように、第1引数によって実行するメソッドを切り替えられます。

SampleApp.exe Foo.Echo -msg "aaaaa"
SampleApp.exe Foo.Sum -x 100 -y 200
SampleApp.exe Bar.Hello2

さて、こうして出来たアプリケーションは、コンテナ化するのをお薦めします。.NET CoreならばC#でもコンテナ化は簡単です。

FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS sdk
WORKDIR /workspace
COPY . .
RUN dotnet publish ./MicroBatchFrameworkSample.csproj -c Release -o /app
FROM mcr.microsoft.com/dotnet/core/runtime:2.2
COPY --from=sdk /app .
ENTRYPOINT ["dotnet", "MicroBatchFrameworkSample.dll"]

例えばこれをAWS ECRにCircleCIで上げるなら、以下のようなコンフィグになるでしょう。

version: 2.1
orbs:
 aws-ecr: circleci/aws-ecr@3.1.0
workflows:
 build-push:
 jobs:
 # see: https://circleci.com/orbs/registry/orb/circleci/aws-ecr
 - aws-ecr/build_and_push_image:
 repo: "microbatchsample"

非常にシンプルに書けるし、C#だからといって特別なことはなく、一般的なエコシステムに乗っているわけです。

こうして上がったコンテナは、あとはただのコンテナなので好きなように実行すればいいわけですが、例えばAWS Batchを使えば比較的シンプルに実行もスケジューリング(CloudWatchでイベントトリガを設定可能)も定義可能です。そして、ログはCloudWatchで標準出力が確認できます。

複雑なワークフローを定義したい場合は、別途LuigiApache Airflowが使えるはずです。

Swaggerによるウェブインターフェイス

開発時など、いちいちコマンド打って確認するのも面倒な場合もあるため、ウェブでホストする機能を付けました。スタートアップとして`RunBatchEngineAsync`の代わりに`RunBatchEngineWebHosting`を使うだけです。

public class Program
{
 public static async Task Main(string[] args)
 {
 await new WebHostBuilder().RunBatchEngineWebHosting("http://localhost:12345");
 }
}

これはSwaggerによってホストされるため、実行確認等が容易になります。

MicroBatchFrameworkの.NET的な新しさ

.NET Generic Hostの上にコンソールアプリケーションを構築するというのが、MicroBatchFrameworkの新しさです。

.NET Generic Hostは、標準的な仕組みとしてロギング/コンフィグ読み込み/DIをサポートしています。これによりコンフィグのマッピング、ロギングなどを標準的な作法でフルサポートしています。

// appconfig.json
{
 "Foo": 42,
 "Bar": true
}
class Program
{
 static async Task Main(string[] args)
 {
 await BatchHost.CreateDefaultBuilder()
 .ConfigureServices((hostContext, services) =>
 {
 // mapping config json to IOption<MyConfig>
 services.Configure<MyConfig>(hostContext.Configuration);
 })
 .RunBatchEngineAsync<MyFirstBatch>(args);
 }
}
public class MyFirstBatch : BatchBase
{
 IOptions<MyConfig> config;
 ILogger<MyFirstBatch> logger;
 // get configuration from DI.
 public MyFirstBatch(IOptions<MyConfig> config, ILogger<MyFirstBatch> logger)
 {
 this.config = config;
 this.logger = logger;
 }
 public void ShowOption()
 {
 logger.LogInformation(config.Value.Bar);
 logger.LogInformation(config.Value.Foo);
 }
}

これをやっているフレームワークって意外とないのです(なぜなら.NET Generic Host自体が最近出来た仕組みなので)。この辺りもまた「現状のC#に欠けているものを埋めていく」ということです。

まとめ

C#でも存外CLIツールを書きやすいな、と思ってもらえるとうれしいですね! ちゃんと全プラットフォームで動くので、C#でCLI書くのは大いにアリです。そしてまた、C#でも特別なことはなくCircleCIやDockerなどの普通のエコシステムに乗れているということが伝わるとなおうれしいです。

個人的には、サーバーレス(FaaS)は縛りがキツすぎて自由なアプリケーション開発にならないためあまり好きではありません。インフラを気にしたくないのは事実ですが、余計なSDK、ローカル開発におけるエミュレーターやランタイムによる起動の遅さなど、デメリットが多いと感じています。

理想は、シンプルなコンソールアプリケーションで書いてコンテナ化して、それがインフラを気にせず動いてくれるということであり、そしてその中で私がアプリケーション開発者として何よりも優先したいのが「シンプルなコンソールアプリケーション」であること。インフラ面ではAWS Batchのようなフルマネージドなものから、ちょっと学習も必要ですがマネージドKubernetesが主要クラウドサービスでは使えることもあり、理想的なイメージに近づいてきている印象があります。

FaaSに関しては、FaaSだからこそシンプルに実現できること以上のことはやりたくないし、そうじゃないやり方のために MicroBatchFrameworkが助けになれればと思っていますので、ぜひお試しください!

また、Cy#では、こうした次世代のC#の研究を「.NET Core」と「Unity」を主軸に行っています。ご興味のある方は、まずは私宛てにお問い合わせください。


© Cygames, Inc.
quot;{x + y}"); } } // こんなクラスを public class Bar : BatchBase { public void Hello2() { this.Context.Logger.LogInformation("H E L L O"); } }

このように RS-R サスペンション ヴォクシー ZRR70W 2000 NA [22/4~] RSR DOWN - 1台分、第1引数によって実行するメソッドを切り替えられます。

SampleApp.exe Foo.Echo -msg "aaaaa"
SampleApp.exe Foo.Sum -x 100 -y 200
SampleApp.exe Bar.Hello2

さて、こうして出来たアプリケーションは、コンテナ化するのをお薦めします。.NET CoreならばC#でもコンテナ化は簡単です。

FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS sdk
WORKDIR /workspace
COPY . .
RUN dotnet publish ./MicroBatchFrameworkSample.csproj -c Release -o /app
FROM mcr.microsoft.com/dotnet/core/runtime:2.2
COPY --from=sdk /app .
ENTRYPOINT ["dotnet", "MicroBatchFrameworkSample.dll"]

例えばこれをAWS ECRにCircleCIで上げるなら、以下のようなコンフィグになるでしょう。

version: 2.1
orbs:
 aws-ecr: circleci/aws-ecr@3.1.0
workflows:
 build-push:
 jobs:
 # see: https://circleci.com/orbs/registry/orb/circleci/aws-ecr
 - aws-ecr/build_and_push_image:
 repo: "microbatchsample"

非常にシンプルに書けるし、C#だからといって特別なことはなく 柿本改(カキモト) マフラー ホンダ オデッセイ hyper GT box Rev. 00/1~00/4 RA9 オデッセイ 3.0L (2WD/4WD)、一般的なエコシステムに乗っているわけです。

こうして上がったコンテナは、あとはただのコンテナなので好きなように実行すればいいわけですが、例えばAWS Batchを使えば比較的シンプルに実行もスケジューリング(CloudWatchでイベントトリガを設定可能)も定義可能です。そして、ログはCloudWatchで標準出力が確認できます。

複雑なワークフローを定義したい場合は、別途 カードでポイント最大34倍 3/21(木)20:00~3/26(火)1:59迄 DUNLOP ダンロップ WINTER MAXX 02 ウィンターマックス WM02 スタッドレス スタッドレスタイヤ 205/50R16 MANARAY Euro Speed G810 ホイールセット 4本 16インチ 16 X 6.5 +48 5穴 114.3 【送料無料】ショウエイ(SHOEI) ヘルメット J-CRUISE CLEAVE TC-1 レッド/ブラック M【代引不可】LuigiApache Airflowが使えるはずです。

Swaggerによるウェブインターフェイス

開発時など DAYTONA デイトナ ストロンガーチェーンロック 3.0m 95400、いちいちコマンド打って確認するのも面倒な場合もあるため、ウェブでホストする機能を付けました。スタートアップとして`RunBatchEngineAsync`の代わりに`RunBatchEngineWebHosting`を使うだけです。

public class Program
{
 public static async Task Main(string[] args)
 {
 await new WebHostBuilder().RunBatchEngineWebHosting("http://localhost:12345");
 }
}

これはSwaggerによってホストされるため、実行確認等が容易になります。

MicroBatchFrameworkの.NET的な新しさ

.NET Generic Hostの上にコンソールアプリケーションを構築するというのが、MicroBatchFrameworkの新しさです。

.NET Generic Hostは、標準的な仕組みとしてロギング/コンフィグ読み込み/DIをサポートしています。これによりコンフィグのマッピング、ロギングなどを標準的な作法でフルサポートしています。

// appconfig.json
{
 "Foo": 42,
 "Bar": true
}
class Program
{
 static async Task Main(string[] args)
 {
 await BatchHost.CreateDefaultBuilder()
 .ConfigureServices((hostContext, services) =>
 {
 // mapping config json to IOption<MyConfig>
 services.Configure<MyConfig>(hostContext.Configuration);
 })
 .RunBatchEngineAsync<MyFirstBatch>(args);
 }
}
public class MyFirstBatch : BatchBase
{
 IOptions<MyConfig> config;
 ILogger<MyFirstBatch> logger;
 // get configuration from DI.
 public MyFirstBatch(IOptions<MyConfig> config, ILogger<MyFirstBatch> logger)
 {
 this.config = config;
 this.logger = logger;
 }
 public void ShowOption()
 {
 logger.LogInformation(config.Value.Bar);
 logger.LogInformation(config.Value.Foo);
 }
}

これをやっているフレームワークって意外とないのです(なぜなら.NET Generic Host自体が最近出来た仕組みなので)。この辺りもまた「現状のC#に欠けているものを埋めていく」ということです。

まとめ

C#でも存外CLIツールを書きやすいな、と思ってもらえるとうれしいですね! ちゃんと全プラットフォームで動くので、C#でCLI書くのは大いにアリです。そしてまた、C#でも特別なことはなくCircleCIやDockerなどの普通のエコシステムに乗れているということが伝わるとなおうれしいです。

個人的には、サーバーレス(FaaS)は縛りがキツすぎて自由なアプリケーション開発にならないためあまり好きではありません。インフラを気にしたくないのは事実ですが、余計なSDK、ローカル開発におけるエミュレーターやランタイムによる起動の遅さなど、デメリットが多いと感じています。

理想は、シンプルなコンソールアプリケーションで書いてコンテナ化して、それがインフラを気にせず動いてくれるということであり、そしてその中で私がアプリケーション開発者として何よりも優先したいのが「シンプルなコンソールアプリケーション」であること。インフラ面ではAWS Batchのようなフルマネージドなものから、ちょっと学習も必要ですがマネージドKubernetesが主要クラウドサービスでは使えることもあり、理想的なイメージに近づいてきている印象があります。

FaaSに関しては、FaaSだからこそシンプルに実現できること以上のことはやりたくないし、そうじゃないやり方のために MicroBatchFrameworkが助けになれればと思っていますので、ぜひお試しください!

また、Cy#では、こうした次世代のC#の研究を「.NET Core」と「Unity」を主軸に行っています。ご興味のある方は、

15インチミラL275、285系ENKEI パフォーマンスライン PF07 ダークシルバー 5.0Jx15ヨコハマ エコス ES31 165/55R15

、まずは私宛てにお問い合わせください。


{yahoojp} {tech.cygames.co.jp}
{yahoojp}jpprem01-zenjp40-wl-zd-29286
{yahoojp}jpprem01-zenjp40-wl-zd-29286
{yahoojp}jpprem01-zenjp40-wl-zd-29286