Skip to content

Commit 1d654ca

Browse files
committed
Finish up the AtCoder env chapter
1 parent e84b3c9 commit 1d654ca

8 files changed

+191
-47
lines changed

src/SUMMARY.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@
2020
- [プログラムのテスト (TODO)](./todo.md)
2121
- [プログラムの提出 (TODO)](./todo.md)
2222
- [Tips(小技集) (TODO)](./todo.md)
23-
- [クレートの利用例 (TODO)](./todo.md)
23+
- [クレートの使用例 (TODO)](./todo.md)
2424
- [AtCoder運営者向けの情報](./atcoder-env/index.md)
25-
- [本章で想定している環境と利用形態 (TODO)](./atcoder-env/supported-environment.md)
25+
- [本章で想定している環境](./atcoder-env/supported-environment.md)
2626
- [インストール](./atcoder-env/installation.md)
2727
- [Rustツールチェインのインストール](./atcoder-env/installing-rust-toolchain.md)
2828
- [クレートのコンパイルとインストール](./atcoder-env/installing-rust-crates.md)

src/atcoder-env/compiling-and-running-program.md

Lines changed: 112 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ $HOME # ユーザのホームディレクトリ
1919
```
2020

2121
`WORKAREA``cd`で移動して、後述のコンパイルコマンドを実行します。
22-
すると以下のことが行われ`main`という名の実行可能ファイル(バイナリ)が生成されます
22+
すると以下のことが行われ`main`という名の実行ファイルが生成されます
2323

2424
1. プログラムがアセンブリコードに変換されオブジェクトファイルが作られる
2525
1. オブジェクトファイルがRustの標準ライブラリや`${RUST_MOME}/lib/target/release/deps`配下に作成しておいた`rlib`とリンクされる
@@ -28,7 +28,7 @@ $HOME # ユーザのホームディレクトリ
2828
$HOME
2929
└-- WORKAREA
3030
|-- main.rs
31-
└-- main # コンパイルとリンクの成果物。実行可能ファイル(バイナリ)
31+
└-- main # コンパイルとリンクの成果物。実行ファイル
3232
```
3333

3434

@@ -53,26 +53,128 @@ $ echo $PATH
5353
コンパイルコマンドは以下のとおりです。
5454

5555
```console
56-
$ cd ${HOME}/WORKAREA
57-
$ RUST_LIB=${RUST_HOME}/lib
56+
$ cd $HOME/WORKAREA
57+
$ RUST_LIB=$RUST_HOME/lib
5858
$ rustc --edition=2018 -C opt-level=3 \
59-
$(rustc-dep-option-generator ${RUST_LIB}/Cargo.toml ${RUST_LIB}/target/release/deps) \
59+
$(rustc-dep-option-generator $RUST_LIB/Cargo.toml $RUST_LIB/target/release/deps) \
6060
main.rs
6161
```
6262

63-
これにより`${HOME}/WORKAREA`ディレクトリに`main`という名のバイナリが生成されます
63+
これにより`$HOME/WORKAREA`ディレクトリに`main`という名の実行ファイルが生成されます
6464

6565

6666
### コンパイルオプションについて
6767

