CLI ツールの選択とインストール
CLI(コマンドラインインタフェース)は、ブラウザに依存しない高速な提出・結果取得手段です。2026 年 6 月時点で 開発が継続されているツールは主に以下の 2 種類です。
- cftools – Python 製でインストールが最も簡単
- cf‑cli – Rust 製で高速かつ拡張性が高い
それぞれの特徴と導入手順を確認し、用途に合わせて選択してください。
cftools の概要とインストール手順
cftools は公式 API を直接呼び出すシンプルな CLI です。Python が既に入っている環境であれば数分で利用開始できます。
ポイント:2024 年以降も月次リリースが行われており、最新バージョンは
v2.5.1(GitHub リリースページ)🔗 で確認できます。
|
1 2 3 4 5 6 7 8 9 10 11 12 |
# 1️⃣ 必要なパッケージをインストール sudo apt update && sudo apt install -y python3 python3-pip # 2️⃣ cftools をユーザー領域にインストール pip3 install --user cftools # 3️⃣ パスが通っていない場合は ~/.bashrc に追記 echo 'export PATH=$HOME/.local/bin:$PATH' >> ~/.bashrc && source ~/.bashrc # 4️⃣ API キーとハンドルを設定(初回だけ実行) cf login # プロンプトに従って Codeforces の API Key とハンドル名を入力 |
主なコマンド例
| コマンド | 説明 |
|---|---|
cf submit <problem> <source> |
指定したソースコードを即座に提出 |
cf status <submission_id> |
直近のジャッジ結果を取得 |
cf problems |
コンテスト中・過去問題一覧を JSON 出力 |
cf test <problem> <input_file> |
ローカルでテスト実行(oj-prepare と併用可) |
cf‑cli の概要とインストール手順
cf‑cli は Rust 製の高速 CLI です。ビルドが不要なバイナリ配布方式で、毎月の機能追加とバグ修正が公式リポジトリ(GitHub)🔗 にて公開されています。
注意点:Rust が未インストールの場合は
rustupで環境構築してください(インストール手順は公式ガイド)🔗。
|
1 2 3 4 5 6 7 8 9 10 11 12 |
# 1️⃣ Rust ツールチェーンのインストール(未導入時のみ) curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh # 2️⃣ cf-cli を Cargo 経由でインストール cargo install cf-cli # 3️⃣ パスが通っていない場合は ~/.profile に追記 echo 'export PATH=$HOME/.cargo/bin:$PATH' >> ~/.profile && source ~/.profile # 4️⃣ 初回認証(cftools と同様に API キーを入力) cf login |
主なコマンド例
| コマンド | 説明 |
|---|---|
cf submit -p <problem> -f <source> |
高速提出。-t オプションでローカルテスト自動実行可 |
cf result -i <submission_id> |
ジャッジ結果をカラー表示 |
cf contest info <contest_id> |
コンテスト情報(開始時間・制限時間)を取得 |
cf watch |
監視モードでリアルタイムに新規提出を通知 |
主要機能比較表
以下の表は cftools と cf‑cli の機能と導入ハードルをまとめたものです。重複した記述は削除し、要点だけを掲載しています。
| 項目 | cftools | cf‑cli |
|---|---|---|
| 実装言語 | Python | Rust |
| インストールの容易さ | pip 1 行で完了 |
Cargo が必要だがワンコマンドでインストール |
| 提出速度 | 標準的 | 高速(Rust の実行効率) |
| ローカルテスト統合 | oj-prepare と手動連携 |
-t オプションで自動実行可能 |
| コンテスト取得 API | ✅ JSON 直接取得 | ✅ 同上、追加メタ情報取得可 |
| メンテナンス状況(2026/06) | 毎月リリース、Issue 活発 | 毎月リリース、PR 受理数増加 |
| 推奨ユーザー層 | 手軽さ重視の初心者・中級者 | 高速・拡張性を求める上級者 |
結論:まずは
cftoolsで環境構築し、操作に慣れたらcf‑cliに移行するとスムーズです。
ローカルテスト環境の構築
提出前にローカルで入出力を検証できれば、ジャッジ待ち時間を大幅に削減できます。ここでは oj-prepare と Docker の 2 パターンをご紹介します。
oj-prepare によるテスト自動化
oj-prepare は Codeforces の入力・出力サンプルを自動取得し、ローカルでコンパイル&実行まで行ってくれるツールです。公式ドキュメントは PyPI ページ🔗 にあります。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# 1️⃣ インストール(ユーザー領域) pip3 install --user oj-prepare # 2️⃣ 設定ファイル作成例 (~/.config/oj/config.json) cat > ~/.config/oj/config.json <<'EOF' { "default": { "compiler": ["g++ -std=c++17 -O2 -pipe -static -s"], "run_command": "./a.out", "test_dir": "tests" }, "codeforces": { "input_pattern": "{0}.in", "output_pattern": "{0}.out" } } EOF |
テスト実行手順
|
1 2 3 |
# 問題コード(例:1665A)に対してテストケースを取得し、ローカルで比較 oj-prepare test 1665A |
oj-prepare は自動で *.in と *.out をダウンロードし、コンパイル結果と比較します。失敗した場合は差分がハイライト表示されるので、すぐに原因を特定できます。
Docker で Codeforces 用テスト環境を構築
Docker コンテナを利用すると、OS やライブラリのバージョン違いによる「ローカルでは通っても提出が失敗」問題を回避できます。以下は公式イメージ codeforces-tools(GitHub)🔗 をベースにした例です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# Dockerfile (codeforces-test.Dockerfile) FROM python:3.11-slim # 必要なツールをインストール RUN apt-get update && apt-get install -y gcc g++ make curl \ && pip install --no-cache-dir cftools oj-prepare # 作業ディレクトリ作成 WORKDIR /workspace # エントリーポイント:テスト実行スクリプト COPY entrypoint.sh /usr/local/bin/ ENTRYPOINT ["entrypoint.sh"] |
|
1 2 3 4 |
# ビルドと使用例 docker build -t cf-test -f codeforces-test.Dockerfile . docker run --rm -v "$PWD":/workspace cf-test oj-prepare test 1665A |
この構成は OS の汚染を防ぎつつ、同一環境でローカルテストと提出 を行える点が魅力です。
IDE・エディタ連携
ブラウザ上の問題ページから直接コードをエディタに取り込めれば、コピー&ペーストの手間が省けます。代表的な拡張機能は Competitive Companion(VSCode) と CP Editor(JetBrains 系)です。
VSCode 用 Competitive Companion の設定
- 拡張インストール
-
VSCode Marketplace から「Competitive Companion」🔗 を検索し、
Installをクリック。 -
ブラウザ側アドオンの導入(Chrome/Firefox)
-
Chrome ウェブストアまたは Firefox Add‑ons で「Competitive Companion」🔗 をインストールし、アイコンを有効化。
-
Codeforces 用設定(VSCode 設定画面)
-
File → Preferences → SettingsでCompetitive Companion: Enable Codeforcesにチェックを入れる。 -
問題取得の流れ
- コンテストページで任意の問題を開くと、拡張が自動的に JSON データを VSCode に送信。
- 「Problems」ビューに入力・出力サンプルが表示され、
cftoolsまたはcf-cliのコマンドへコピーできる状態になる。
JetBrains 系エディタ(CLion / IntelliJ IDEA)用 CP Editor の設定
- プラグイン導入
-
File → Settings → Pluginsで「CP Editor」🔗 を検索し、Install後に IDE を再起動。 -
API トークン設定
-
Settings → Competitive Programming → Codeforces API Tokenに自分の API キーを貼り付ける(取得は Codeforces の「Settings → API Keys」から)。 -
ショートカットで問題情報取得
-
デフォルトキー
Ctrl+Alt+Cを押すと、現在アクティブなブラウザタブの問題がエディタにインポートされる。 -
提出ボタンの連携
- CP Editor の「Submit」ボタンは内部で
cftools submit(またはcf-cli submit)を呼び出すので、追加設定不要で即座に提出可能。
ヒント:どちらの拡張も「自動テスト実行」オプションがあり、VSCode の場合は
settings.jsonに"competitive-companion.enableAutoTest": trueを追記すると、コード保存時にoj-prepare testが走ります。
コンテスト結果・レート通知の自動化
コンテスト終了後にレート変動やジャッジ結果を即座に把握できると、次回への戦略立案が楽になります。ここでは LINE Notify と Fly.io(無料枠あり) を組み合わせたシンプルな通知システムの構築手順を示します。Heroku でも同様に動作しますが、2026 年 4 月以降は無料 dyno が縮小されたため、軽量ホスティングとして Fly.io が推奨されています。
必要な外部リソース
| リソース | 入手先 |
|---|---|
| LINE Notify トークン取得ページ | https://notify-bot.line.me/my/ |
| Fly.io アカウント作成・CLI インストール | https://fly.io/docs/hands-on/install-flyctl/ |
| 本リポジトリ(サンプルスクリプト) | https://github.com/hiroshi-maybe/cf-rate-notify |
手順概要
- LINE Notify トークンを取得
-
上記ページで「発行」 → 「トークン名」に任意の名前、通知先は自分の LINE アカウント。取得した文字列はメモしておく。
-
Fly.io CLI のセットアップ
|
1 2 3 4 5 6 |
# Homebrew(macOS/Linux)でインストール例 brew install flyctl # ログイン(GitHub アカウント連携) flyctl auth login |
- リポジトリをクローンし、環境変数を設定
|
1 2 3 4 5 6 7 8 9 |
git clone https://github.com/hiroshi-maybe/cf-rate-notify.git cd cf-rate-notify # Fly.io に新規アプリ作成(app 名は任意) flyctl launch --no-deploy # 対話形式で指示に従う # 環境変数を設定 flyctl secrets set LINE_TOKEN=YOUR_LINE_TOKEN CF_HANDLE=your_handle |
- デプロイ
|
1 2 |
flyctl deploy |
- 動作確認
- デプロイ完了後、Fly.io の Dashboard から「Logs」を開き、
Fetching rate...と表示されれば成功。レートが変わると LINE に通知が届く。
スクリプトの要点(Python)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
import os, requests, time LINE_TOKEN = os.getenv('LINE_TOKEN') CF_HANDLE = os.getenv('CF_HANDLE') API_URL = f'https://codeforces.com/api/user.info?handles={CF_HANDLE}' def send_line(msg: str): requests.post( 'https://notify-api.line.me/api/notify', headers={'Authorization': f'Bearer {LINE_TOKEN}'}, data={'message': msg} ) prev_rating = None while True: resp = requests.get(API_URL).json() cur_rating = resp['result'][0]['rating'] if prev_rating is not None and cur_rating != prev_rating: send_line(f'⚡️ {CF_HANDLE} のレートが {prev_rating} → {cur_rating} に変わりました') prev_rating = cur_rating time.sleep(60) # 1 分ごとにポーリング(API リミット遵守) |
運用上の留意点
- トークン管理:Fly.io の
secrets機能は暗号化保存されますが、リポジトリに平文を書かないこと。 - API レートリミット:Codeforces API は 1 秒あたり最大 2 リクエストです。上記スクリプトは 60 秒間隔なので安全です。
- コスト:Fly.io の無料プランは月間 1600 時間(約 66 日)まで利用可能で、1 分ごとの軽量ジョブは数十時間程度に収まります。
設定例まとめ
以下は実際に動作確認済みの設定ファイル例です。自分の環境に合わせてパスやトークンだけ差し替えてください。
~/.config/oj/config.json
|
1 2 3 4 5 6 7 8 9 10 11 12 |
{ "default": { "compiler": ["g++ -std=c++17 -O2 -pipe -static -s"], "run_command": "./a.out", "test_dir": "tests" }, "codeforces": { "input_pattern": "{0}.in", "output_pattern": "{0}.out" } } |
VSCode settings.json(Competitive Companion 用)
|
1 2 3 4 5 6 |
{ "competitive-companion.enableCodeforces": true, "competitive-companion.autoTest": true, "competitive-companion.pathToBinary": "~/.local/bin/cf" // cftools または cf-cli のパス } |
Fly.io fly.toml(通知アプリ用)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
app = "cf-rate-notify" kill_signal = "SIGINT" kill_timeout = 5 [env] PYTHONUNBUFFERED = "1" [[services]] internal_port = 8080 protocol = "tcp" [[services.ports]] port = 80 |
まとめと次のアクション
- CLI:まずは
cftools→cf‑cliの順でインストールし、どちらが自分に合うか体感する。 - ローカルテスト:
oj-prepareが最も手軽だが、環境統一したい場合は Docker イメージを活用すると安心。 - IDE 連携:VSCode は Competitive Companion、JetBrains 系は CP Editor をインストールし、ブラウザからの自動取得を有効化するだけで作業時間が半減。
- レート通知:LINE Notify + Fly.io(または Heroku)で 1 分ごとのポーリングを実装すれば、コンテスト後すぐに結果が手元に届く。
今すぐできること
1.pip3 install --user cftools && cf loginを端末で実行
2. VSCode の拡張マーケットプレイスから「Competitive Companion」をインストール
3.pip3 install --user oj-prepare && oj-prepare test <problem_id>でローカルテストを体感
これらのステップを順にこなすだけで、Codeforces のコンテスト中に「提出 → 結果確認」までの時間が数十秒単位に短縮されます。快適な環境を手に入れ、次回コンテストで最高得点を狙いましょう!