fj
コマンドはAtCoder Heuristic Contestの問題を解くことを助けるツールです。 このコマンドは、テストの実行を自動化します。
Go(1.21~)が導入されている環境であれば、次のコマンドだけでインストールできます。
go install github.com/fmhr/fj/cmd/fj@latest
すでにインストールしていて、アップデートをする場合は、次のコマンドを実行してください。 または@latestを具体的なバージョンに置き換えてください。
go clean -modcache
go install github.com/fmhr/fj/cmd/fj@latest
macOS上で開発しています。
- テストの実行
- リアクティブ問題に対応
- 並列実行
- 実行時に"N=3"のような標準エラー出力をすると、自動で収集してテストケースごとに表示する
- Googole Cloud Runを使った並列テスト
- AtCoderの公式サイトからローカルテスターをダウンロードします。
- ダウンロードしたテスターをコンテスト用のフォルダに解凍します。
- tools/のREADMEを参照し、テストケースを生成します。
- リアクティブ問題の場合、testerを実行してください。
- それ以外の場合は、visを実行して実行ファイルを生成してください。
コンテスト用のフォルダに移動して.以下のコマンドを実行する。
fj inti
fj/ ディレクトリにfj_config.tomlが生成されるので、エディタで開いて設定を変更してください。
テストケース、seed=0を実行
fj test
seed=777をテスト
fj test 777
seed(3~99)をテスト
fj tests -start 3 -end 100
seed(0~99)をテスト
fj tests 100
fj setupCloud
をコンテストのディレクトリで実行してcompileコンテナと実際にテストするworkerコンテナ必要なDockerfileとシェルスクリプトを生成します。- ./fj/compiler/ の中のファイルを使用する言語にあわせて修正します
ConcurrentRequestsは、並列実行するときのリクエスト数です。ローカルではコンテナを1つしか立ち上げないので、1にしてください。
設定後に、fj test --cloud
を実行して、正しく動作するか確認してください。
[https://docs.docker.com/engine/install/]を参照してインストールしてください。
- SDKをインストールする。
- 新しいプロジェクトを作成します。
gcloud Cloud にログインします。
gcloud auth login
プロジェクトを作成します。
gcloud projects create PROJECT_NAME
プロジェクトを選択します。
gcloud config set project PROJECT_NAME
必要に応じてGoogle Cloud のコンソールページから作成したプロジェクトを選択して、メニューの「お支払い」から「請求先アカウントにリンク」を選択します。
Cloud Build APIの有効化:
gcloud services enable cloudbuild.googleapis.com --project=YOUR_PROJECT_ID
Cloud Storage APIの有効化:
gcloud services enable storage.googleapis.com --project=YOUR_PROJECT_ID
Cloud Artifact Registry APIの有効化:
gcloud services enable artifactregistry.googleapis.com --project=YOUR_PROJECT_ID
DockerImageを保存するためのレジストリを作成します。
gcloud artifacts repositories create REPOSITORY_NAME --repository-format=docker --location=asia-northeast1 --project=YOUR_PROJECT_ID
コンパイル後の実行ファイルを保存するためのバケットを作成します。
gcloud storage buckets create gs://YOUR_BUCKET_NAME --location=asia-northeast1
Cloud Build サービスアカウントに Artifact Registry へのアクセス権限を付与します。
gcloud projects add-iam-policy-binding PROJECT_ID \
--member="serviceAccount:PROJECT_NUMBER@cloudbuild.gserviceaccount.com" \
--role="roles/artifactregistry.writer"
PROJECT_ID: あなたの Google Cloud プロジェクト ID を指定します。 PROJECT_NUMBER: あなたの Google Cloud プロジェクト番号を指定します。
ローカルのfj/config.tomlのbucketに指定したYOUR_BUCKET_NAMEを設定します。
fj setupCloud
を実行すると、fj/compiler/とfj/worker/にDockerfileとgcloudbuild.shが生成されます。
- fj/compiler/gcloudbuild.sh のGCLOUD_PROJECTとIMAGE_NAMEを変更します。
- fj/compiler/Dockerfileをコンパイルする言語に合わせて修正します。
- fj/compiler/に移動して、gcloudbuild.sh を実行して、コンパイル用のコンテナをビルドします。
Do you want enable these APIs to continue (this will take a few minutes)? (y/N)?
と聞かれたら、y
を入力してください。
スクリプトが成功すると以下の様なメッセージが表示されます。
(略)
DONE
Done.
Service [go-compiler] revision [go-compiler-00002-ushi] has been deployed and is serving 100 percent of traffic.
Service URL: https://go-compiler-abcdefghij-an.a.run.app
- Service URLをコピーして、fj/config.tomlのCompilerURLに先ほどのURLの末尾に/compilerを追加して設定します。
- AtCoderが配布しているローカルtoolsを解答して、toolsディレクトリをfj/worker/にコピーします。
- fj/worker/gcloudbuild.sh のGCLOUD_PROJECTとIMAGE_NAMEを変更します。
- fj/worker/に移動して gcloudbuild.sh を実行して、コンパイラコンテナ同様 Service URL: をfj/config.tomlのWorkerURLに設定します。
- WebブラウザでGoogle Cloud Runのコンソールを開きます。ジャッジコンテナ(worker)を選んで、YAML のタブを開いて、autoscaling.knative.dev/maxScale: '100' の'100'を'1000'に変更します。(現在設定できる最大値です。)