68-
**TODO**
68+
`rustc`コマンドに渡すコンパイルオプションは、`cargo`でデフォルトのreleaseプロファイルを使用した時に、`cargo build --release`で生成される、ごく一般的なものを使用します。
69+
たとえばバイナリの実行速度を最適化するためのオプションとしては`-C opt-level=3`だけを指定しています。
70+
71+
もし実行速度を追求するなら`-C target-cpu=native`のようなオプションを追加することもできます。
72+
しかしAtCoder運営者様から以下のようなお話があったため、今回の言語アップデートでは使用しないことにします。
73+
74+
[https://twitter.com/chokudai/status/1138677406984691712](https://twitter.com/chokudai/status/1138677406984691712)
75+
76+
> もうすぐジャッジアップデートの話を出すけれども、ジャッジの目的は「正解と不正解を分けること」であって、「最速を目指すこと」ではないので、十分に早い言語(C++, Rustなど)では、過剰な最適化とかを含めた提案はRejectすることがあるかも。
77+
78+
[https://twitter.com/chokudai/status/1138677959059943424](https://twitter.com/chokudai/status/1138677959059943424)
79+
80+
> といいつつ、言語間の差を減らすために「C++はO2とか付けない!」みたいな滅茶苦茶なことを言い出すつもりは全くなくて、「AtCoder環境がちょっと変わると動かなくなる」みたいな最適化は受け入れない、くらいの話です。
81+
82+
通常形式のコンテスト(アルゴリズム系)では最速を目指すことには意味がありません。
83+
84+
一方、マラソン系のコンテストでは、たとえ数パーセントでも速度が向上するなら嬉しいことも多くあります。
85+
AtCoderでは将来マラソン系のコンテストもRatedにする可能性があり、その際にコンパイルオプションを追加するか検討できるかもしれません([参考][twitter-20190619]
86+
87+
[twitter-20190619]: https://twitter.com/tatsuya6502/status/1140049804082311168
88+
89+
90+
### コンパイルコマンドが動作することの確認
91+
92+
コンパイルコマンドが動作することを確認しましょう。
93+
クレートのインストールに使用したCargoプロジェクトには、それらのクレートを使用する簡単なサンプルコードが含まれています。
94+
95+
以下の方法でコンパイルできます。
96+
97+
```console
98+
## 一般ユーザで実行
99+
100+
## 作業用のディレクトリを作成する
101+
102+
$ mkdir $HOME/WORKAREA
103+
$ cd $HOME/WORKAREA
104+
105+
## サンプルコードの入ったソースファイル(2つある)をコピーする
106+
107+
$ RUST_LIB=$RUST_HOME/lib
108+
109+
$ cp -p $RUST_LIB/src/main.rs .
110+
$ cp -p $RUST_LIB/tests/test_jemallocator.rs .
111+
112+
## サンプルコードをコンパイル、リンクする
113+
114+
$ rustc --edition=2018 -C opt-level=3 \
115+
$(rustc-dep-option-generator $RUST_LIB/Cargo.toml $RUST_LIB/target/release/deps) \
116+
main.rs
117+
118+
$ rustc --edition=2018 -C opt-level=3 \
119+
$(rustc-dep-option-generator $RUST_LIB/Cargo.toml $RUST_LIB/target/release/deps) \
120+
test_jemallocator.rs
121+
```
122+
123+
コンパイルとリンクに成功すると実行ファイルが作られます。
124+
125+
```console
126+
$ file main
127+
main: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV),
128+
dynamically linked, interpreter /lib64/l, for GNU/Linux 3.2.0,
129+
BuildID[sha1]=50373af3038c60f2a3e7a162b310e5226b08c8a9,
130+
with debug_info, not stripped
131+
132+
$ file test_jemallocator
133+
test_jemallocator: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV),
134+
dynamically linked, interpreter /lib64/l, for GNU/Linux 3.2.0,
135+
BuildID[sha1]=31b718908ebf067f4b1161b1dc5cf679f012ad7f,
136+
with debug_info, not stripped
137+
```
69138

70139

71140
## 実行コマンド
72141

73-
バイナリを実行するコマンドは以下のとおりです。
142+
実行ファイルを実行するコマンドは以下のとおりです。
143+
144+
```console
145+
$ cd $HOME/WORKAREA
146+
$ ./main
147+
```
148+
149+
150+
### 実行コマンドが動作することの確認
151+
152+
実行コマンドが動作することを確認しましょう。
153+
先ほど作成した実行ファイルを実行します。
74154

75155
```console
76-
$ cd ${HOME}/WORKAREA
77-
$ ./main < 入力データファイル
156+
## 一般ユーザで実行
157+
158+
$ cd $HOME/WORKAREA
159+
160+
$ ./main
161+
...
162+
163+
## いろいろなメッセージが表示されるが、テスト用の出力なので内容は確認しなくてよい
164+
## 終了コード0で終了したことだけを確認すればOK
165+
166+
$ echo $?
167+
0
168+
169+
$ ./test_jemallocator
170+
...
171+
172+
## こちらも終了コード0で終了したことだけを確認すればOK
173+
$ $?
174+
0
78175
```
176+
177+
AtCoder運営者向けの情報は以上となります。
178+
内容について質問などがありましたら、[GitHub Issue][gh-issue]などでご連絡ください。
179+
180+
[gh-issue]: https://github.com/rust-lang-ja/atcoder-rust-resources/issues

src/atcoder-env/index.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
- Rustツールチェインやクレート(外部ライブラリ)をジャッジサーバへインストールする手順
88
- 提出されたプログラムのコンパイルおよび実行手順
99

10+
本章のMarkdownソースファイルはGitHub [rust-lang-ja/atcoder-rust-resources][gh]にあります。
1011
内容について質問などがありましたら、[GitHub Issue][gh-issue]などでご連絡ください。
1112

13+
[gh]: https://github.com/rust-lang-ja/atcoder-rust-resources
1214
[gh-issue]: https://github.com/rust-lang-ja/atcoder-rust-resources/issues

src/atcoder-env/installation.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,5 @@
55
本節では以下の内容について説明します。
66

77
- Rustツールチェインのインストール
8-
- クレート(外部ライブラリ)のコンパイルとインストール
8+
- クレートのコンパイルとインストール
99
- クレートの検索パス生成ツールのインストール
10-
- インストール後の動作確認

src/atcoder-env/installing-rust-crates.md

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,19 @@
1515
- 他のいくつかの言語の標準ライブラリにあって、Rustにない機能を提供するもの
1616
- 例:C++の`lower_bound``BitSet`に相当する機能
1717
- 競技プログラミングの面白さを損なわない範囲(ズルにならない範囲)で便利になるもの
18-
- 例:Rustでは入出力関連の記述が煩雑になりがちなので、それらを簡潔に記述できるマクロ集
18+
- 例:Rustでは入力関連の記述が煩雑になりがちなので、それらを簡潔に記述できるマクロ集
1919
- セキュリティなどの理由から高速性が犠牲になっている機能を置き換えるもの
2020
- 例:標準ライブラリのハッシュ関数はDoS攻撃を避けるために暗号強度があり、計算量が多い。
2121
競技プログラミングでは暗号強度は求められず、より計算量の少ないハッシュ関数で十分
2222

2323
**AtCoder運営者様へのお願い**
2424

25-
対象クレートの一覧は このページ(**TODO**[仮のページはこちら](https://github.com/rust-lang-ja/atcoder-rust-resources/wiki/Crates-2019)にあります。
26-
インストールして問題がないか、事前にレビューをお願いいたします
25+
対象クレートの一覧は[このページ](crates-2019)にあります。
26+
ジャッジサーバで使用して問題ない内容か、インストール前にレビューをお願いいたします
2727

2828
質問や要望などがありましたら、[GitHub Issue][gh-issue]などでご連絡ください。
2929

30+
[crates-2019]: https://github.com/rust-lang-ja/atcoder-rust-resources/wiki/Crates-2019
3031
[gh-issue]: https://github.com/rust-lang-ja/atcoder-rust-resources/issues
3132

3233

@@ -55,11 +56,11 @@ $HOME # ユーザのホームディレクトリ
5556
|-- deps
5657
| |-- X.rlib # コンパイル済みのクレート
5758
| └-- Y.rlib
58-
└-- main # コンパイル、リンク済みの実行可能ファイル(バイナリ)
59+
└-- main # コンパイル、リンク済みの実行ファイル
5960
```
6061

6162
この方法ではユーザプログラムをコンパイルする際にクレートもコンパイルします。
62-
もしジャッジサーバでこの方法をとると、ジャッジの際のサーバ負荷が増えてしまいます
63+
もしジャッジサーバでこの方法をとると、ユーザプログラムが提出されるごとにクレートがコンパイルされることになり、サーバの負荷が増えてしまいます
6364

6465
そこで今回は各ファイルを以下のように配置し、クレートのコンパイルは導入時に済ませておくことにします。
6566

@@ -88,18 +89,18 @@ $RUST_HOME (/usr/local/lib/rust)
8889
$HOME # ユーザのホームディレクトリ
8990
└-- WORKAREA # ジャッジ用の一時ディレクトリ
9091
|-- main.rs # ユーザプログラム(提出されたプログラム)のソースコード
91-
└-- main # コンパイル、リンク済みの実行可能ファイル(バイナリ)
92+
└-- main # コンパイル、リンク済みの実行ファイル
9293
```
9394

9495

9596
## クレートのコンパイルに使用するCargoパッケージのダウンロード
9697

9798
それではインストール作業に入りましょう。
98-
クレートの事前コンパイルに使用するCargoパッケージをGitHubからダウンロードし、`/usr/local/lib/rust/lib`に配置します
99+
クレートの事前コンパイルに使用するCargoパッケージは、GitHub [rust-lang-ja/atcoder-rust-base(ja-all-enabledブランチ)][rust-base-branch]に用意されています
99100
このパッケージには`Cargo.toml`ファイルなどが含まれており、インストール対象のクレートがすでに設定されています。
100101
`[dependencies]`セクションに書かれています)
101102

102-
以下のコマンドを実行します。
103+
このリポジトリを`git clone`し、`/usr/local/lib/rust/lib`に配置します。以下のコマンドを実行します。
103104

104105
```console
105106
## rootユーザで作業する
@@ -116,6 +117,7 @@ root
116117
${RUST_HOME}/lib
117118
```
118119

120+
[rust-base-branch]: https://github.com/rust-lang-ja/atcoder-rust-base/tree/ja-all-enabled
119121

120122

121123
## クレートのコンパイル
@@ -142,7 +144,8 @@ $
142144
以下のコマンドを実行します。
143145

144146
```console
145-
$ find target/release/deps/ -name '*.rlib' | wc -l
146-
59 # この数字を確認
147+
$ find target/release/deps/ -type f | egrep -c '\.(rlib|so)$'
148+
66
149+
# ↑ 上の数字を確認
147150
```
148151

src/atcoder-env/installing-rust-toolchain.md

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
今回の言語アップデートでは2019年5月20日にリリースされた1.35.0をインストールします。
1111

1212
Rustの安定版(stable版)は6週間ごとにリリースされますので、次の1.36.0は7月4日にリリースされます。
13-
言語アップデート作業は2019年6月末から開始される予定ですので、1.36.0をインストールすることも可能です。
13+
言語アップデート作業は2019年7月から始まりましたので、1.36.0をインストールすることも可能です。
1414
しかし今回は安全のために、リリースされてから少し日が経っている1.35.0を選択します。
1515

1616
ツールチェインのインストールには`rustup`というRustプロジェクト公式のコマンドラインツールを使います。
@@ -26,16 +26,14 @@ Rustの安定版(stable版)は6週間ごとにリリースされますので
2626
- Rustの標準ライブラリとAPIドキュメント
2727

2828
`cargo`はRustプログラムの開発には欠かせないツールですが、ジャッジの際には使用しません。
29-
ジャッジサーバでは`rustc`を直接呼び出すことでユーザプログラムをコンパイルし、事前にコンパイルしておいたクレート(外部ライブラリ)とリンクします
30-
理由については次のページで説明します
29+
ジャッジサーバでは`rustc`を直接呼び出すことでユーザプログラムをコンパイルし、事前にコンパイルしておいたクレートとリンクします
30+
理由については前のページで説明したとおり、ジャッジの際にクレートが毎回コンパイルされることなどを防ぐためです
3131

3232
`cargo`は環境の構築時、具体的にはこのページに続く数ページでRustのクレートや関連ツールをビルドする際に使用します。
3333

3434
Rustツールチェインはデフォルトでは`rustup`を実行したLinuxユーザのホームディレクトリ配下(`~/.rustup/toolchains`)にインストールされます。
3535
しかし今回はジャッジサーバ上の全てのLinuxユーザから使えるよう、`/usr/local/lib/rust`配下にインストールします。
36-
このディレクトリは一般のLinuxユーザからは書き込みができないように設定し、ジャッジの際にユーザプログラムからツールチェインが変更されないように守ります。
37-
38-
インストールにあたってインターネット接続が必要です。
36+
このディレクトリは一般のLinuxユーザからは書き込みができないように設定し、ジャッジの際にツールチェインがユーザプログラムによって変更されないよう保護します。
3937

4038

4139
## 依存ソフトウェアのインストール
@@ -44,7 +42,7 @@ Rustツールチェインをインストールする前に、Rustプログラム
4442
必要なソフトウェアは以下のとおりです。
4543

4644
- Rustツールチェインやクレートのダウンロードに必要なツール:curl, git-core
47-
- Rustプログラムのリンク時に必要なツール:gcc, binutils
45+
- ユーザプログラムのリンク時に必要なツール:gcc, binutils
4846
- 一部のRustクレートのビルドに必要なツール:make, pkg-config
4947

5048
以下のコマンドを実行します。

src/atcoder-env/installing-rustc-dep-option-generator.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ $ sudo apt install -y libssl-dev
2727

2828
`cargo install`コマンドでインストールします。
2929
以下のコマンドを実行すると、GitHubのリポジトリからツールのソースコードがダウンロードされ、ビルドが実行されます。
30-
ビルドに成功すると、生成されたバイナリ(実行可能ファイル)が`$CARGO_HOME/bin`配下にインストールされます。
30+
ビルドに成功すると、生成された実行ファイルが`$CARGO_HOME/bin`配下にインストールされます。
3131

3232
```console
3333
$ sudo -i

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy