ICPC アジア地区予選での環境構築

あと数ヶ月で ICPC アジア地区予選つくば大会が開かれます.例年通りならば,アジア地区予選では運営が用意したパソコンを使わなければいけないので,競技開始後に選手は必要に応じて設定ファイル書き,そのパソコンに入っているエディタでコードを書かなければいけません.Visual Studio とか濃厚にカスタマイズされた Vim はダメなので注意してください.

そのため,素の Gedit を使うとかでもない限り準備が必要で,各チームで打ち合わせておく必要があります. Twitter上でそのへんどうしようかなーという話を見かけたので,私が行っていた設定を紹介してみます.2015 Asia Taipei regional, 2016 Asia Tsukuba regional に使ったもので,両方共,当時最新の Ubuntu LTS でした (今年の環境もそのうち公開されるでしょう).

エディタ (Emacs)

ICPC ではパソコンが 1 台しか使えないので,チームメイトのエディタを揃えたほうが有利です.World Final 2017 の放送を眺める分かりますが,チームによって様々です.私は Emacs を使っていたので,Emacs の設定方法のみ紹介します.

~/.emacs

Emacs の良い点は,数行の設定を書けば,自動インデントやコンパイルエラーのハイライト,gdb との連携などの最低限の機能と,軽さ,シンプルさが両立できる点です.

ホームディレクトリに .emacs というファイルを作成し,次のように記述してください.もちろんチームの Emacs ユーザーに聞いて追記・削除してください (いないなら使うべきではない).

(global-set-key "\C-z" 'undo)            ;; C-z で Undo
(global-set-key "\C-s" 'isearch-forward) ;; C-s で検索
(global-set-key "\C-r" 'query-replace)   ;; C-r で置換
(global-set-key "\C-j" 'dabbrev-expand)  ;; C-j で補完
(global-set-key "\C-h" 'keyboard-quit)   ;; C-h (ヘルプ) の誤爆は頻発するので keyboard-quit か delete-backward-char に当てる
(global-linum-mode t)                    ;; 行番号を表示
(setq inhibit-startup-message t)         ;; 起動時のメッセージを無効化
(show-paren-mode t)                      ;; 対応する括弧の表示
(add-hook 'c++-mode-hook 'flymake-mode)  ;; C++ のコードを開いたときに flymake を有効にする

Emacs の設定を書く場所は他にも複数あり~/.emacs.d/init.el 等がそうです.Emacs を初めて起動した際に ~/.emacs が無ければ ~/.emacs.d/init.el が自動で作成されます.~/.emacs が優先されるのでそのままでもいいのですが,混乱防止のため消してしまっても良いですし,そちらに書いてもいいです.

~/Desktop/Makefile

コンパイルエラーのハイライトは Emacs 組み込みの flymake という拡張機能で実現できます.コンパイルエラーを解析して行番号などの情報を取得し,エディタ上に表示してくれます.ICPC の環境では,デフォルトで使える Makefile を使った設定がおすすめです.

コードと同じ場所 (後述の理由で Desktop がおすすめ) に Makefile という名前のファイルを作り,次のように記述します.インデントは必ずタブにしてください.(はてなブログに貼ると勝手にスペースになってしまう…)

check-syntax:
    g++ -Wall -Wextra -fsyntax-only -std=c++11 $(CHK_SOURCES)

g++ に与える引数のうち,-fsyntax-only$(CHK_SOURCES) は必須です.-Wall, -Wextra は,未使用の変数があるとかの警告を最大限に出すようにする設定です.うるさいと思ったら適当に消すなどしてください.-std=c++11 は,C++ 11 を有効にする設定で 03 で良いなら消してください.

以上の設定をすると,GCC が検出できた変なところに下線が付き,マウスカーソルを持って行くと説明がポップアップで表示されます.Clang の方が賢いので使えるなら g++clang++ に変えた方が良いです (たぶん使えない?).

f:id:tubo28:20171003200106p:plain

よく知らないんですが,インターネットが使えない状況で Vim でこういうことってできるんですかね?

Bash

Bash が使えます.~/.bashrc に次のように書いていました.

bind 'set completion-ignore-case on'        # 大文字小文字を無視して tab 補完
ulimit -s 1048576                           # スタックメモリ 1GB でオーバーフロー防止
alias g="g++ -Wall -Wextra -std=c++11 -g"   # 積極的に警告・C++11・デバッグ情報を埋め込み
alias a="./a.out"
alias l="ls"
alias k="ls"
alias e="emacs -nw"                         # Emacs をターミナル内で起動

キーボード

本番前の話.公式の発表がないので分かりませんが,いつも使ってるのは使えないかもしれないので,英字配列の練習が必要かもしれません.私のときはなんかブヨブヨする英語のキーボードでした (持ち込み可にしてほしいなあ).

その他

  • 前日の練習セッションでどれだけ WA を出してもいいので,新しい C++ は使えるか,スタックは深いか,実行速度はどのくらいかなどを見ておく.
  • Ctrl+Super+Left, Ctrl+Super+Right とか Unity の使い方を覚えておく.
  • PythonRuby (irb) の使い方を覚えて.電卓として使えますし,乱数ケースがサッと作れるので便利です.
  • 下の画像は Codeforces ですが,Firefox でファイルを提出するとき,このボタンにドラッグアンドドロップしても選択したことになります.だから Desktop で作業すると楽です.

f:id:tubo28:20171003193957p:plain

まとめ

以上です.準備もコンテスト時間に含まれるのであまり高度なことはできませんが,チームで相談して,最低限の手順リストのようなものは用意しておいた方が良いと思います.他にこういうのもいいよーというのがあれば教えてください.

選手の皆さんの検討を祈ります.