「かごんま .NET 2020.06 便利なツール・ライブラリたち」に参加した

# TL;DR

- かごんま .NET 2020.06 便利なツール・ライブラリたち
    2020年6月17日
    https://kagoshima-dotnet.connpass.com/event/178521/

- 内容
    - [1. 紹介されたツール、モジュール](#1-紹介されたツールモジュール)
        - [1.1. Winget](#11-winget)
        - [1.2. Chocolatey](#12-chocolatey)
        - [1.3. Ansible（Azure環境構築の自動化）](#13-ansibleazure環境構築の自動化)
        - [1.4. CSVHelper](#14-csvhelper)
        - [1.5. CSVHelper.Excel](#15-csvhelperexcel)
            - [1.5.1. npoi](#151-npoi)
        - [1.6. Open XML SDK](#16-open-xml-sdk)
        - [1.7. Moq](#17-moq)
        - [1.8. Castle](#18-castle)
        - [1.9. AsyncEX](#19-asyncex)
        - [1.10. Hangfire](#110-hangfire)
            - [1.10.1. Hangfire Dashboard](#1101-hangfire-dashboard)
        - [1.11. Bogus](#111-bogus)
        - [1.12. Fluent Validation](#112-fluent-validation)
        - [1.13. CommandLine Parser](#113-commandline-parser)
        - [1.14. PostSharp](#114-postsharp)
        - [1.15. ReSharperコマンドラインツール](#115-resharperコマンドラインツール)
            - [1.15.1. ReSharperReports](#1151-resharperreports)
    - [2. その他](#2-その他)
        - [2.1. コードメトリックス](#21-コードメトリックス)
        - [2.2. ソフトウェア開発の原則](#22-ソフトウェア開発の原則)
            - [2.2.1. SOLIDの原則](#221-solidの原則)
            - [2.2.2. KISSの原則](#222-kissの原則)
            - [2.2.3. DRYの原則](#223-dryの原則)

# 1. 紹介されたツール、モジュール

## 1.1. Winget

https://qiita.com/tfukumori/items/1c6c6c691fdb5abe8856

Microsoft公式のコマンドラインパッケージマネージャーがリリース（2020年6月2日現在プレビュー版）
ソフトウェアの必要な場所からのダウンロードとインストールを自動化できる。最新バージョン（または指定した正確なバージョン）を検索してインストール

## 1.2. Chocolatey

https://qiita.com/kangetsu121/items/b6352b547cd32e71bc65

> Windowsでもコマンドラインでパッケージ管理可能なツール。
> - コマンドでソフトウェアインストール・アンインストール・更新
> - ソフトウェアインストール時に依存解決
> - 複数のソフトウェアをまとめて更新
> - インストール済みソフトウェアのリストをエクスポートして別マシンにインポート

## 1.3. Ansible（Azure環境構築の自動化）

https://docs.microsoft.com/ja-jp/azure/developer/ansible/overview

> Ansible を使用すると、仮想マシン、コンテナー、およびネットワークをプロビジョニングし、クラウド インフラストラクチャを完成させることができます。 また、Ansible を使用すると、環境でのリソースの展開と構成を自動化することもできます。

Azureの構築はansibleでコマンドを作成しておいたほうがよい。手順書を作成した場合に比べ、間違いを減らし同一環境の作成を自動化できる。

## 1.4. CSVHelper

https://github.com/JoshClose/CsvHelper

[C# > CSV取り込みを劇的に簡単にするCsvHelper](https://qiita.com/sugasaki/items/b0fb97b90ed948bae3ca)

CSV取り込みしたのち、**クラスにマッピング**してくれるライブラリ「CsvHelper」
改行の扱いだけであれば[Microsoft.VisualBasic.FileIO.TextFieldParser](https://docs.microsoft.com/ja-jp/dotnet/api/microsoft.visualbasic.fileio.textfieldparser?view=netcore-3.1)でもよいが、TextFieldParserと比べるとクラスマッピングまでしてくれるのが素晴らしい！
クラスメンバーの属性で取り込み対象の列、インデックスを指定する。


## 1.5. CSVHelper.Excel

https://github.com/youngcm2/CsvHelper.Excel

Excel読み込み時に使用する（旧版から移行後精力的に更新されている）

❌旧版 [christophano/CsvHelper.Excel](https://github.com/christophano/CsvHelper.Excel)

## 1.5.1. npoi

https://github.com/nissl-lab/npoi

.NET Standard 対応のWord / Excel読み込みライブラリ。POI Java プロジェクトの .NET 版。 Apache-2.0 License

## 1.6. Open XML SDK

https://docs.microsoft.com/ja-jp/office/open-xml/open-xml-sdk

Microsoft公式のOfficeで読み書きできるOffice Open XML ファイル形式を扱うことができるSDKです。

## 1.7. Moq

https://qiita.com/usamik26/items/42959d8b95397d3a8ffb

テストダブル（＝単体テスト用の代役オブジェクト）を簡単に作るためのライブラリ。

テスト対象の依存オブジェクトが、ネットワーク通信が必要・データベースアクセスが必要など、外部に依存する場合、そのままでは単体テストを作りにくいです。
これを解決するために、実際のオブジェクトの代わりを用意できる。

## 1.8. Castle

[【連載】ASP.NET Web API を使おう：第6回 Castle.Core DynamicProxy で AOP](https://www.nuits.jp/entry/web-api-castle-core)

> 例えばWeb APIを作成する場合、提供する（ほとんど）全てのAPIに、ほぼ同じ要求が求めらるでしょう。
> 
> ユーザー認証
> トランザクション管理
> ロギング処理
> 例外処理
> などです。これらを地道に実装すると、全てのAPIのメソッドが、共通のコードとtry-catchの山になってしまいます。当然全てのメソッドで上にあげた共通処理をすべてテストする必要もあります。AOPを利用することでこれらの問題を解決する事ができるます。
> 
> 具体的には、メソッド呼び出しをインターセプトしてメソッドの呼び出し前後に共通処理を編み込む感じです。

## 1.9. AsyncEX

https://github.com/StephenCleary/AsyncEx

[いまさら恥ずかしくてAsyncをawaitした](https://www.slideshare.net/kekyo/asyncawait)
> モニター系・カーネルオブジェクト系の同期処理を模倣し、非同期対応にしたライブラリです。await可能なlockとして使える AsyncSemaphoreを使えば、 同時進行するタスク数を制御可能


## 1.10. Hangfire

https://docs.hangfire.io/en/latest/

[Hangfireで実現する.NETアプリのバックグランドジョブ](https://user-first.ikyu.co.jp/entry/2018/12/19/130646)

.NET環境で利用できるバックグラウンドジョブのライブラリ。

ASP.NETでウエブアプリを作成した場合に、処理をある程度の粒度で切り出して、応答を返すプロセスとは別のプロセスで処理したい場合に使用する。例えば、予約完了処理の中でメール送信部分だけを別のプロセスで処理する、など。

### 1.10.1. Hangfire Dashboard

[Using Dashboard — Hangfire Documentation](https://docs.hangfire.io/en/latest/configuration/using-dashboard.html)

バックグラウンド ジョブに関するすべての情報を確認できる。
基本的には開発時に使用する。

動作環境では別の方法を検討したほうが良い。

## 1.11. Bogus

https://github.com/bchavez/Bogus

[【.NET】BogusとCsvHelperでダミーデータのCSVを生成する](https://blog.jhashimoto.net/entry/2018/07/09/205601)

ダミーデータを生成するライブラリ。

日本語にも対応しており、名前、住所、電話番号など様々なデータを作成することができる。

## 1.12. Fluent Validation

https://fluentvalidation.net/

検証コードをFluent（流れるように、連続して）で.でつなげて書くことができる。

```cs
public class CustomerValidator : AbstractValidator<Customer> {
  public CustomerValidator() {
    RuleFor(x => x.Surname).NotEmpty();
    RuleFor(x => x.Forename).NotEmpty().WithMessage("Please specify a first name");
    RuleFor(x => x.Discount).NotEqual(0).When(x => x.HasDiscount);
    RuleFor(x => x.Address).Length(20, 250);
    RuleFor(x => x.Postcode).Must(BeAValidPostcode).WithMessage("Please specify a valid postcode");
  }

  private bool BeAValidPostcode(string postcode) {
    // custom postcode validating logic goes here
  }
}
```

## 1.13. CommandLine Parser

https://qiita.com/skitoy4321/items/742d143b069569014769

コンソールアプリを作成する際に使用する、コマンドライン引数の処理を扱いやすくすることができるツール

## 1.14. PostSharp

https://www.postsharp.net/

[C#のAOPライブラリ（PostSharp） - Status Code 303 - See Other](http://kouki-hoshi.hatenablog.com/entry/2017/06/21/023159)

> AOP(Aspect Oriented Programming)？
> ログ出力や例外処理など、メソッド全体に共有な処理を重複定義せず一か所に定義したいことがある。
> 
> もし、全部それぞれにコピペなどで定義しまった場合。
> その部分に修正が入った場合、全てのメソッドを直さないといけなくなり、保守性が低下する。
> さらに、本来クラスにさせたい処理でないため、コードの見通しや可読性が低下する。
> 
> このような共有処理を側面(Aspect)として定義した後、メソッドに適用する手法。

> PostSharpはC#では有名なAOPライブラリ。本来は有料だが、Expressエディションを使えば適用数が制限されるが、無料で実行できる。（プロジェクト単位：最大10個、ソリューション：最大50個）

> どんなとき使うの？
> - プロパティ値が変更されたときの通知
> - UndoとRedo
> - 契約プログラミング（事前条件/事後条件確認）
> - ログ・監視・プロファイリング
> - 例外発生時の制御
> - トランザクション制御
> - マルチスレッド時の挙動制御（バックグランド・フォアグランド制御、不変性・同期など）
> - セキュリティ（入力チェック、認証など）

## 1.15. ReSharperコマンドラインツール

https://www.jetbrains.com/ja-jp/resharper/features/command-line.html

> Visual Studioの外部で多数のReSharperコードインスペクションを実行し、さらに、コードの重複を発見する、無料のスタンドアロン型コマンドラインツールセットです。 このツールはReSharperをインストールしなくても使用でき、継続的インテグレーションまたはコード品質管理サーバーと統合できます。

### 1.15.1. ReSharperReports

https://www.nuget.org/packages/ReSharperReports/

ReSharperのレポートを作成するためのツール

# 2. その他

## 2.1. コードメトリックス

https://qiita.com/ozlee/items/64edb1cddab3a5a0bdb6

## 2.2. ソフトウェア開発の原則

### 2.2.1. SOLIDの原則

https://postd.cc/solid-principles-every-developer-should-know/

- S：SRP、単一責任の原則
- O：OCP、解放閉鎖の原則
- L：LSP、リスコフの置換原則
- I：ISP、インタフェース分離の原則
- D：DIP、依存性逆転の原則

### 2.2.2. KISSの原則

https://ja.wikipedia.org/wiki/KISS%E3%81%AE%E5%8E%9F%E5%89%87

### 2.2.3. DRYの原則

https://ja.wikipedia.org/wiki/Don%27t_repeat_yourself