atcoder-cli に online-judge-template-generator を導入した

## 動機

久しぶりに AtCoder に取り組むにあたって、[online-judge-tools](https://github.com/online-judge-tools/oj/blob/master/docs/getting-started.ja.md) が動かなくなっていたので、これを機に環境をいろいろ再構築してみました

## やったこと

継続

* [online-judge-tools](https://github.com/online-judge-tools/oj/blob/master/docs/getting-started.ja.md) と [atcoder-cli](https://github.com/Tatamo/atcoder-cli) でコーディング環境を作った
* シェルコマンドで更なる利便化を図った

新規

* online-judge-tools を再インストールした
* [online-judge-template-generator](https://github.com/online-judge-tools/template-generator#examples) を導入し、atcoder-cli から呼ぶようにして問題文を解析して柔軟なテンプレートが作られるようにした

## online-judge-tools + atcoder-cli

記事が沢山あるので割愛します

## online-judge-tools の再インストール

久々に使用したところ `ModuleNotFoundError: No module named 'xxx'` とエラーが出力され使用できませんでした
`pip3 uninstall online-judge-tools; pip3 install online-judge-tools` で再インストールしても改善せず…

公式にあるように、強制的に再インストールすることで解決しました
Python 環境が壊れているとの事です
参考：[oj/INSTALL.ja.md at master](https://github.com/online-judge-tools/oj/blob/master/docs/INSTALL.ja.md)

```
pip3 install --force-reinstall online-judge-tools
```

## online-judge-template-generator の導入

以前は、atcoder-cli のテンプレート機能を使っていましたが、[atcoder-tools](https://github.com/kyuridenamida/atcoder-tools) の問題文の解析による柔軟なテンプレート作成機能を試してみて、これは良さそうだと思いました
いろいろ Github を巡っていて、同等の機能が online-judge-tools の派生プロジェクトの online-judge-template-generator で出来る事が分かったので、導入してみました
atcoder-cli には、online-judge-template-generator と連携する機能はありませんが、任意のコマンドを実行できるため、それを使って組み込みました
まぁ issues に作者さんが書かれている内容、ほとんどそのままですが…
参考：[Issue #25](https://github.com/Tatamo/atcoder-cli/issues/25)

### 1. インストール

```
pip3 install online-judge-template-generator
```

### 2. 独自のテンプレートを用意する

デフォルトのテンプレートを使用するなら不要です
atcoder-cli のテンプレートフォルダに置くことにしました

```
cd `acc config-dir`/py
code main_gen.py
```

### 3. atcoder-cli の template.json を設定する

```json:template.json
{
    "task": {
        ...
        "cmd": "oj-template -t $TEMPLATE_DIR/main_gen.py `acc task $CONTEST_ID $TASK_ID | awk -F ' ' '{print $NF}'` > main.py"
    }
}
```

`acc task` で取得できる問題名にスペースが含まれている事があったので、`awk` のパラメタを `$NF` にしました
デフォルトのテンプレートを使用する場合は、`-t` のパラメタを変更してください

### 4. テストケースを取得する

後はテストケースを取得すればOKです

```
acc n abc100
```

## シェルコマンド

コードのテストも `acc` と同じ感覚で実行できるように、ラッピングするシェルコマンドを作りました
またフォルダを指定するだけで、`main.py` をエディタで起動したり、提出できるようにしています

```bash:acb
#!/bin/bash
set -eu

# atcodr-cliラッパー

# 引数チェック
: $1

if [ $1 = "-h" ]; then
    echo "Usage: acb [command]"
    echo ""
    echo "Commands:"
    echo "  new|n [options] <contest-id>                create new contest project directory"
    echo "  add|a [options]                             add new directory for the task in the project directory"
    echo "  edit|e <task-dir>                           open main.py by VS Code"
    echo "  test|t <task-dir>                           check main.py with tests"
    echo "  submit|s <task-dir> [options] [filename]    submit the program"
    exit 0
fi

if [ $1 = "new" -o $1 = "n" ]; then
    acc new ${@:2}
    echo
    echo "[@] create <$2> directroy."
    ls
    exit 0
fi

if [ $1 = "add" -o $1 = "a" ]; then
    acc add ${@:2}
    echo
    ls -1td */ | sed 's/\///g' | head -n1 | echo "[@] create <$(cat)> directory"
    ls
    exit 0
fi

if [ $1 = "edit" -o $1 = "e" ]; then
    # シェルスクリプト内でのcdは呼び出し元のシェルには影響しない
    : $2
    cd $2
    echo "[@] open <$2/main.py> file"
    code main.py
    exit 0
fi

if [ $1 = "test" -o $1 = "t" ]; then
    : $2
    cd $2
    oj t -c "python3 main.py" -d ./tests/
    exit 0
fi

if [ $1 = "submit" -o $1 = "s" ]; then
    : $2
    cd $2
    acc submit ${@:3}
    exit 0
fi
```

## まとめ

AtCoder の環境を再構築して、更に online-judge-template-generator を導入しました
緑色目指して、コツコツやろう！