C#向けAtCoder提出環境の構築手順（Windows + WSL2 + online-judge-tools + atcoder-cli）


### 1. はじめに
- 業務でC#.NET開発しているため、再学習を兼ねてC#.NETでAtCoderに挑戦します
- 本記事では、**Windows環境でWSL2を利用して、C#の競技プログラミング環境をセットアップする方法**を紹介します

### 2. 前提条件
- **Windows 10/11**（WSL2対応）
- **WSL2**のインストールが済んでいること  
  WSL2上にはUbuntu20.04.6LTSが動いています
- **VS CodeのWSL拡張**経由の利用をする
  ```bash
  $ lsb_release -a
  No LSB modules are available.
  Distributor ID: Ubuntu
  Description:    Ubuntu 20.04.6 LTS
  Release:        20.04
  Codename:       focal
  ```

### 3. WSL2のインストールのこと（もし未導入の場合）
- **WSL2**のインストールには、WindowsをWSL2が起動可能な状態にする必要があります
- 手順は他の記事を参照ください。（Windowsの機能から有効化、必要なパッケージのインストール）
- なお、本記事ではUbuntu 20.04.6 LTSを利用しました。Ubuntu最新バージョン（例えば24.XX）もありますが、後述する`online-judge-tools`導入時に初期導入されたPythonのバージョンが高いため、手戻りを避けるために、ここでは20.04.6 LTSを選択しています

### 4. 必要なツールのインストール
#### 4.1. **npmの設定**
- `atcoder-cli`を導入する際に必要なので、`npm`をインストールします

  ```bash
  $ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash
  $ source ~/.nvm/nvm.sh  # ターミナル再起動でも可
  $ nvm install node
  $ npm install -g npm
  ```

#### 4.2. **pip3の設定**
- `online-judge-tools`を導入する際に必要なので、`pip3`をインストールします

  ```bash
  $ sudo apt update
  $ sudo apt install python3-pip
  ```

#### 4.3. **online-judge-toolsのインストール**
- `online-judge-tools`は、AtCoderなどのオンラインジャッジに対応したCLIツールです
- インストール方法は、`pip3`でインストールする手順です

  ```bash
  $ pip3 install online-judge-tools
  ```

  - 動作確認のためのコマンド実行例(ヘルプが表示されるか？)
  ```bash
  $ oj -h
  ```
#### 4.4. **atcoder-cliのインストール**
- `atcoder-cli`（AtCoder専用のCLIツール）をインストールする方法は以下の通りです

  ```bash
  $ npm install -g atcoder-cli
  ```
  - 動作確認のためのコマンド実行例(ヘルプが表示されるか？)
  ```bash
  $ acc -h
  ```

### 5. C#のセットアップ
#### 5.1. **.NET SDKのインストール**
- C#で競技プログラミングを行うために、WSL2上に`.NET SDK 7`をインストールします

  ```bash
  $ curl -O -L -s https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb
  $ sudo dpkg -i packages-microsoft-prod.deb
  $ sudo apt update && sudo apt install -y apt-transport-https
  $ sudo apt install dotnet-sdk-7.0
  ```

- 動作確認は、以下のコマンドでインストールバージョンを確認できます
  ```bash
  $ dotnet --version
  ```

#### 5.2. **IDE（エディタ）の準備**
- WSL2（Ubuntu）上で**Visual Studio Code**を使用するために導入したVsCodeの拡張機能
  - 必要な拡張機能（C#用拡張など）のインストール
  　拡張機能は以下のもの導入
 　`C# Dev Kit`, `C# v2.55.29`
  - `Remote - WSL`拡張を使って、WSL内の環境を直接操作する
    拡張機能はWSLを導入して利用
    
### 6. AtCoderでのC#の使用方法
#### 6.1. **事前準備（ログインしておく）**
- 動作確認は、以下のコマンドでAtcoderへログインを実施します、IDとPWを聞かれます
- コマンドはWSL上のUbuntuに接続してVsCodeのターミナルから実施しています
  ```bash
  $ acc login
  $ oj login https://atcoder.jp/
  ```
#### 6.2. **テストディレクトリの名前設定**
- atcoder-cliがテストケースのディレクトリがtestであった方が都合よいので
- testへ変更します（デフォルトではtests)
  ```bash
  $ acc config default-test-dirname-format test
  ```
#### 6.3. **全問題のテストケースをダウンロードさせる設定の実施**
- コンテストが実施される際に、一気にテストケースをダウンロードさせることをデフォルト設定とします。
- バーチャルコンテストなんかに参加するようになったら各コンテストの問題を利用するので、切り替えた方が良いかも
  ```bash
  $ acc config default-test-dirname-format test
  ```
#### 6.4. **テンプレートの作成**
- `acc config-dir` で設定ファイルの場所を確認できる
- `/home/＊＊＊＊/.config/atcoder-cli-nodejs` になっていました
- この配下に `cs フォルダ`を作成する
- サンプルコードで解答ファイルを生成し、提出する手順を説明します
- `cs ディレクトリ`に以下のファイルたちを配置
- `package.json` 中の5003 は.NET 7.0.7の意味 提出時のプルダウンのHTMLで確認可能

  ```xml:x.csproj
  <Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net7.0</TargetFramework>
  </PropertyGroup>
  </Project>
  ```

  ```csharp:Program.cs
  using System;
  using System.Collections.Generic;
  using System.Linq;
  
  namespace x
  {
      class Program
      {
          static void Main(string[] args)
          {
  
          }
      }
  }
  ```

  ```json:package.json
  {
    "name": "x",
    "private":true,
    "scripts": {
      "test": "oj t -c \"dotnet run\"",
      "submit": "acc submit -s -- -l 5003" 
    }
  }
  ```

  ```json:template.json
  {
      "task": {
        "program":["Program.cs", "x.csproj", "package.json"],
        "submit": "Program.cs"
      }
  }
  ```
#### 6.5. **csディレクトリの反映**
- csディレクトリの内容をコンテスト参加時に反映させる
- cs フォルダ内のテンプレートが自動で利用されるように、 acc の設定に追加
  ```bash:
  $ acc config default-template cs
  ```


### 7. 利用する流れ
 - Vs Codeのターミナルから、ソースを配置したい場所へ移動する
 - 例えば `acc new abc376` →abc376ディレクトリが作られ、配下に全問題向けのディレクトリができる
  例：ABC376の場合は右のようなURLになる、abc376を付与するこのネタ元は`コンテストURL末尾の部分`に注目https://atcoder.jp/contests/ **abc376**

   ```bash
   $ cd /home/XXXX/at_coder_cs/src
   $ acc new abc376
   ```  
   - 問題を解くときは各問題 a、ｂ…のフォルダ内の`Program.cs` でコーディング
   ```bash
   $ cd abc376/a/
   $ code Program.cs
   ```
   - `npm run test` でテスト実行(提示されているケースの合格、不合格がわかる)
   - `npm run submit` で（納得したら）提出
   ```bash
   $ npm run test
   $ npm run submit
   ```

### 8. まとめ
- C# + WSL2 + Vs Code での競技プログラミング（Atcoder）向けの環境設定を説明しました。 [atcoder-cli インストールガイド](http://tatamo.81.la/blog/2018/12/07/atcoder-cli-installation-guide/ "atcoder-cli インストールガイド")  にはかなり詳細に設定時に躓いた時の対処方法も含めて記載があるので動かないなというときはそちらの参照をお勧めします。atcoder-cli oj の使い心地としては「テスト実行→提出」が相当良いです。手作業でやってたときよりもスムーズになりました。ツールを使う価値は十分あると思います。エイリアスはもっと洗練していきたい

- 環境設定に関して参考にしたリソースリンク
 [AtCoder を C# で戦う環境を整える（.NET Core）](https://oita.oika.me/2020/05/10/at-coder-csharp/ 
 "AtCoder を C# で戦う環境を整える（.NET Core）")  
  [wsl2にUbuntu環境を構築する【windows】](https://qiita.com/ryome/items/240f36923f5cb989da27 "wsl2にUbuntu環境を構築する【windows】")  
  [atcoder-cli インストールガイド](http://tatamo.81.la/blog/2018/12/07/atcoder-cli-installation-guide/ "atcoder-cli インストールガイド")  
[【2023年4月版】Ubuntu に node.js と npm を入れたい（バージョン管理も）](https://qiita.com/nouernet/items/d6ad4d5f4f08857644de "【2023年4月版】Ubuntu に node.js と npm を入れたい（バージョン管理も）")