From 62fa82e47c33dc608763227d64206a2a7b1c724a Mon Sep 17 00:00:00 2001 From: statiolake Date: Sun, 1 Dec 2019 03:44:22 +0900 Subject: [PATCH 01/24] Add how to participate in a contest --- src/SUMMARY.md | 2 +- src/participate/index.md | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 src/participate/index.md diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 84fc4df..7234a2c 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -12,7 +12,7 @@ - [ソースコードエディタとデバッガの準備 (TODO)](./todo.md) - [cargo-generateテンプレート (TODO)](./todo.md) - [cargo-generateのインストール (TODO)](./todo.md) -- [コンテストの参加方法 (TODO)](./todo.md) +- [コンテストの参加方法 (TODO)](./participate/index.md) - [Cargoパッケージの作成 (TODO)](./todo.md) - [利用するクレートの選択 (TODO)](./todo.md) - [テストケースの作成 (TODO)](./todo.md) diff --git a/src/participate/index.md b/src/participate/index.md new file mode 100644 index 0000000..9b0cfd1 --- /dev/null +++ b/src/participate/index.md @@ -0,0 +1,25 @@ + + +# コンテストの参加方法 + +本章ではどのようにしてAtCoderのコンテストに参加すればよいかを説明しています。各人の好みに合わせ、どのように参加しても構いません。ここでは次のような流れに沿って説明します。 + +コンテストが開始する前にいくつかの準備を進めておくと、コンテスト開始後にスムーズに問題に取り組めます。 + + +## コンテスト開始前 + +1. 作業するためのプロジェクトを作成する。 + - ここでは`cargo generate`を利用します。 +1. 使いそうなクレートを有効化し、一度プロジェクトをビルドしておく。 +1. プロジェクトを問題数分だけコピーしておく。 + - 好みに応じて一つのプロジェクトを使い回すのでもかまいません。 + + +## コンテスト開始後 + +1. 問題を開き、テストケースを記述する。 + - テストで`cargo test`を利用しない方は不要です。 +1. プログラムを書く。 +1. テストする。 +1. プログラムを提出する。 From d3d40163bf25311cf962192a628a53c76f7d240f Mon Sep 17 00:00:00 2001 From: statiolake Date: Fri, 21 Feb 2020 04:46:41 +0900 Subject: [PATCH 02/24] Mock up instructions for installing Rust They are far from complete. There're many TODOs. Anyway now it's more important to describe how to set up a project having the same crates as the AtCoder's environment, so that's all for now. --- src/installation/cargo-generate.md | 43 ++++++++++++++++++++++++++++++ src/installation/editor.md | 24 +++++++++++++++++ src/installation/index.md | 13 +++++++++ src/installation/toolchain.md | 38 ++++++++++++++++++++++++++ 4 files changed, 118 insertions(+) create mode 100644 src/installation/cargo-generate.md create mode 100644 src/installation/editor.md create mode 100644 src/installation/index.md create mode 100644 src/installation/toolchain.md diff --git a/src/installation/cargo-generate.md b/src/installation/cargo-generate.md new file mode 100644 index 0000000..06334db --- /dev/null +++ b/src/installation/cargo-generate.md @@ -0,0 +1,43 @@ + + +# `cargo-generate` のインストール + +**TODO** このページは書きかけです。 + +AtCoder で利用できる Rust のバージョンやライブラリを指定したプロジェクトを簡単に生成するために、 [atcoder-rust-base の ja ブランチ](https://github.com/rust-lang-ja/atcoder-rust-base/tree/ja)にプロジェクトの雛形を用意しています。この雛形は`cargo generate`というコマンドを使って展開するため、先にこのコマンドをインストールする必要があります。 + +`cargo generate` サブコマンドを利用できるようにするには `cargo-generate` が必要です。端末 (Windows ユーザーの方はコマンド プロンプト) を開いて `cargo install cargo-generate` コマンドを実行してください。これだけでインストールできます。 + +```console +$ cargo install cargo-generate + Updating crates.io index +Downloaded cargo-generate v0.5.0 +(...中略...) + Compiling cargo-generate v0.5.0 + Finished release [optimized] target(s) in 5m 46s +Installing ... + Installed package `cargo-generate v0.5.0` (executable `...`) +``` + +実際に `cargo generate --help` として実行できるかどうかを確認しましょう。 + +```console +$ cargo generate --help +cargo-generate 0.5.0 +Ashley Williams +cargo, make me a project + +USAGE: + cargo generate [FLAGS] [OPTIONS] --git + +FLAGS: + -f, --force Enforce to create a new project without case conversion of project name + -h, --help Prints help information + -V, --version Prints version information + -v, --verbose + +OPTIONS: + --branch + --git + -n, --name +``` diff --git a/src/installation/editor.md b/src/installation/editor.md new file mode 100644 index 0000000..d2e49a6 --- /dev/null +++ b/src/installation/editor.md @@ -0,0 +1,24 @@ + + +# ソースコードエディタの準備 (TODO) + +**TODO** このページは書きかけです。 + +Rust プログラムのソースコードは単純なテキストファイルです。編集にはテキストエディタというプログラムを使います。単純にテキストを読み書きするという機能に限ればテキストエディタは OS にも付属していますが、よりプログラミングに特化した機能を多く揃えるテキストエディタが無料で簡単に使える時代ですので、ぜひ活用するべきです。それらのエディタが持つ機能には例えば次のようなものがあります。 (一例です) + +- コードハイライト + 文法構造に合わせてソースコードを色付けして表示する機能です。たとえば型名や関数名などに色がつきます。この機能はコードを視覚的に把握するのに役立ちます。 +- 入力補完 + 変数名や関数名の最初の何文字かを入力するだけでそれから始まる要素を列挙して表示してくれます。目当てのものがあればキー一つで残りの部分を補完してくれます。 +- エラーハイライト + 入力するのと同時にリアルタイムに内容をチェックし、エラーがあればそれをエディタ上に赤線を引くなどの形で表示してくれます。コンパイラを直接実行する手間もエラーメッセージを読み解く手間もなくエラーに気づくことができるメリットがあります。 +- ドキュメント (説明書き) の表示 + 久しぶりに使う関数の引数の数や順番がわからなくなることはよくあることですが、こういうときにマウスカーソルを関数に合わせるだけでその関数のシグネチャやドキュメントを表示してくれます。 +- 定義へのジャンプ + その関数や型が定義されている場所を開いてくれます。構造体の中身を少し忘れてしまったり、関数の処理の中身を確認したりといったときに簡単にソース上を移動できます。 + +こういった機能は Language Server Protocol という共通の仕組みの上に実装されているので、これをサポートするエディタであればこれらの機能を享受できます。 Language Server Client を実装しているエディタは無数にあり、どれを使うかは完全に好みです。 + +ここでは、全くわからないという方に向けて [Visual Studio Code](https://code.visualstudio.com/) をインストールし、 Rust のコーディング支援機能を導入する方法を説明します。 + +TODO: 書く diff --git a/src/installation/index.md b/src/installation/index.md new file mode 100644 index 0000000..3986e69 --- /dev/null +++ b/src/installation/index.md @@ -0,0 +1,13 @@ + + +# 開発環境の準備 + +**TODO** このページは書きかけです。 + + + +この章では、手元のパソコンに Rust の開発環境と、テキストエディタとして [Visual Studio Code](https://code.visualstudio.com/) をインストールする方法について説明します。 + +環境を手元に用意するメリットは普段使い慣れたエディタや環境でコーディングできるようになることです。開発環境を用意して Language Server Protocol に対応するエディタ ([Visual Studio Code](https://code.visualstudio.com/) など) を利用すれば、入力補完やリアルタイムのエラーチェックなど様々な機能の恩恵を受けることができます。逆に言うと、自分の使い慣れたエディタや環境を使いたいと思わずむしろ環境を整える方が面倒だと感じられる方は AtCoder のコードテスト (リンク準備中) を利用するのが最も簡単な方法です。外部ライブラリにまつわる互換性の問題もありません。 + +既に Rust の開発環境がインストールされており、普段使い慣れたエディタや編集環境もあるという方には前半は全く不要な話となります。[`cargo-generate` のインストール](cargo-generate.md)へお進みください。それもインストールされている方はこの章で説明することはありませんので、実際に[参加方法の説明](../participate/index.md)へお進みください。 diff --git a/src/installation/toolchain.md b/src/installation/toolchain.md new file mode 100644 index 0000000..38a4074 --- /dev/null +++ b/src/installation/toolchain.md @@ -0,0 +1,38 @@ + + +# Rust ツールチェインのインストール (TODO) + +**TODO** このページは書きかけです。 + +**Note:** インストール方法は適宜変わる可能性があります。 + +まずは Rust 本体をインストールする必要があります。 + + +## ステップ 1: Rust に必要になる依存関係を追加する + +プラットフォームによっては Rust を実行するのに追加のプログラムが必要になりますので、まずはそれをインストールしましょう。 + +- Windows + TODO: Visual Studio のツールなどをインストール +- macOS + TODO: macOS は何が必要か調べる +- Linux (Windows Subsystem for Linux を含む) + TODO: Linux では何が必要か調べる + + +## ステップ 2: Rustup のインストールスクリプトを実行する + + にアクセスすると、お使いのプラットフォームに合わせてインストールスクリプトを実行する方法が表示されます。大きくは Windows と macOS/Linux で分かれます。 + +- Windows + `rustup-init.exe` のような実行ファイルのダウンロードリンクが示されていると思いますので、それをダウンロードして実行します。 +- macOS / Linux (Windows Subsystem for Linux 含む) + `curl` を用いてスクリプトをダウンロード・実行する方法が示されていると思います。書かれているコマンドをターミナルへ入力してください。 + +TODO: 以下、スクリプトの指示に従ってインストールする方法とインストールを確認する方法を書く + + +## ステップ 3: インストールされたことを確認する + +TODO: バージョン情報を表示してみる From 30735671c38599fd75144e6797da4eb76d619049 Mon Sep 17 00:00:00 2001 From: statiolake Date: Mon, 6 Apr 2020 15:10:06 +0900 Subject: [PATCH 03/24] Add link for the book --- src/installation/toolchain.md | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/installation/toolchain.md b/src/installation/toolchain.md index 38a4074..d47a427 100644 --- a/src/installation/toolchain.md +++ b/src/installation/toolchain.md @@ -4,25 +4,27 @@ **TODO** このページは書きかけです。 -**Note:** インストール方法は適宜変わる可能性があります。 +**Note:** インストール方法は適宜変わる可能性があります。情報が古いまたは不足している場合は、公式の [book](https://doc.rust-lang.org/book/ch01-01-installation.html) にある解説を適宜参照ください (英語) 。 まずは Rust 本体をインストールする必要があります。 ## ステップ 1: Rust に必要になる依存関係を追加する -プラットフォームによっては Rust を実行するのに追加のプログラムが必要になりますので、まずはそれをインストールしましょう。 +OS によっては Rust を実行するのに追加のプログラムが必要になりますので、まずはそれをインストールしましょう。 - Windows - TODO: Visual Studio のツールなどをインストール -- macOS - TODO: macOS は何が必要か調べる + TODO: Visual Studio Build Tools などをインストール +- macOS + TODO: Cコンパイラ (に付属するリンカー) のインストール - Linux (Windows Subsystem for Linux を含む) - TODO: Linux では何が必要か調べる + TODO: Cコンパイラ (に付属するリンカー) のインストール ## ステップ 2: Rustup のインストールスクリプトを実行する +OS によっては標準のパッケージ管理に Rust のパッケージが存在することもありますが、ここでは Rustup という Rust のバージョン管理プログラムを通してインストールすることをおすすめします。このプログラムを使うと、最新版へのバージョンアップや特定のバージョンのインストールがコマンド一つで実行できます。また、そのようにしてインストールされた複数のバージョンの Rust を簡単に使い分けることができます。 + にアクセスすると、お使いのプラットフォームに合わせてインストールスクリプトを実行する方法が表示されます。大きくは Windows と macOS/Linux で分かれます。 - Windows @@ -35,4 +37,9 @@ TODO: 以下、スクリプトの指示に従ってインストールする方 ## ステップ 3: インストールされたことを確認する -TODO: バージョン情報を表示してみる +インストール終了後、 Windows の方はコマンド プロンプト、 macOS または Linux の方は端末を開き、次のように入力してみましょう。次のようにバージョン情報が表示されればインストールは完了です。もしコマンドが見つからない、のようなエラーメッセージが表示される場合は、環境変数がまだ反映されていない可能性があります。一度再起動をして、もう一度試してみてください。 + +```console +$ rustc --version +rustc 1.42.0 (b8cedc004 2020-03-09) +``` From e5daf38b404bc766e8f53abfc1a3f50e16a66f6c Mon Sep 17 00:00:00 2001 From: statiolake Date: Mon, 6 Apr 2020 15:29:55 +0900 Subject: [PATCH 04/24] Add participate --- src/SUMMARY.md | 24 +++++++++++++----------- src/participate/index.md | 22 +++------------------- 2 files changed, 16 insertions(+), 30 deletions(-) diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 7234a2c..6add4d8 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -7,18 +7,20 @@ - [ソフトウェアのバージョンなど (TODO)](./todo.md) - [単一のソースファイル (TODO)](./todo.md) - [利用可能なクレート (TODO)](./todo.md) -- [開発環境の準備 (TODO)](./todo.md) - - [Rustツールチェインのインストール (TODO)](./todo.md) - - [ソースコードエディタとデバッガの準備 (TODO)](./todo.md) - - [cargo-generateテンプレート (TODO)](./todo.md) - - [cargo-generateのインストール (TODO)](./todo.md) +- [開発環境の準備 (TODO)](./installation/index.md) + - [Rustツールチェインのインストール (TODO)](./installation/toolchain.md) + - [ソースコードエディタの準備 (TODO)](./installation/editor.md) + - [cargo-generateのインストール (TODO)](./installation/cargo-generate.md) - [コンテストの参加方法 (TODO)](./participate/index.md) - - [Cargoパッケージの作成 (TODO)](./todo.md) - - [利用するクレートの選択 (TODO)](./todo.md) - - [テストケースの作成 (TODO)](./todo.md) - - [プログラムの作成 (TODO)](./todo.md) - - [プログラムのテスト (TODO)](./todo.md) - - [プログラムの提出 (TODO)](./todo.md) + - [コンテスト直前の事前準備 (TODO)](./todo.md) + - [Cargoパッケージの作成 (TODO)](./todo.md) + - [利用するクレートの選択 (TODO)](./todo.md) + - [依存クレートのコンパイル (TODO)](./todo.md) + - [コンテスト開始後の流れ (TODO)](./todo.md) + - [テストケースの作成 (TODO)](./todo.md) + - [プログラムの作成 (TODO)](./todo.md) + - [プログラムのテスト (TODO)](./todo.md) + - [プログラムの提出 (TODO)](./todo.md) - [Tips(小技集) (TODO)](./todo.md) - [クレートの使用例 (TODO)](./todo.md) - [AtCoder運営者向けの情報](./atcoder-env/index.md) diff --git a/src/participate/index.md b/src/participate/index.md index 9b0cfd1..9e248ea 100644 --- a/src/participate/index.md +++ b/src/participate/index.md @@ -2,24 +2,8 @@ # コンテストの参加方法 -本章ではどのようにしてAtCoderのコンテストに参加すればよいかを説明しています。各人の好みに合わせ、どのように参加しても構いません。ここでは次のような流れに沿って説明します。 +**TODO** このページは書きかけです。 -コンテストが開始する前にいくつかの準備を進めておくと、コンテスト開始後にスムーズに問題に取り組めます。 +本章では、手元にAtCoderのジャッジサーバーの環境と同等のプロジェクトを用意してコンテストに参加する方法について説明します。 - -## コンテスト開始前 - -1. 作業するためのプロジェクトを作成する。 - - ここでは`cargo generate`を利用します。 -1. 使いそうなクレートを有効化し、一度プロジェクトをビルドしておく。 -1. プロジェクトを問題数分だけコピーしておく。 - - 好みに応じて一つのプロジェクトを使い回すのでもかまいません。 - - -## コンテスト開始後 - -1. 問題を開き、テストケースを記述する。 - - テストで`cargo test`を利用しない方は不要です。 -1. プログラムを書く。 -1. テストする。 -1. プログラムを提出する。 +ここでは、現在AtCoderで提供されている環境と同じ環境を使って手元でもコーディングできるようにするための最低限の汎用的な方法をなるべく標準的な方法で解説しています。実は、より競プロやAtCoderへの参加に特化したツールというものもあり、インターネットを検索するといくつも見つけることができます。これらのツールには、テストケースをAtCoderから自動でダウンロードしてテストしたり、自作ライブラリを自動で埋め込んで提出できる形に整形したり、そのツールから直接提出できたりするようなものも存在します。ここではそういったツールのご紹介はしませんが、競プロに慣れ、本格的に取り組んでみようと考え始めるようになれば一度検討してみるのもよいかもしれません。もちろん既存のツールを使わずに、自分にとって最も参加しやすいスタイルを新しく確立するのも面白いことです。 From bd2284534deec2b82f68a1bdda205340ce874857 Mon Sep 17 00:00:00 2001 From: statiolake Date: Mon, 6 Apr 2020 15:32:24 +0900 Subject: [PATCH 05/24] Add index for before-contest --- src/SUMMARY.md | 2 +- src/participate/before-contest/index.md | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 src/participate/before-contest/index.md diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 6add4d8..cc3b8a9 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -12,7 +12,7 @@ - [ソースコードエディタの準備 (TODO)](./installation/editor.md) - [cargo-generateのインストール (TODO)](./installation/cargo-generate.md) - [コンテストの参加方法 (TODO)](./participate/index.md) - - [コンテスト直前の事前準備 (TODO)](./todo.md) + - [コンテスト直前の事前準備 (TODO)](./participate/before-contest/index.md) - [Cargoパッケージの作成 (TODO)](./todo.md) - [利用するクレートの選択 (TODO)](./todo.md) - [依存クレートのコンパイル (TODO)](./todo.md) diff --git a/src/participate/before-contest/index.md b/src/participate/before-contest/index.md new file mode 100644 index 0000000..f879cbd --- /dev/null +++ b/src/participate/before-contest/index.md @@ -0,0 +1,12 @@ + + +# コンテスト開始前 + +**TODO** このページは書きかけです。 + +コンテストの開始前にプロジェクトを準備して一度ビルドしておくと、コンテスト開始後の動きがスムーズになります。特に初回ビルド時は依存クレートのコンパイルに時間がかかります。お使いのパソコンのスペックにもよりますが、もしすべてのクレートを有効にした場合は完了まで数分程度かかるとお考えください。 + +1. 作業するためのプロジェクトを作成します。 +1. 使いそうなクレートを有効化し、一度プロジェクトをビルドしておきます。 +1. プロジェクトを問題数分だけコピーしておきます。 + - 好みに応じて一つのプロジェクトを使い回すのでもかまいません。 From 95207ce24f14d692c2246dcecf3375ad30b45409 Mon Sep 17 00:00:00 2001 From: statiolake Date: Mon, 6 Apr 2020 15:34:34 +0900 Subject: [PATCH 06/24] Add index for during-contest --- src/SUMMARY.md | 2 +- src/participate/during-contest/index.md | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 src/participate/during-contest/index.md diff --git a/src/SUMMARY.md b/src/SUMMARY.md index cc3b8a9..b99c84a 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -16,7 +16,7 @@ - [Cargoパッケージの作成 (TODO)](./todo.md) - [利用するクレートの選択 (TODO)](./todo.md) - [依存クレートのコンパイル (TODO)](./todo.md) - - [コンテスト開始後の流れ (TODO)](./todo.md) + - [コンテスト開始後の流れ (TODO)](./participate/during-contest/index.md) - [テストケースの作成 (TODO)](./todo.md) - [プログラムの作成 (TODO)](./todo.md) - [プログラムのテスト (TODO)](./todo.md) diff --git a/src/participate/during-contest/index.md b/src/participate/during-contest/index.md new file mode 100644 index 0000000..75d3e55 --- /dev/null +++ b/src/participate/during-contest/index.md @@ -0,0 +1,11 @@ + + +# コンテスト開始後 + +**TODO** このページは書きかけです。 + +1. 問題を開き、テストケースを記述します。 + - テストで`cargo test`を利用しない方は不要です。 +1. プログラムを書きます。 +1. テストします。 +1. プログラムを提出します。 From 7be7288c420f45c07bc8c59f4059ea635ef8e5cc Mon Sep 17 00:00:00 2001 From: statiolake Date: Mon, 6 Apr 2020 15:39:08 +0900 Subject: [PATCH 07/24] Explain how to generate a new project briefly --- src/SUMMARY.md | 2 +- .../before-contest/generate-project.md | 37 +++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 src/participate/before-contest/generate-project.md diff --git a/src/SUMMARY.md b/src/SUMMARY.md index b99c84a..1d2837f 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -13,7 +13,7 @@ - [cargo-generateのインストール (TODO)](./installation/cargo-generate.md) - [コンテストの参加方法 (TODO)](./participate/index.md) - [コンテスト直前の事前準備 (TODO)](./participate/before-contest/index.md) - - [Cargoパッケージの作成 (TODO)](./todo.md) + - [Cargoパッケージの作成 (TODO)](./participate/before-contest/generate-project.md) - [利用するクレートの選択 (TODO)](./todo.md) - [依存クレートのコンパイル (TODO)](./todo.md) - [コンテスト開始後の流れ (TODO)](./participate/during-contest/index.md) diff --git a/src/participate/before-contest/generate-project.md b/src/participate/before-contest/generate-project.md new file mode 100644 index 0000000..561c670 --- /dev/null +++ b/src/participate/before-contest/generate-project.md @@ -0,0 +1,37 @@ + + +# プロジェクトを生成する + +**TODO** このページは書きかけです。 + +まずは AtCoder サーバーと同じ環境のプロジェクトを手元に準備します。 + +まずは、今から参加するコンテストのソースコードを置くフォルダを準備してください。 + +TODO: フォルダを作成してそこに cd する方法を説明する + +では、実際にプロジェクトを生成していきます。 + +## `cargo-generate` をインストールしている場合 + +`cargo generate` コマンドをインストールしている場合は、端末に次のように打ち込むことで、 AtCoder での環境と同様の環境のプロジェクトが生成できます。 + +```console +$ cargo generate --git https://github.com/rust-lang-ja/atcoder-rust-base --branch ja +Project Name: abc000 +Creating project called `abc000`... +Done! New project created /path/to/project/abc000 +``` + +これで表示されているパスにプロジェクトが生成されました。 + +## `cargo-generate` をインストールしていない場合 + +まずは空のプロジェクトを作成します。 + +``` +$ cargo init abc000 + Created binary (application) package +``` + +そして `abc000/Cargo.toml` の `[dependencies]` 以下に AtCoder で利用できるライブラリを追加してください。 [atcoder-rust-base](https://github.com/rust-lang-ja/atcoder-rust-base) の [ja ブランチ](https://github.com/rust-lang-ja/atcoder-rust-base/tree/ja) に含まれている Cargo.toml の雛形を参考にできます。ただしこれは `cargo-generate` 用の雛形のためプロジェクト名など一部の項目がプレースホルダになっており、そのまま使えるものではないことに注意が必要です。もし完全な形の Cargo.toml をお探しなら、 [ja-all-enabled ブランチ](https://github.com/rust-lang-ja/atcoder-rust-base/tree/ja-all-enabled) に有効な形の Cargo.toml が含まれていますので、こちらを利用することもできます。 From 61c1e5faf1a306cc80ceb26b9bb914b5dbc4a8fc Mon Sep 17 00:00:00 2001 From: statiolake Date: Mon, 6 Apr 2020 16:35:24 +0900 Subject: [PATCH 08/24] Add choose crates --- src/SUMMARY.md | 3 +- .../before-contest/choose-crates.md | 36 +++++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 src/participate/before-contest/choose-crates.md diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 1d2837f..c36fa53 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -14,8 +14,7 @@ - [コンテストの参加方法 (TODO)](./participate/index.md) - [コンテスト直前の事前準備 (TODO)](./participate/before-contest/index.md) - [Cargoパッケージの作成 (TODO)](./participate/before-contest/generate-project.md) - - [利用するクレートの選択 (TODO)](./todo.md) - - [依存クレートのコンパイル (TODO)](./todo.md) + - [利用するクレートの選択とコンパイル (TODO)](./participate/before-contest/choose-crates.md) - [コンテスト開始後の流れ (TODO)](./participate/during-contest/index.md) - [テストケースの作成 (TODO)](./todo.md) - [プログラムの作成 (TODO)](./todo.md) diff --git a/src/participate/before-contest/choose-crates.md b/src/participate/before-contest/choose-crates.md new file mode 100644 index 0000000..a482028 --- /dev/null +++ b/src/participate/before-contest/choose-crates.md @@ -0,0 +1,36 @@ + + +# 利用するクレートの選択とコンパイル + +先にも軽く触れた通り、依存クレートのコンパイルにはそれなりの時間がかかります。コンテストが始まってから最初の問題の提出前に実行するとなるとそれなりのタイムロスになります。そこで次の二つのことをコンテスト開始前に行ってしまい、コンテスト開始後になるべくスムーズに行動できるよう準備しておきましょう。 + +## 利用するクレートの選択 + +これは事前準備時間を短くする、またはビルドディレクトリのディスク容量を減らすことに効果があります。 + +すべての依存クレートを有効化すると、スペックや環境にもよりますが、初回のコンパイルに数分かかるようになり、ビルドキャッシュも数百 MB (メガバイト) になります。ただし二回目以降のコンパイル時間やコンパイル後のバイナリの実行速度には影響しません。すなわち、競プロとして AtCoder 上で不利になるようなことはありません。したがって、最初にすべてのクレートを有効にしてしまったほうがコンテスト中の自由度は高くなります。このあたりのバランスはご自分のパソコンのリソースと相談して選択してください。 + +## 事前コンパイル + +利用するクレートの選択を終えたら、次は事前コンパイルを行います。 + +TODO: コマンド プロンプトまたは端末を開き、プロジェクトのあるフォルダまで移動する方法を説明する + +端末を開いてプロジェクトのあるフォルダまで移動したら、次のようにビルドを行います。 + +```console +$ cargo build + Updating crates.io index + Compiling proc-macro2 v0.4.30 + Compiling unicode-xid v0.1.0 + Compiling syn v0.15.39 + Compiling lazy_static v1.3.0 + Compiling quote v0.6.12 + : + : + Finished dev [unoptimized + debuginfo] target(s) in 20.27s +``` + +`Finished` の文字が見えたら、依存クレートのコンパイルは完了となります。 + +> Note: ここでは `cargo build` としてデバッグモードでのビルドを行いました。実際の AtCoder では `--release` オプションをつけて実行速度を最適化するのですが、これをつけるとさらにビルド時間が伸びてしまうことや、デバッガによるデバッグがしづらくなることなどのデメリットがあります。加えて、手元の環境ですることはサンプルケースレベルの比較的小さいサイズの入力を試す程度であることが多いため、速度を最適化する必要性もさほどないことが多いのではないでしょうか。一方、手元でもリリースビルドでテストすることがあるという方は、この段階で `cargo build --release` も加えて実行しておくことをおすすめします。そうでないとコンテスト中にリリースビルド用の依存クレートのコンパイルが行われ、多くの時間を取られてしまいます。 From af78faa37de85f92007e4590a61a6928b765806a Mon Sep 17 00:00:00 2001 From: statiolake Date: Mon, 6 Apr 2020 16:57:24 +0900 Subject: [PATCH 09/24] Explain how to effectively copy a project --- src/SUMMARY.md | 1 + .../before-contest/copy-project.md | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) create mode 100644 src/participate/before-contest/copy-project.md diff --git a/src/SUMMARY.md b/src/SUMMARY.md index c36fa53..83d2e41 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -15,6 +15,7 @@ - [コンテスト直前の事前準備 (TODO)](./participate/before-contest/index.md) - [Cargoパッケージの作成 (TODO)](./participate/before-contest/generate-project.md) - [利用するクレートの選択とコンパイル (TODO)](./participate/before-contest/choose-crates.md) + - [プロジェクトのコピー (TODO)](./participate/before-contest/copy-project.md)] - [コンテスト開始後の流れ (TODO)](./participate/during-contest/index.md) - [テストケースの作成 (TODO)](./todo.md) - [プログラムの作成 (TODO)](./todo.md) diff --git a/src/participate/before-contest/copy-project.md b/src/participate/before-contest/copy-project.md new file mode 100644 index 0000000..6564f94 --- /dev/null +++ b/src/participate/before-contest/copy-project.md @@ -0,0 +1,19 @@ + + +# プロジェクトのコピー (TODO) + +競プロで書くコードは書き捨てにする、という方は先程作ったプロジェクトをすべての問題で使いまわしても問題ありませんが、コードをずっと残しておきたいとか、あるいは詰まったから一旦保存しておいて別の問題に行きたいことがよくある、といった事情で、プロジェクトを予め問題数分用意しておきたい方もいるかと思われます。この作業も少々手間ですので、このようにされたい方はコンテスト前に準備しておくとよいでしょう。 + +もっとも簡単で確実なのは、プロジェクトをそのまままるごとコピーすることです。容量に不安のない方はそれで構いません。しかし数百 MB に及ぶプロジェクトをそのままコピーすることは時間も負担もかかりますし、リソース的に難しいという方もいると思います。多くの容量を占めるのは `target/` 以下であり、しかもほとんどは全く同一のビルドキャッシュになります。そこでこの `target` フォルダをシンボリックリンクにしてしまい、実体は一つにしてしまうという手があります。 (TODO: Linux と macOS での動作確認をする) + +方法は、コピーするときに `target` フォルダだけ除外してコピーしておき、コピーされた各プロジェクトの中に、先に除外した `target/` フォルダを指すようなシンボリックリンク (Windows の場合、ジャンクションでも構いません) を作成します。 + +- Windows + + TODO: ジャンクション (`mklink /J target /path/to/original/target`) または (必要ならローカルセキュリティポリシーまたはレジストリエディタを使って SeCreateSymbolicLinkPrivilege 権限を有効にして) シンボリックリンク (`mklink /D target /path/to/original/target`) + +- macOS または Linux + + TODO: `ln -s /path/to/original/target target` + +ただし、このときはメインバイナリ `target/debug/` すらも共有になってしまうため、別のプロジェクトを `cargo run` する前に `cargo clean -p ` としてバイナリを削除する必要があります。 `cargo` はおそらくソースファイルとバイナリの更新日時を比較してリビルドの要不要を判断しているため、状態によっては前のプロジェクトの成果物をそのまま実行してしまうことがあります。 From fa3aaf946ee7b655d4ac3643e9a965af755de9b8 Mon Sep 17 00:00:00 2001 From: statiolake Date: Mon, 6 Apr 2020 17:04:41 +0900 Subject: [PATCH 10/24] Describe `rust-toolchain` file in a project --- src/participate/before-contest/generate-project.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/participate/before-contest/generate-project.md b/src/participate/before-contest/generate-project.md index 561c670..395247f 100644 --- a/src/participate/before-contest/generate-project.md +++ b/src/participate/before-contest/generate-project.md @@ -35,3 +35,5 @@ $ cargo init abc000 ``` そして `abc000/Cargo.toml` の `[dependencies]` 以下に AtCoder で利用できるライブラリを追加してください。 [atcoder-rust-base](https://github.com/rust-lang-ja/atcoder-rust-base) の [ja ブランチ](https://github.com/rust-lang-ja/atcoder-rust-base/tree/ja) に含まれている Cargo.toml の雛形を参考にできます。ただしこれは `cargo-generate` 用の雛形のためプロジェクト名など一部の項目がプレースホルダになっており、そのまま使えるものではないことに注意が必要です。もし完全な形の Cargo.toml をお探しなら、 [ja-all-enabled ブランチ](https://github.com/rust-lang-ja/atcoder-rust-base/tree/ja-all-enabled) に有効な形の Cargo.toml が含まれていますので、こちらを利用することもできます。 + +また、 Rustup を利用している場合、プロジェクトディレクトリに `rust-toolchain` というファイルを置いて中身に `1.42.0` とだけ書いておくと、 `cargo` などのツールを呼び出したときに自動的に Rust 1.42.0 のツールチェインを利用してくれます。もしそのツールチェインがインストールされていなければ自動でダウンロードが始まり、インストールされます。この先しばらくして Rust のバージョンアップが進み、再び AtCoder 側のバージョンとの乖離が大きくなってきたときは、間違って 1.43 以降にしか存在しない機能を利用してしまって Compilation Error を受けないためにも強制的に 1.42.0 を利用させるのが便利です。 From e5d9143395b7b8f7e242cf783960815662dda712 Mon Sep 17 00:00:00 2001 From: statiolake Date: Mon, 6 Apr 2020 17:42:45 +0900 Subject: [PATCH 11/24] Add explanation about RLS cache --- .../before-contest/choose-crates.md | 33 ++++++++++++++++++ .../before-contest/rls_building.png | Bin 0 -> 6888 bytes src/participate/before-contest/rls_finish.png | Bin 0 -> 1078 bytes .../before-contest/rls_install_prompt.png | Bin 0 -> 22288 bytes .../before-contest/rls_starting.png | Bin 0 -> 3859 bytes 5 files changed, 33 insertions(+) create mode 100644 src/participate/before-contest/rls_building.png create mode 100644 src/participate/before-contest/rls_finish.png create mode 100644 src/participate/before-contest/rls_install_prompt.png create mode 100644 src/participate/before-contest/rls_starting.png diff --git a/src/participate/before-contest/choose-crates.md b/src/participate/before-contest/choose-crates.md index a482028..78135b5 100644 --- a/src/participate/before-contest/choose-crates.md +++ b/src/participate/before-contest/choose-crates.md @@ -34,3 +34,36 @@ $ cargo build `Finished` の文字が見えたら、依存クレートのコンパイルは完了となります。 > Note: ここでは `cargo build` としてデバッグモードでのビルドを行いました。実際の AtCoder では `--release` オプションをつけて実行速度を最適化するのですが、これをつけるとさらにビルド時間が伸びてしまうことや、デバッガによるデバッグがしづらくなることなどのデメリットがあります。加えて、手元の環境ですることはサンプルケースレベルの比較的小さいサイズの入力を試す程度であることが多いため、速度を最適化する必要性もさほどないことが多いのではないでしょうか。一方、手元でもリリースビルドでテストすることがあるという方は、この段階で `cargo build --release` も加えて実行しておくことをおすすめします。そうでないとコンテスト中にリリースビルド用の依存クレートのコンパイルが行われ、多くの時間を取られてしまいます。 + +## (オプション) Rust Language Server の事前準備 + +> Note: この手順は Rust Language Server (RLS) を利用しない方は必要ありません。 + +RLS は `cargo build` とは別にキャッシュを持っており、初回起動時にキャッシュを作成します。したがって今の状態のプロジェクトは `cargo build` については十分高速に実行できますが、プロジェクトを開いてから補完などが機能するまでには時間がかかってしまうということです。したがって、このキャッシュについても今のうちに作っておくと、開いた直後から快適な編集ができます。 + + +> Note: 最近は RLS の後継 (RLS 2) として開発されている Rust Analyzer という Language Server もあります。 [GitHub のリポジトリ](https://github.com/rust-analyzer/rust-analyzer)によればまだ開発段階とのことですが、以前に比べ機能も揃ってきています。不具合や課題もまだまだあるとはいえ、特にレスポンス面では Rust Language Server を超えている部分も多く見られます。この説明では正式版の RLS を採用しますが、導入方法もだんだんと整備されて簡単になっていますので、興味のある方はぜひお試しください。Visual Studio Code であれば拡張機能を一つインストールするだけです。 + +実際にキャッシュを作る方法は、単に今作成したプロジェクトを開くだけです。以下では Visual Studio Code の場合に説明しますが、他のエディタを利用する場合はそれに合わせて行ってください。 + +- プロジェクトを開きます。 + + もし対応するバージョンの RLS がインストールされていない場合は、次のようなダイアログが右下に表示されます。ここで Yes を選択すれば自動的に RLS がインストールされます。 + + ![RLS is not installed. Install?](rls_install_prompt.png) + +- ステータスバー左側の様子をチェックします。 + + 開いた当初は、くるくる回るインジケーターとともに Starting と表示されています。 + + ![RLS Starting](rls_starting.png) + + しばらくするとくるくる回りながらビルドが始まります。右側には現在ビルドしているクレートが表示されます。 + + ![RLS Building](rls_building.png) + + それが終わると、くるくる回るインジケーターが消えて RLS とだけ表示される状態になります。 + + ![RLS](rls_finish.png) + + この状態になれば RLS の準備は完了です。 diff --git a/src/participate/before-contest/rls_building.png b/src/participate/before-contest/rls_building.png new file mode 100644 index 0000000000000000000000000000000000000000..34224985e6d2aac024baf945c3725c35d56e20f2 GIT binary patch literal 6888 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 literal 0 HcmV?d00001 diff --git a/src/participate/before-contest/rls_install_prompt.png b/src/participate/before-contest/rls_install_prompt.png new file mode 100644 index 0000000000000000000000000000000000000000..0337c361866c79dc6dcc77a8f424f4c4c493dc43 GIT binary patch literal 22288 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 a4kj# literal 0 HcmV?d00001 diff --git a/src/participate/before-contest/rls_starting.png b/src/participate/before-contest/rls_starting.png new file mode 100644 index 0000000000000000000000000000000000000000..ca6986673e6a86129ae85383ee7455f01d2aec53 GIT binary patch literal 3859 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 Date: Mon, 6 Apr 2020 17:55:11 +0900 Subject: [PATCH 12/24] Assume using rustup --- src/installation/toolchain.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/installation/toolchain.md b/src/installation/toolchain.md index d47a427..0db937b 100644 --- a/src/installation/toolchain.md +++ b/src/installation/toolchain.md @@ -23,7 +23,7 @@ OS によっては Rust を実行するのに追加のプログラムが必要 ## ステップ 2: Rustup のインストールスクリプトを実行する -OS によっては標準のパッケージ管理に Rust のパッケージが存在することもありますが、ここでは Rustup という Rust のバージョン管理プログラムを通してインストールすることをおすすめします。このプログラムを使うと、最新版へのバージョンアップや特定のバージョンのインストールがコマンド一つで実行できます。また、そのようにしてインストールされた複数のバージョンの Rust を簡単に使い分けることができます。 +OS によっては標準のパッケージ管理に Rust のパッケージが存在することもありますが、ここでは Rustup という Rust のバージョン管理プログラムを通してインストールすることを前提とします。このプログラムを使うと、最新版へのバージョンアップや特定のバージョンのインストールがコマンド一つで実行できます。また、そのようにしてインストールされた複数のバージョンの Rust を簡単に使い分けることができます。 にアクセスすると、お使いのプラットフォームに合わせてインストールスクリプトを実行する方法が表示されます。大きくは Windows と macOS/Linux で分かれます。 From 42b5a08b7179aa4efea29e1f73c3a1d6903570d3 Mon Sep 17 00:00:00 2001 From: statiolake Date: Mon, 6 Apr 2020 18:41:50 +0900 Subject: [PATCH 13/24] Explain how to install RLS --- src/SUMMARY.md | 1 + src/installation/editor.md | 4 +-- src/installation/rls.md | 53 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 55 insertions(+), 3 deletions(-) create mode 100644 src/installation/rls.md diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 83d2e41..1c2db89 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -10,6 +10,7 @@ - [開発環境の準備 (TODO)](./installation/index.md) - [Rustツールチェインのインストール (TODO)](./installation/toolchain.md) - [ソースコードエディタの準備 (TODO)](./installation/editor.md) + - [Rust Language Server のインストール (TODO)](./installation/rls.md) - [cargo-generateのインストール (TODO)](./installation/cargo-generate.md) - [コンテストの参加方法 (TODO)](./participate/index.md) - [コンテスト直前の事前準備 (TODO)](./participate/before-contest/index.md) diff --git a/src/installation/editor.md b/src/installation/editor.md index d2e49a6..7137a55 100644 --- a/src/installation/editor.md +++ b/src/installation/editor.md @@ -19,6 +19,4 @@ Rust プログラムのソースコードは単純なテキストファイルで こういった機能は Language Server Protocol という共通の仕組みの上に実装されているので、これをサポートするエディタであればこれらの機能を享受できます。 Language Server Client を実装しているエディタは無数にあり、どれを使うかは完全に好みです。 -ここでは、全くわからないという方に向けて [Visual Studio Code](https://code.visualstudio.com/) をインストールし、 Rust のコーディング支援機能を導入する方法を説明します。 - -TODO: 書く +本説明はできるだけエディタによらないように進めていくつもりですが、エディタに特有の内容が現れるときは [Visual Studio Code](https://code.visualstudio.com/) を想定して説明します。それ以外のエディタを使われる方は適宜読み替えてお読みください。次節で Rust のコーディング支援機能を導入する方法を説明します。 diff --git a/src/installation/rls.md b/src/installation/rls.md new file mode 100644 index 0000000..6abb4c7 --- /dev/null +++ b/src/installation/rls.md @@ -0,0 +1,53 @@ + + +# Rust Language Server のインストール + +**TODO** このページは書きかけです。 + +Rust Language Server (RLS) は、ソースコード編集中の様々な支援機能を提供するためのプログラムです。例えば、プログラムを編集しながらリアルタイムでエラー箇所をハイライトしたり、コード補完機能を提供したり、定義にジャンプしたり、簡単なドキュメントを表示したりといった様々な機能があります。使い慣れたエディタとともにこうした支援機能が使えることが、ローカルに Rust の環境を作る大きなメリットです。 + +なお、こうしたコーディング支援機能が不要だと考える方はインストールをする必要はありません。 + +> Note: Visual Studio Code を利用している方は、拡張機能が自動的にインストールしてくれるため、ここで直接インストールする必要はありません。 + +さて、 RLS は Rust 本体と同時に配布されているため、 RLS のインストールをする前に対応するバージョンの Rust をインストールしなければなりません。現在 AtCoder で使える Rust のバージョンは 1.42.0 ですので、コマンド プロンプトあるいは端末を開いて次のようにコマンドを実行します。 + +```console +$ rustup install 1.42.0 +info: syncing channel updates for '1.42.0-x86_64-pc-windows-msvc' +info: latest update on 2020-03-12, rust version 1.42.0 (b8cedc004 2020-03-09) +info: downloading component 'cargo' +info: downloading component 'clippy' +info: downloading component 'rust-docs' + 12.0 MiB / 12.0 MiB (100 %) 5.9 MiB/s in 1s ETA: 0s +info: downloading component 'rust-std' +info: downloading component 'rustc' + 35.6 MiB / 35.6 MiB (100 %) 28.2 MiB/s in 1s ETA: 0s +info: downloading component 'rustfmt' +info: installing component 'cargo' +info: installing component 'clippy' +info: installing component 'rust-docs' + 12.0 MiB / 12.0 MiB (100 %) 2.4 MiB/s in 4s ETA: 0s +info: installing component 'rust-std' +info: installing component 'rustc' + 35.6 MiB / 35.6 MiB (100 %) 10.7 MiB/s in 3s ETA: 0s +info: installing component 'rustfmt' + + 1.42.0-x86_64-pc-windows-msvc installed - rustc 1.42.0 (b8cedc004 2020-03-09) + +info: checking for self-updates +``` + +続けて RLS をインストールします。なお必要なコンポーネントは変わるかもしれませんので、適宜 [RLS のリポジトリ](https://github.com/rust-lang/rls)も参照してください。 + +```console +$ rustup component add --toolchain 1.42.0 rls rust-analysis rust-src +info: downloading component 'rls' +info: installing component 'rls' +info: downloading component 'rust-analysis' +info: installing component 'rust-analysis' +info: downloading component 'rust-src' +info: installing component 'rust-src' +``` + +両方の実行が完了すれば、 RLS のインストールは終了です。 From bcd97d199d74816cb8f0ecd0e50317527d55ca69 Mon Sep 17 00:00:00 2001 From: statiolake Date: Mon, 6 Apr 2020 18:53:48 +0900 Subject: [PATCH 14/24] Add note for default template --- src/participate/before-contest/generate-project.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/participate/before-contest/generate-project.md b/src/participate/before-contest/generate-project.md index 395247f..f6ab52d 100644 --- a/src/participate/before-contest/generate-project.md +++ b/src/participate/before-contest/generate-project.md @@ -14,7 +14,7 @@ TODO: フォルダを作成してそこに cd する方法を説明する ## `cargo-generate` をインストールしている場合 -`cargo generate` コマンドをインストールしている場合は、端末に次のように打ち込むことで、 AtCoder での環境と同様の環境のプロジェクトが生成できます。 +`cargo generate` コマンドをインストールしている場合は、次のようにコマンドを実行してプロジェクト名を入力すれば AtCoder での環境と同様の環境のプロジェクトが生成できます。 ```console $ cargo generate --git https://github.com/rust-lang-ja/atcoder-rust-base --branch ja @@ -25,6 +25,8 @@ Done! New project created /path/to/project/abc000 これで表示されているパスにプロジェクトが生成されました。 +> Note: ここで生成されるプロジェクトはサンプルとして AtCoder Beginner Contest 086 C - Traveling の解答例とサンプルケースのテスト方法例が書かれてます。テンプレートを自分向けにカスタマイズしたい場合は、リポジトリをフォークするなどして編集し、それを URL に指定して生成させることもできます。 + ## `cargo-generate` をインストールしていない場合 まずは空のプロジェクトを作成します。 From eff337ffbe7b2b4aaaf8771574b191d537a008f2 Mon Sep 17 00:00:00 2001 From: statiolake Date: Mon, 6 Apr 2020 19:29:27 +0900 Subject: [PATCH 15/24] Add URL to ABC086C --- src/participate/before-contest/generate-project.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/participate/before-contest/generate-project.md b/src/participate/before-contest/generate-project.md index f6ab52d..cd1e279 100644 --- a/src/participate/before-contest/generate-project.md +++ b/src/participate/before-contest/generate-project.md @@ -25,7 +25,7 @@ Done! New project created /path/to/project/abc000 これで表示されているパスにプロジェクトが生成されました。 -> Note: ここで生成されるプロジェクトはサンプルとして AtCoder Beginner Contest 086 C - Traveling の解答例とサンプルケースのテスト方法例が書かれてます。テンプレートを自分向けにカスタマイズしたい場合は、リポジトリをフォークするなどして編集し、それを URL に指定して生成させることもできます。 +> Note: ここで生成されるプロジェクトはサンプルとして [AtCoder Beginner Contest 086 C - Traveling](https://atcoder.jp/contests/abc086/tasks/arc089_a) の解答例とサンプルケースのテスト方法例が書かれてます。テンプレートを自分向けにカスタマイズしたい場合は、リポジトリをフォークするなどして編集し、それを URL に指定して生成させることもできます。 ## `cargo-generate` をインストールしていない場合 From 59ffdb4019eec4c69ac4467742d0be249767c166 Mon Sep 17 00:00:00 2001 From: statiolake Date: Mon, 6 Apr 2020 19:33:28 +0900 Subject: [PATCH 16/24] Explain how to write test --- src/SUMMARY.md | 2 +- src/participate/during-contest/index.md | 1 - src/participate/during-contest/write-tests.md | 65 +++++++++++++++++++ 3 files changed, 66 insertions(+), 2 deletions(-) create mode 100644 src/participate/during-contest/write-tests.md diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 1c2db89..cefb549 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -18,7 +18,7 @@ - [利用するクレートの選択とコンパイル (TODO)](./participate/before-contest/choose-crates.md) - [プロジェクトのコピー (TODO)](./participate/before-contest/copy-project.md)] - [コンテスト開始後の流れ (TODO)](./participate/during-contest/index.md) - - [テストケースの作成 (TODO)](./todo.md) + - [テストケースの作成 (TODO)](./participate/during-contest/write-tests.md) - [プログラムの作成 (TODO)](./todo.md) - [プログラムのテスト (TODO)](./todo.md) - [プログラムの提出 (TODO)](./todo.md) diff --git a/src/participate/during-contest/index.md b/src/participate/during-contest/index.md index 75d3e55..0d42996 100644 --- a/src/participate/during-contest/index.md +++ b/src/participate/during-contest/index.md @@ -5,7 +5,6 @@ **TODO** このページは書きかけです。 1. 問題を開き、テストケースを記述します。 - - テストで`cargo test`を利用しない方は不要です。 1. プログラムを書きます。 1. テストします。 1. プログラムを提出します。 diff --git a/src/participate/during-contest/write-tests.md b/src/participate/during-contest/write-tests.md new file mode 100644 index 0000000..ceb0f05 --- /dev/null +++ b/src/participate/during-contest/write-tests.md @@ -0,0 +1,65 @@ +# テストケースの作成 + +**TODO** このページは書きかけです。 + +Rust には組み込みでテストをするための機構が備わっています。これらの様式に則ってテストを書くと、 `cargo test` コマンドを実行するだけでテストを実行することができます。これを競プロでもサンプルケースが通るかどうかを確かめるのに利用することができます。この機能の使い方の例として、生成したテンプレートの `tests/sample_inputs.rs` には [AtCoder Beginner Contest 086 C - Traveling](https://atcoder.jp/contests/abc086/tasks/arc089_a) のサンプルケースが書かれています。 + +> Note: 直接手と目で確認する場合や、別のコンテスト支援ツールを利用する場合などはこの手順は必要ありません。また `cargo test` を利用しない場合、サンプルのテストファイルは削除しても良いですし、しなくても特に問題はありません。 + +なんとなく見れば分かるように、 `output_with_stdin()` の引数にサンプル入力を渡し `assert_eq!(output.stdout_str(), );` で期待する出力と一致するかどうかを確かめます。一致しない場合、テストは失敗します。 + +```rust +use cli_test_dir::*; + +const BIN: &'static str = "./main"; + +#[test] +fn sample1() { + let testdir = TestDir::new(BIN, ""); + let output = testdir + .cmd() + .output_with_stdin(r#"2 +3 1 2 +6 1 1 +"#) + .tee_output() + .expect_success(); + assert_eq!(output.stdout_str(), "Yes\n"); + assert!(output.stderr_str().is_empty()); +} + +#[test] +fn sample2() { + let testdir = TestDir::new(BIN, ""); + let output = testdir + .cmd() + .output_with_stdin(r#"1 +2 100 100 +"#) + .tee_output() + .expect_success(); + assert_eq!(output.stdout_str(), "No\n"); + assert!(output.stderr_str().is_empty()); +} + +#[test] +fn sample3() { + let testdir = TestDir::new(BIN, ""); + let output = testdir + .cmd() + .output_with_stdin(r#"2 +5 1 1 +100 1 1 +"#) + .tee_output() + .expect_success(); + assert_eq!(output.stdout_str(), "No\n"); + assert!(output.stderr_str().is_empty()); +} +``` + +標準入力を書く場合、通常のダブルクオートでも改行を含めることはできますが、特別な文字 (`\` や `"` など) を含む場合に備えて、サンプルのように `r#"........"#` のような形式を使うとよいかもしれません。 + +> Note: `r"..."` は基本的には普通の文字列ですが、文字列内の `\` をエスケープしません。また `"` そのものを含めたいときに備えて `r####"...."####` のように `#` を任意個挟むことができます。 + +なお、この方法では出力を単純に文字列同士の比較によって判定しています。浮動小数点数のように出力に誤差を認める形式や「グラフを一つ出力せよ」のように解が複数あり得る問題のテストにはそのままでは利用できません。それでもテストには任意のコードがかけるわけですから (実際にそこまでするかどうかは別としても) 浮動小数点数やグラフをパースしてチェックするというような使い方も可能です。 From 2a5b2ca7d5a86120f6fdd7576bf46e4148bb467b Mon Sep 17 00:00:00 2001 From: statiolake Date: Mon, 6 Apr 2020 20:07:39 +0900 Subject: [PATCH 17/24] Explain how to code --- src/SUMMARY.md | 2 +- .../during-contest/std-doc-version.png | Bin 0 -> 44927 bytes src/participate/during-contest/write-program.md | 13 +++++++++++++ 3 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 src/participate/during-contest/std-doc-version.png create mode 100644 src/participate/during-contest/write-program.md diff --git a/src/SUMMARY.md b/src/SUMMARY.md index cefb549..8beadcc 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -19,7 +19,7 @@ - [プロジェクトのコピー (TODO)](./participate/before-contest/copy-project.md)] - [コンテスト開始後の流れ (TODO)](./participate/during-contest/index.md) - [テストケースの作成 (TODO)](./participate/during-contest/write-tests.md) - - [プログラムの作成 (TODO)](./todo.md) + - [プログラムの作成 (TODO)](./participate/during-contest/write-program.md) - [プログラムのテスト (TODO)](./todo.md) - [プログラムの提出 (TODO)](./todo.md) - [Tips(小技集) (TODO)](./todo.md) diff --git a/src/participate/during-contest/std-doc-version.png b/src/participate/during-contest/std-doc-version.png new file mode 100644 index 0000000000000000000000000000000000000000..f3bb53b5a3ce4f28ea652788327c80c3a4da8ba8 GIT binary patch literal 44927 zcmdqJbzGBS8$YTj!a$UeMrjZv1*Adg4rysnL_m@z+*WA}64&mC8NukS^Kj+QbB5gpNu8#hQ)RTN&{xN-Z#jT<++ z2=Rcw5b~Ai1HW#%zf_jH@oj`*3;1yR?F-EpH*QqN5o4_JfzO~1DkknXZm@0Qer^WY z;xpX1QTaes;f21B#ohwio1r&L6pJD_QV*;?%RG3r9DIIwD)Ty6TPvs)e9MtHwfFU{ z$7yf(%)@*h-rEuTeE3)kuP?5VM&n1Mbqtf)1IZ3GHnx}K-QiKR;#M^LV(~X^xvXe{ zNyz&IZCRlopkEG}iyhQN7A8a{s2AXsLTr;7+S=Zpo)a5?QnxiC!mnR8)^dspxYq*; z3T_tMD=#fghwS>*+XIcfZuFRgL;t#wf}mjTbt9I@2oU9UBV7#**nhjS`TuoS_Ujj$ z`Egh?;-YxHxWf4O_;WbK68kzlUpX%DVypOwn9_&fV3~*ksxq)a3Ob520kK%t#K#pk%2X4TQ z36~(rOA&)v^Qf12sZa;Ib*+7~NMUkdH}72cYe&eTFZ8QG9VUZ0?B1KJuQaW99?MhY z%<@Pu`=+s;q^Bi*KJRW+X|XUldA6S6k}c*c7x>AZ+X}bS!tw&S>F+qyV=uw)wbeF>{>QD zTl^$UR5>(uxRI1>%*R?zgOBks<_6_|ti9N)d30ZunB;BorWbbbj_9zIRR%gBO@cGF0H2-aLoG5+nj)<5Na%H6q2I%`4-~!=HlXFakk$!u()R5?SA1? zn+ZU$n88VnY0bZ{1akAH6WH{(Pmwh_t<5{XUgmAoQIN$`;8yT9r+&C2FlP_c3MkWK zToriS57RLQqKiKHnOg3Pz8iwMkv&F6NhQfT|Ly6eD(rAuYNL+&U~|2Mn*_PzNO|f6N6yEDDUu5@Ve0Z_wRE89b_(spxl%iumoTistc2K zmO?VO?_Z&Ay93<__Wq}v(%M=BtW$?k+flMIW5CJgSial%5sXr$qs|46jd209`qWQo ziY^F0eagZ~VkMVM#G$W>n_w4tsd5|k&o}n-5^C&;rWN>dJ;xd1Xj+*mLiS4_>^|dS zi|;Xs==_I(83=X*!qSkC(|bDfq!P2rDN7~W1nLX}zpCEP)up7QobF6T9V|0m zomyVidhQtV6lXp*2&cS4_RB8%AGFdxb0TdICnY0>&&(755 zl`+LS)iPdgDo^*XdfXf+U-VfaDKK!`)>!W%=ErU4T0e&d>}4mE8^odiz|>go^h~I7 zkV}|VzW;tZ=ImHhde(RUecRT=&LHFpbx0PwCNI2#8NI@c^48C@kb{_k<0d5q9Q^xb zCmJ7AVWFX+L6(1)SlI#x6Qvi1`P=9J{$+zOF)diW#+^%`|K0DSbYZ8>$mJ+=hvR_( z6;snW;Cy-j(tmz7DK`86*cRZ7CfSB`YlGdR4xTJe_>R1Hk*PM)QdSVU!Sdv?Cn9BVKvK5u8(>W%(=zo&X8~`V;q;?*0>ygc)W%035i%8X> z)z;uTgKnQrS+<`}nywX40?Xc!@Ue+p`$dD#=5J=yT0_vx1D5WhqM~ZFB8Pqx1*cZa z`J(@*40`u$Z!QOXGzbU<(beYO-a`h4Bt5p!9G~M~qJne%kNodmp??aEirqmOYw|?2 zSpm`(TWv*=s1tBB$T?-^9)tPi@Yq>g*RPK=*Keny-nnV3$oF_X0yUZ=d(|(CMXdTN zO%4nUEVlZ)H1E|#@ilD%I){uHWIW;$c$`sDQ9*EzfslSeKCJ_)w##X(!c!_E2Qpj@ zBIfHjQ>=C6*{(Jw-W9ShZ@=7gDSIQiRglQndNN*D_iW-ZnvUbm5u5&|9&rA3%Xx6;k$U<7#*2JEv2))?ZU6Ghymdr|L0X zlHZ2`7(~BYUQZBls3j^Df=X>ZXlq^%6uf7{segF1pp9;0x6tOhLiP7Di^ne%7uvdD zX^&^lDhLAoJ2?=ifS&UAKrComUJlFF%F3SXuLg8nAo3Yo5zW-qnHMB>ru7+tT>oS4hliUsaje~}jdni|vF3a0LUz~7si7BYXN1MvA+t^C) zo}l_6n0`Q=_Omlh1^WhkB9nERt0T#c!j#{&j=qd0Zc85Bh*^0`n8w^SV%u*vHyEJ` z1JkRXpZw7tjvyDX)8UJz?`Zhpr^;OA`0gEQ_pR&`*|O(O5>iq;MK^mwj)EP|7@jWH zdlt^N=16gA|*753oP zty?xWH|G$I8`9DT-r>q?=@k7ivI?=%nf_=be(s=>+`39h#^*kzb%cdKRI*2ZdaG*!?elYOQLz4q(uYob>hNcT8CSE8 zmB|N&^70((Og-u`%K_?JJ3HuYqjv80l{?9I4M^ac36WM5;rJ@c9iMKgr|`tPdjw}W zppMp%d6~V&-+F;*Z8gZVoIth;Q-f*=cbgfGK6?Wu^~>Ar7nXU9T0#5U2U``28D30R`<~xg(+=qQx$t^7NCG4xQQb|nVHRXWU$Wab$ z9NUC??VH}5dkA8ty5Aaf$!44YC0ddR3WQT5N{4Q1#4^&KktZCzqe`VN!mMa#GtfT$ zJAN70x}0I$5_q*>NmG38>vDe6Ge{A#v=RNKqnJ}B;54;4+7jgdz8Uk$)@4#ghE4-k zHF-JOx*u@%ZmZVva!GXKD%AzA<6fiX2i!?k}yuh(YNItz;p47dSe zQ&fpreXHAYv0dgs_`=@B<$lKKPG$SI;*e^HZrT!v((gF^z7i22VQopnYh4mOR&pUa zOOvK9$u0)Xs|o7Stpaw~Y1=rH*gQHBVPPhk#P5VlFAL%u7Ud~Zj+t~-0|msqn1?}ITnQ+w_~TS5+L?G&6)hPeQKA$`5=F?cHBw8$YiU# zMS%Sz%PaqeNI8}PB>7GEk9XVgLwG!!t)il3)Lgz6u=L$C|=_teFe z4Dw3lcI+S9kXcsNtCCA!;0Vak9iIIOosbng8jSMxXfCGMKHX&ZX56X}w09H8?b@-b zr?zI=K`$5`90ssi;M9D49F}GM1|)DTOPLPywwl3mfE+%3k+=4=*F%&+)4a{;_CBC! zJz;_ta;Nj|qg%A;Dx;yHElML~iXclcmwfK1Fx4Vm()$~@jIN6dJ`s#~nePJ+s#057riUZ@fFlV` zW=(*mI=7+so8yBPn1nZ%nfi^(6_0xLy1W{vEc|)XwDVr#Gg`$|vbM(S*(L-ZEOEHWl<588XkT4=(sCnoH}2l z0(Qv>vD|ANABHx3P7(K9Ik3E13Tv%F&i%*J9uLoP^+wy)g5{{N%&z2utIetcwh4a0 zK~V_^E-)t9*+M_I_B8(-Z*aS~u#Mn~Q|TGI#en!{80tNUi&Dl zRzH;JS99j_#g0oG%5Ip_1n}Bgn2KZlNf!V8`x@x}R~vGn=O2v*H0d@M4Jt9 z47_tsML*kjoz_w-i0%|~Ji6n}Fg*%{aNPR$FUiyhzf6{!1pg#3thBg1&bcxR)TEGl z8JB~_p0~F{t^%baJ4TNB=v^>}VX_atBul5i#D#iO(CzyWq`dJf(7=Og`96yzKtBuS zpBix8oV)R9cDB}W4Sut8Saby^u?EK{v0_?Zoja#WSP|8F@$IOL_7|mGDQtI~@H}p~ zS#UhYRD#!@Sci!|XM@@}msH}vf@U~3scJpI!*?{1%5qJW2SE)gghs?}`L|_$+bt>1 zep8M{A=!%7qO}=@3dzNzW{6@;njJXE3E+8a( z@5_|G5@a1;WhD~#f+_p+am9KYrG@WWa#g+nAlc1=LK+D=4|lPN2d2xX)8l9v2`8G~ zO&|zt4#YIL*j%2@5kGr#b>5odpZIx{sSJUCX>D{l(Go*sLgB^+}3mIp+S%$9z~5v?ga``UY>QI)LXJw0vOr_^>wo6F6-_wAKtLsvC_ z{(2kz43OeYll?ZdvnRPKHGgi>J~FvG8<%fXW?S9ku)B~TCRM3_VtIhrcgH2vdUqL@1; zlXRl{-|%QTE!|K2Lnih?bI+gKzfpblSJP0f9n@vXLpygE7S9bgU@H$Fh|1|WJydbe1Kgz2$4Rc zt7>y=as!o{)@uclemI>lqCaS<$z;d*Ep_kbiXg-j4d1`(k=!Gjd^-8lROjAf?dm-p zg-y*EdbzM)k>gY`3;m1`AoR4eeHDT-_6kcUu6sS0fCC9id1X8{NuTyry%FMYiLVP< zTLn*xz!4Os+UhD&U^qEH+|zz&PP^Uirz&Y|`_cEer}lxH3$_sCC};G|i~Q92fRmW> zRgX8oAz1^ALL9`3{=8QVc1P~&-)W$Hn2b-C@ZDP+foJI>`7R8GC0zr*5u$P4`XD6 zLx$x-zf^-J+5*sRfO#D{Nb>aX7#Qu!wXk0Aocr$Cm&hL8A9#g^4|A0V^-ISnhuLOS zL5V&`Oh&_Q-*)$2@SOV8utH5={|Vv6m0txN^6^tfd0BmIpeZ5iK~B0r(5AMXd9x<_ zXYzSL14n?nMp9~=_;4xr)5@Kauz^AFHnIf+Sn!@u(8yK0hx9gG2 zoMub=uX@n&2)P|pl{(L_by2Z?z+-JF+1lH}x_6A)=3)1U^z3np zsdHoRl+J7_L)GWDpTFF;$7@hL#Gx@Y@BS275yx)7Zrs(;whvJ;?R3LRmFq@k>0F|c zy`!hlOCj^mwF+JoAU)iIN|w_9wjY(-rWM7(LL?04T-LA^JU`CLS3iN0RZD( z+e&-tLfRga(TqDhmV!0(4)gAIGw0RihIKFj9R!ay%9TM8G0tCcS5mWnr$3H9_4o0+ z667qit2A>B(}R3)`|R|4vGf!m22hFxP29RK#Z=sY^}Fraxj)$NT1TbJ|MYh22U1T4 zDIY+8lligF)T9ad)xpthSOJGMhG1 zsKOfYS%>+z0+J6hL-O>=Z3*4`G|{?ph3GH{GVI$oK35Og462G7M-&K8b|r_~y6u!+ z+xN$;56|cs^&9@x-c&PA%JCDjmV#aZ=v7-~rM4E?a!&-ssO%NS|6nGzio-0bYNr;v zU5OoXgYZ(_eg8x7x#+%|^~UDyfU3lm{y58k(}| z9>}+m*{#oC2DtD(H@2RoGn*1N>(ihcGFdumtWq8*D_SBJg z`lU^fKpOqCU%zvITif+{bdR0nZ`@t^qN8|e?h!lCyh?4uu7ANVVW&LfWEi*v*k1r~ zNdKgq<^!T^dh~!e@6R+tuutkHochwn53C+Y#Ygj|x54nwW164*>1fi^lcUezA9w0Hy0&DdMFD z&Z(piyj284{QAw?rDZ{!5*`Ek?WYwkgC!z;=6pVn6<UyXouiCr|bbp3sib#nsElAf0SQX6HL9kJuo zH<4_!m?Rx$uq@_iZWMk3TXUvW81MW}s-hcxKUyx&#&@2AhJS;&h~1jHh4vtnysM3z zVW`W8n!@ewYdSZg#HwRE>!{b-u+K$#t7`=uee^Jg?EJEK<$#AOt4ooQ&OpH}yz53( ze{v^l1?Q`vLUt-4|2`3{5;(^)$_By%&IkD=D@y`j5@P`@Z|FWtWU5X`$m9LxOPxrN z!C^Lj|BHtXM0bwQm`gm`el0cd#Wy^7$2LaJ{hZ4Z&`5pq>t4lTvQCZ~6x`>oi}^)L zas@8AHX$*o{~F>tA&Z7V7X%9xoK?6jcQi+@Op7^}P zmxdz9Wmag5t0u0BAs5BnVUG8$-jf;X@)oajQ}vDCwa)3yep39WM+N3^Pr>(OQ+Gw> zW8awCd_7)zd0(Frs#=NU4#k5M9qFUf953ERZT|(wmhj$(^W45nJ;L$PgwnA)*Fh9xlticdA?(q zSS;CAXt+W=qkyISTs?Q%%bWHHo{$rQ?h!7XJa4}WKu^f?fjcplmlHr7d0#7rlWHs7 z@msv*6Vp1UFT)X^RRFIqVE{y#DduW3SNHxJN_nZU^tA6{nq5CWc1Kw)CP@Vz`2bIe zvMxt*zjdEsm;4{<->3QDkracnoi?%4LhExo1@ix_@dX;qYdgP}BQF$MGM7$`sGc?-`r`c#YhBkBuyEn?c^eRh+jIfcElu_YnfkY9yim z+j&m9O=F{fKr?3}MZw*XFi=vq5OBWW7U>XcdQ&S??9(>%!%h10F=fUISA;bk$Y7(f zzIA&1J?J84CTRGfj1^{oI5JP!|&@8z~P0KsC zUwVn3lTI^Nwj8PTlU$WIPwEx(1)-lHIPpRzv|K|=7Xc&@P#hHe zbD!^0S`SWlI?K*&p*a11mjxXgbnS%Ts;YN6_ku#%aFT1 zXn}|*%YnGELh`F#LWr%rUo@Ku_T$7`nd2`2m`=!BW7`X?P}`ZV>tI>8gYJ>}$is^k zV!npw*eZ^fPiQ%mPGhTi`^0mJ(EG+_yjJmSxqjf8(M8DVLV9Xq4EQ7!NYfP_G=nTv z^n<#2X(}&-VtL+XlB0|d8SasD!e0+s4hXN#i&z6sq^WFeTT5W65}ecExSr0zH*cqeVjGKw^lcczq+^f9l0YY_qM0U^`SZ1>xlHP{T@z+<@l6?6VO!`v5tE)-P`AhOe|?3_0UFfQGz}+KcM%d;Bu;*VGlAq=@A_ zxupK{YT1+D@*@1wxV#e(h-so8QdkNcJes)^98*2bz^6#3Is{4%`guClj;#&&7gJf{z81qmV?W*ZzI)8$Y4x>n zS_aU8SM7nV7&(!aE96QX>wzDTi(NIHvbhQk;G!?VwucD@leKluH0mRBHG?GKP%^hT|v4u_BsnqGWK z)S+dJATH6*s`}@qkpU8JURYS@qmlTD6O_rx$*LXM#PVK!ZCH?Y80q{ueiY4wWM7?? zTwyyHGy!C5)(q*CTswx-9&LVhmBzZr9tS*G8Ww2topEfx2*xeI)KP0ay2FKkdNt$D zmo(R(cUF$G$lIdjSAqO&Ck_(cDOv1KNzZ9<0yCQ~UdJN_Q|YlAq51D@yC}Gqg73@t zEJtwS^qcTMBo&tWs!!5EY6qB@@lR3){^{efsUIaJgN4QZ8vgetfCOxn|G6{jg~H~* z>oDDCMe#51;?&B2Y#0x%f<1pb<_JJZv;K8ZrtD8p2b)|3wG#z* z)x0?c74=2kCjnjxZuq_Of~VQ4#vjD*{klC~D(!z}9P5Czq9&mqkr{jiC5hiSTKM6h zOKv?g0Kd9~&y9X>4%cn9b&7J;f_3$IGK^N-i3L$I0H}=X?LB4wM)W3q-P@1Ry~(x% zR5*Yp?{ahJKzjT`s*8;!sf&hrSN7EFOtGb5KD##;gV$DX&LoABuVol#^b-0S`w+`H47s_d6O*l7EL2Fx1PQ;(y}}dDU2W=v51oqyNvm z+a#&pSBLn^oeuW1j$#J{q90lC&u5-y&HoPRU5gFwRkUf@)^4W&QQRiD^<$M6P?E!s zA@K#-I$Q(gv6T1PJvPq1K|l|U%v+jL<|UCM_Uq!;lje%o0bq0Ug}1eVmlsBs0S1Aj zA%U0K!&^n#GN{+XDZEF-gGBw*0?}^^R=WU2Ax~yGpP&XKg=TISBx)tJ>r#2$>!AMG z?A;?TFAoP0+|{WevurPlWc7HZr;k7efc|lfj;xB=o4eEXLj%^OXH1 z+xY=J?riL-Uo>K?Om&iFkSX%rL>^nv`^e8j?m4#C9th5^emd%3CZnR-2T|UYvPAwu zU9Dx1^S4CAtt#BK4t{Q&-IM`El(wfH1ik`GAiV_rx1`&&T4xZvYiwiouWXE(NzT0IPM@ycu3~NeV#E!6%i+jes=mzviyT z$)^1QIHQVCfpslcRmDiVlb2S#7}PPDP#mldp+xsQqi|_Kgt|WdAW#$!OxwxS3-)w+lFbR$}(C;Ij_$%)poPTz?U*^pahAS|u14kaRS@%L}e)SclEL=gK^z5c|XH`rcgck@_R>bvBgt7J#@ z6GHlx3p#fa%JChHb_rGh%SKK#=bez#{U6CiXu$eBl29sn9QuU$SI9)p0E#H1GYA~r zdDHz+AH26vL5&)vTRQC#t^dp5DSgM*&8-Tp-7iZsav26G@7i~%HyNo2k)EfTA#@`b z*QEozCpw9f7gOZjyasJASo?ed7x`bd4m0feOCTi@ySQjEtmyrYT|X@@(3uEO@MkuH z9zO?jb8`XU6c-g%wqq|MDDsQndrErm>z~^!F{TvXf&ixga2ajXK7gGK(!ONsbaLigxf@f{ z(?}qhr}&Cd1CyA8QQ&i_t&$Ak@RfU`>iL=542_2F z64%6V#$K=BG`l-M!*I(Z-HeHDcPvp{o^iB6#sI{yH{GEmu=_{f9j3V~fPU77Qz3PC zuR3!27Kj#-tCdXpCR`t|xTyod9Lk~Dn6_BX-xdCV?xs1RuMQTrP?=Zz% zq~f{U$+2w+i|IeM{?3pgpJf&&pId0(is|U$F(8+22R=H;MtcoZh6of%_(-Gkg)1-U zH=sl&iLPd+oT*osmF3O7zbh?E_H-XKVD}zMKxy=~yf06^=UtVJ|0YT0%H2vE-5^sP zHc4Whmh?INn#poQ_3w3{$ZI+B7F;8HBpAR8M2X?22{{IT!a8p#6dwf}+d0XF^w7`Y zo6iAp_htQ}pL!cTUPK2F$gJH@T8h$^K25?jyaKYti$Df8gqV7WKQ))QPPXxZ^eHYu z+5be#{5k6W#o2Or5_~*n8isx5x$oWngtJr(aDRh-(ar{iJ@O+YYsrM&g)D2@ z3VoW_*3#cQ8s@KTq^F|*F)J;S*YN^89l6u0^2#@fv;>k7KPa;UFW$j#-S`a_5fKS_ zcq2Amhxv^k>d|q9NIQD_p>;PUO@Cy^4g!Ln37Z{ov&J4R^$&n$b}L;`WmX!u+^!Jt zN~~Mzfo3X#GFtS_(rE^yX~F-IGjC2d(gQN}$kaE5T^ptq4Gw~y#Z>SwQ?HpW-D}4@ zdzNyrap-rkZ5azbp%&Mj@o^SQzhg$uef!o$uUi*C1f`C0t%ZUn94lLk?&CAh1Mqo@ z6H!Hd;4@W1VmI)YaeyrKu!UtM4uZ)KJb&QU*d5mTYy-Lgrdy28w^A)~@1SO_JR3|%UNdmkTf zu>dGaPgkw&PdZT~-|pglFmc5o4n=WFt%C9Kq+CuxE~nDHNfm=a-Z?r_oYFKKy0}zY zj0FURi9WE61%Sn_BZH2!r;`M1uiD6*Jb>thXAiVLZH-#Rkt7|b_{8Jw0Om_uzszIn zvK#g!y4gsZ>D+WKfE*SVc*4385^FpIESRB|K8Yz@jG-NENLVHZJG2&k-meN%E6nwd zlg7sUYO4&N5{kLMBf9iBrBVv`Wfx>^)M4DM?vNKlFfQ9Sji6s#XcJ0RBh$TeD3a()UCB{USmXrNudc zv))#^;%iBIBNb_~kT!5VT~YOXUZzwoksad@kXGuc;WcXzXdp_NHvaMvx(xv7(=%Z4 zyh8w6$Kq&eK#~JY{7HHhwUHw#qi0gp!$Rr>CnUeSE5u?uSZ}~PZ92w02nxk2CtwrdO!+ROtfRjb01gJ7~oP~w`m&Q22 z{rflUdg4B85Nph~`uU*MM@O6H^UJo&lQI>jlhayG$_R2GO9yd)EQ-=d)bt0mV^{ul zo}W?}8dn7`K!`X}mMNdf^y6fIo8wuooKO_()&kM&dlWuN;NNL)w1OJ!-|t*``@%I3 z!-4Wg5R5CT_O_j!T*$~iF7tf0E3#yY0$Yp>u=&d2!ve3Z!85Y;yeK}24`2I2$SFSS zm>d}~7E}Q=;JSlPmP#=(F)80o0g@{gfRj1J-`!Y;^wGYBbzRO*wXHX|O3A>2+W)HZs6*Oi-z>*@MuqGvY~_*OCzGB2Ns=R36B=^~g@&#`Ve4~S8Y}15}8ij)#3fCe=l7+jib7rlDx1is2bve8tA@O7>HU`VAdJw zoPA7_7|E5c!(|Mwvb7uPrM7fxiQyeLJoE%fl+zjNXcb3f>5wp@4grR1BQ75fI4yS{ zK4rL}Bpf&2En0mLGC=o0Kx$vC}u{|5*yrU5iIpOWc$2$0z_x zyEjgK<*+QU-kRd*p<&m@i);d-Tfx5s3Us)fZudU95kQc>ar17_Du2M1x|@xBf?CmS5g4bqC0#B zxL3-yyjQuhDKr6D;rX zhhySPIQ6UA9kq>P5l7P6aoIJ$!PAhFh|fFy^OmF7D%;l$+cJ##(&u}J0b}P!Bpp`X zHmix|vVrrWVK9F6mt+9rX7li$o{`ih+9sO1E^1Ay80R?`HnQmpcm==2(UslC-B|vP zj~@XpfP$ti13}?$W?{LJB8YmY4bxefFI5+gO9BO4PiEt$&AcccL_&kWd%!Ss=KpvB z_@Q_X>ZYa{H0Q&FjMhO_^i4q=Ou6Jbj_rsTmw_Bjrd>Wl#$n#|7jH9N@6>(6*p-4P zz3kAc+>Ea97Q|NG8I))_Yx02%dS+Ax(L>>;MEBRn(>sy)M=zgb#68nvAblK@MbrhH z1N5w8-E$$-tFKODEW>dR!;QfkBUzn{B9nQ7t*hEExN^%^3&_m9X5It`=id_TPEvS%L1u!zyo}M{X`O`(?4DoOMhF)m?mIGXD&bVT)-Mc`Sr}(+nc_d zl^U0UVafWUcr%2=p6mqYg#VfWG>K2hDFAVrgg*Xl4scuYauItea=)NNI(iF$ov=g= z8U5~oP8_K;-X_Ath_c8M+>zx~8u;w)8VWlPlf~p-dK7*J^U7e609c0X=QEk%D$Zod zCb9a-*yRxKnlJz1MrPHI*ZcF0{H-SmnU8M|5wWk=P!T2U)jCeyY3=}=0%_o0YgTQf z6|t9>*X&%tdBq0+ZLSR1b3C#osS83pzQd*p`)75Y6FnN%JM1>B({lR;XfQ*&W%(&I z%c_0*e$?guaejXt!_t)H<=Qv6Mb)6FD7x%;eh%BGUhekzShTFkDrK}}4>3_dsJ?J^_| zMZbmK%~%{8TWU^vpzh32B}w?F1pr-fq*VCbFkcolk$<^@@uE!$%vyB-$)@iEFTA&D z`kQ6k@OjjRsjL1`Qkdox7{Eop%WfYA7_~S=b7S9a0mSYrRI=bA0XB6U-0KZZ`QM(@Eo*XwP6M$aeUqw5&S-#p8uw{+wt7*?KBou0|iB@ zt57xZKn!w!p&3}zcGNEyzVb)4q}D?K-Ky2^bQ^xT?|nh&Dfq9Ma3v74!pO>_C;KUU z+Y-BG`Rx5HG<^Ot$%x$euEM(u8>T!t860OG0H^|Z&IFwTot!Ysiqz%>EGmfn#~;{W z1J76~c~}BpTO#)X$LgffT4*WYyiChct|9;cI43Jiy#ZqIW;H)H#`{o4jYr9gm(7y+ z0gv3VEk-s|PLP4o{+fw$)bXf3hVA}*Ny-nW%|f0Z?# zSH&7*w#pzg=l`x4{EtV+Sg?qo*ENt0dWgLrCSv%RORK$y!V8T5T>YczR<85?Z=$^2 z7cpE(+t_c?SMDpUaaVJrC&%xQqKlnqg6wVduvK0@QqQ}aOw+RsI%E&lG7Wjy{1;Hx zNijc>5?mQyVtBUBuME)x zpwPk?sD$c^p@;i!JQT+#8+))syoO4@%is7u{ADlhk>Y`3r$c}QOb^tCKq$yG-?Z6h zS4IT=K~O>d7A+O(a#tahbv-28TK9?Rw3;Hn|xFenVZXu7z0S|T<}sP zP>a;747gD#;4+&JA9TPThyPvxtpOaVN7<$QvJU7GDCJtt2dLh_pMexCzYHA>&1V+_ z25~n9@X3Dj!B9On7PBD>4CH?xjWWbvBx8Ii12%3ma0M!T5M*t9@X`+L@VF|eqY5IP z??{+24{!&-rhkYan*<*6(-9eCz+oo=@LabD?uEzcqyg<7G$090m4PpLAIsosAXiN( zf#MM`^cOF@^m#HVV=i`}o?8caLCA;3Miis?~Kxg4nZ{#9ztl=87VBL0nR%`VUMGVlO@ ziEy9f_JD={dM7fD2OaaI zc*+b8nVMbYlq`JSQg9hw#W&vz11LDlu8 zxR=C!nof)jyvP>!=75)4{pV5+=-8?_-xl{~{oiEvx5F0WfBJ=RS)j9cCwSkBk}6K^=TTK3DgWUzA91B0Z;r z!xR43^2Bg!z|u1E!(o0UD}xjhTm;ZUxBKH?T%Jkf-2=tVqxu)6(A}y$`I6UCR=+~aJEGf>C*p$kZ%grWrS>HSAG~Zta zoc#Qh50Gaw6--#_y8caR^Hu)+fm2uE_T0KAVT2?G18IkpDX#1qZY+hOC4edK9eEV6 z3rfbyk!BiFrSi3^sE?K>0@Z9QF3EQeAf(op@s|KjRlajc7IP-`ebDB(~)kP)$!?5nFaIQGRr;I&cxgHUEYr_speP!pM zG^5ZV;{5~o(l8MZKRfC%R{le3VmPBEa!KWxDw;M5{2GyzMF}Wl7A%L3C%Dl`CGj5WCJfWk=*TS`Id03Fok>nNYHPCGv|8@AdV>-@v*@V>jfByyZlYKW~zy$BhZP z_{*{T&_)6H!%-#`X&-a$xce(heHJX;!Ov^PT-9)jVj|L7=#nQ$I*80uh-+j{deroKNKv$)P{QIUuV`|K!cuTvBMF{?wj|o8p@B zpL$7)k{r`Vkn2+EqC1qi+wqADK*EgY1-Jsg3enrI`@@zHNJSBq%_u$A=0;vZalqy zbUJ;n)hNq}u?wHdDr3DhUR8@N4jKzmulBoLExnIcZXND}l4ozP56^L12mI17es80W z_s^Widm;GZhF{v=*wLo1-zPEWw&^c*>5%EXCQcy-!~I%z2RV@$@`Z@P;u%$oK|K%n zX%a<=mf-|4Kz$925i?dSv`yD(WaDnA#_s99#=U~a>>Y!#Mpy0Os@UC%n^zycxzF$Mi zr0!eKKfOMW`n&*vPwMN^V9!0WBd5t^LcWw0^a3T@%Gj3pzi@bG?vSr8Q5>$R_kER< z$jgFf&dOJ(r{oA~pL|)Aprd*JKhJyP^5lU<;)GdWw0ELu7WhDs^X$NZoiUVg_UL%@ngIXa~!Bc}~Hf|jH+~Zwc z1>^{%(ycO7DaKi%Y$Z*nM6Pd`#)d;1b}}$W-phhwXxZ-+)P()L>u5-C;1}Dz^QcI9 zC|*Cl$;?*_`}wYa+~N3sxL)N8aV`1Pq4KGeY86(_XF!fbnS<(jJXK9#JV?Nivdds@ zBB!ZbA;Er$S#lWd#XdD1=Ay9w0CGt2v+-gGroAX}I3^@{Qv9{Z)8wnVTwzW;@smM- z9(0imJI5=`)+u5CF{)WngT^!6F4Zp3=UwoV@v176IeJ<)=1^{-EA+%b#@1tF`ZkBY zZPt@MoGTh`|ME{aHKnn3DRjuRRE;TZ=uO~7M2VWPNd^P<8>S+?B#KyFF68hWX-aUC zG)ms0RSZ>2QvKDdL%eIz%s^2JD@o_R+0UK(%x{~&|EM32e$>QwXXiuOb4peV+oVGc zeYrxT^}&=!Lf5ChMc<0s=0X)%!%ZUM&zPsOJsRBVuG)nj4!(Kok6!Fo*Is5CA3@cA z-K=!e{ICGXgua8b$WHVu(LVL8IPl@=xp>*0ea?4*B~bFRe_G{mSJ~N3{_~>EIN5R|jj(*yel6n7saJms)s(1WJ@1b@Dke-dus`#oNIiT!NOSGu3%?Ol z`Y}ZFQ2lHft9C*KR=nh;T=Yd5(+!u53aH+wATRwlq2~uR5@OY4&&7*3j{-$k{v&as zNYE+ia&6!K>6%!=OD<9xd)dp?DOqc3A=zTK-D2@1p#@OCM^px7$7^&lwAcUUBmF54 z8L!O6KrJe+S;b*tIfzq`Es^Ur;A|~YAu-Id#vP?s{ zLI%is$3M^ebp5ku0j?N|QlEC%x|4~kh-UP!?Wb2IgoPCw(_8yn)_t1-nx7AZkp;hs zKH@@|u_Q98F}f8+%Kl4G`fsWRD?opA_T!)IQ0QC-+)O)Invx zcw0h~c=KA!xLA2|@hBlM1hc+9J?jmU@i;2_u&+9Tj;}xyOv}%B^TsXL@Ckou068(d zWUd(qj;#Dbo95)8C`0A%&o3*NnXep&vvf<>m7Dz4sGFTQnUlUBERQ10N&xddq#0AL z=wn@}x~BFI_@@jw!5XS!)Bh?%$s9gJkkBvfFyb?Dw@5EyPycu5ylPfLm-Z&>&Cm*? zqkpC!#M$#wHKs?md{YBV*#HLTyNK+i0=H<(BvoTOSY0~$Xa}FhP^_d}aa&Q4`NaHr zYpj2nkk-tDXmh!c+GBFX_j@mCWjq-EYZLWPXsO7yb@P4LwO#Zv&{S!1$}z7l;XAu; zC z^Y95}{C~0c)j@S`UzRV5yF>6`7x&=73GVJ1+}#q~-GjqLF76J& z-Q5G>;_jaLlJ|Z+JySJZQ&T-tHC4^OxA=~qz0cljt^GqwZ&*!n#P4#1!@!0kliy?e zyTVU$_|_-;m#Uvs04YP`^e%Hs~xarU1zAnz6jy1l^wo$Dlx&?JqG zLT|^@vc~7>wX1k2ChTc%=YwmHn@tLT_m2`&4R@)MHxr3dOiJu8DxA7pt%Dds*F}mE z`!~ngPK81#+z*`{1~EXTtKu7$oOdTF@P9kdCJU@c0R#IYUqhrW^E!0jsUFY;=bBL- z_n%)it|P1n`ydRP7s~p(QBi>4zC<%Zgj34<&5C=B0np8Eq0K3LU)sF}-A{zT?cNEf zZ!m>2yIyD5hSarJh1;hh-<4IO*F|Gjl#rHW8v_GnOFGCs9N zp5)@cW=Q&oT_fqxoBgaaTw+RHpa@$!EIzNJ$zP#Zhr1@3IFEx7LepE~RVAN`(48Ow zbl6P5>)T&+p-7b2S|Vk2j5+7qR@~_o9Zd0+ZZlHXLhVF63X^hdq1MK9E^X2?CFtDC z`?I(vO4+s{KTPp`85SK(a8fW=FhEinYK&6QRH45g6nLEhL*bScp7PNeZM!{~ko#lJ zP6YcS@tcYZC)&rz(TF0kCo`$S z81H}S0ybLE3(`&Wl}qo;$sxzd3CcR0-67U}=&a8|YUi$(3iP`=l04HDUM^2`M5J0O zI)~_-e_c_bY9Bc==0*cf0Psqn=}wj>z2I_~tdjuoH=+#6Z84dkGDE%P+J1FgGLNJ9 zxK(>4hkSk;zbAtE$58{ch4X2%{{gxue|{MtpAMxa zqf!pevP?dSV)VxQvoC;P+y1`>@LRAdTAC{Nk7yCl>Q?OkQAhuW2LEXU&HX>Q5oT4m zS-wSn=C*KPF3v4C{%L12CGJ1!^C{8a(p~@G3=@qj=bYw>kBkcc)s6AP*0}PYr!lZL z#sA?Z`aq$q6h(*fdqK&_%>K8x*q@c7CiIL((rK)2^Ihh?iJbu!_#i|i6a0GPA$To@gcEeMN%bLO{It5yukhEVSyP|I%i~UDZKhi~8uw$L z&*uiL)Y&X|<#pSoM2snbT?mA4g?}G_J`K+5V%GVb*^I>i z7etSgdd}N7yOxuqA=PS9ZmcA}1rxuvwa3`^xy4ATDBWT>P6KK!Dq{TmIQ;HNe4+n4 zrCmza^@A?%^5JY^sJ(c{pgjL|fMi3?hNJMC0u@%-UlS93^nAh<&O;r;iYTQ#dIbB6 z)%J(7cm{er-tAVeY0^azl)`t7 zRLXXHr6cku*mp8%FPh?Dt+Ai%$DtsKwl9|$v<~sS`cucrE>xx#No}QI?|~f21#DY1%yvMn2$e3 zG=u{ozZLt?)m^cJOf&9YolTo(Kr95lK${R*)0?T(%#?)!=@ag%lSio1$CFmY`CZFh zHP0cA0k-c>we7TK;1(fx!OuAG=X*U*%Jph{i>mcL)*u|prvflIhubq zVbziuoK@u?QN?SN^J`&3r(>__^qe@|VOwJ#RDm$g3oR$sne1rktJ<$gyD*#03RK%R zcHfIakP3;RiGFZ;Q?L1JSB_ZFx2er;14_VuW8(hq=`x;Gjh?6EbV0`gOEuqZw4dkOjUH-u)oY*jh=JsG3;k;#}<$JTIqunY4VyTTE^v)_d!-E0D zyp;XcmU`Rk$IT1Fc~a^qfm;vB42f6h%_tF>DMDZC_1xzssy^SPFqD1wIH}61DHrjM zDa&<*?0?*3Zt|JKd(8kU;YR~Og@!|@F4rypeuysuLzl|zum@6kLK zCn#2y9g-e3MKzbD_6`Y$yzmrMtqHJ4@wvAcbBn*p8_4v;`oJdDd|}$Ql09_I82B5%*CV1Z;KPhN(Gvq3GAO69N&~=t_*UP(54+V zicnJ7=bnAm(;;1V`2I{5HxmXf(OW2djq^ZMBS zQgwO91bIEe^YG2Jo*QefmzA__EkGK*HB8xp#-~f6VTg#(q$#?+1`=P#}!?#=5{b{QDnAp1$ zx2SB{UL?ZZdyj7Uh;#KxIF-@JS@__>-Bm59y;66ePz-;;^Tr)eyfLSbj`_EtslwNU zvoSU6?89N{4_>mGC*=`wGYVuuvAR&mj`a>14JBM#j4Tryv>um>J`530UQ+(KPQf2f zVwM=iMMBE^OE3Pq*LRmuJ0<&CwM!CDCl@v(_v^Ih_`4sl>;E#)`&IvWo*Z1)mi-RZ z(+uTweT{ygK#{2!9fY$+VO-E+d76Yv{BpU-w7RVPfOXF73Q<)`r07_q19AEt6K^4V zFBA=ZPFTX^m!xZ3k7S18fw8`_QLH>1l>Piz$4R=V)g$g~e@f>ng}*iu$%p5T`*ko4bLswS<{Qrp=~LQR=3X1*ECiW#_SM> z`J2&sc5n;t?v!MlZk!PrChW_Z3l#g%u5KP7VFx z_DJZ5c(tNk35C%w^;aW;sdKR<3+PglE2j!e&#SU4Z-p{`y zm9Z|6=$dOLWP;|@p)wj%E-vOxnOJZzNp{)i0YxMBYnf;2b@TTrU|?TDevJD zHDjGTZ-A4ot&T?eneXYX``#+bb9rBO)Y(h#;Z>3SXJWm%0C1WLp6$eWDP$&@sw_Y< zq|F!HuG{70jXVob8(Hf+Q2(c~-*<8>lD_F)`7?Ufx$A4<#q)2EChN;7TpDX_ByQw% z#1L-+utoXhL5s_knQT(tNPl}TZK5E}g5C#7&YZ5f&1_5&W75Bm7>QzVe&!pz z!yuIgwTo=qFv5Hj_dcbaR^Eg$-c{}$GQI-?2E>x$9Y;n;0p~vl=$H`wp4fhv$EiZ}y_%@#_iG}2=1!dU z9X@$e3S;~W-|ved z#OYj?MW|(_lyIdy2*NdEmmJ*6veLcl^QWU*DAy*w8`P@-0B6uU^z+i+-ne46tAyuC zy|aWGADQhMQxM&OOLij4lk%wze{q1Ge2xEM(-YlYd8o(ZA#PPPU|R{iWUWPZw}gDoaLIkyId|OQ_;izG^Jnk zqgZr+YFtxoIT7OzJ!bF*XtRo)<#rE+5}u@1t`SVWM>L*Z(v1=DQ=e<`f~8Y|Wg5S* z+2!VAEiwHV-|7`tk}7XNVU~z;;g8cp%&dljrQ!EfEB31@CsONNxMFsUVMfBA;F-bE zn3^#t&n^OUS|>B$imCU>l5S`bc3CF_5{60Ek5D?>5SNuQRqW`Yv)&!#h*Z1?jNVWv z&~V6$v1^PdU*Ly&k^60QNWtH4&)>K9du^BP(nn!}=u1yhy0nwywP%ER!ysm|d_u|K|>+2g^H|i{|#RHZNc)F>tOI2yyRj&x} z`FA3byhVauibo+qJs&u&_72DQ6!Ad4v_EK?fsiKVjA+x1O7>k%@s1a z%#j(YG3!<-*LD7>+*Ihz{yD+I@@57deAoFN%#uPlhpta%19vb)bti1wMS;KXcB+5b z3wk!)rfiHbg=lM}Atp5s7#Fw$gRtMWMMX)?;PYIrbF9!7K*eqrl|Y+*_w_qZp<282 z41ZYYKd$Bsw7tqUTal^}b1htyZS)^QGr^OuQDbb3@pg4N_Vl1)D416~Z$G=n)a0J{ z?(4qJA>sSxiD{g{Tb>AS_o-?VwO^&I&=?!`CdN1)L#h#Or(dL;xbHh=K#51--TwTe z@>>?ev?U{KD!QyKfQ0hlN!9%-gF;j2)@=@HL6`lS(V#oECMaq)%67)YC(NYQDGM{1 z%AHTz{uh3@L;d%0>y@dWJ_W#QarJIVemp4>swb7&Y&X-kUD**r+8Y4z`m4)`*t3r; zMLr`CT)pP@Nkl39U&p|Ir3KnmLbOES1sh>En_3ffSU!oTeOA(D;QhXxq3g4ARdAcX z2z8{od$-XWXXB-Q6Za`Ub<=L!>#=(+u5_K0qVO4K{Yx>&yo(s7Lk?Hx!B-j*?QKqc zPr^IiD9f@$h{#f=az38 zBqGZ&LsitsRNgme1{MjLo{RbFK)DENkC&pX4>%;6%Y<4IE7U2*{GC$I`nktS6uDI- z|MH?pdh2GM`h$+|WyUpz%ZEm|-`HmQIGA=raj@(2?p&IADSh>K!@e!cabZ}uyFQ}p zbyzHF1oop|4OO`Q#A!RO5Q8Z$7nW$`-P>PU^;Nk@s@Z46KzLO+GNi5QJD0Rwa_`#T zL;`bAY2vxjHOx5zjNcCa3Ob=sjzk`(04#dmHv)j!%W{_-S>Xm0H~O9r+5z&E&WwdlQ-AgUJn z5(hBAGE{#;9V+mCgzwSNMqlqgLR=juE$bM2OnjLYmSPh}&t*4s1L>WqGg|g~CSw>$ za`4v;P(nXT|MLLRhxsJJW>h?hrV})6?8{7AsbWfh7Dl*CQ?^rhW2BVS|EB3B-0W+< zgXoYxzkjxpON@vJYm)26`mXag_Hqg%U*=~rYZBKZn4q5B?4JTryl9a$|Cql+lF$%S zmZ#SeH%Mk0LN3=hKM}QrkhD`bG45L5mpMFW=Tq@uOm0#Ay|Q0`K};gfdw>26+(ip0 ziRnYUugM<5&jPHotBak@#_+ilmdMFwZo@FH7M#fNdHxyuf*?AY0uk3NnXR(T>!l}B z&i%>`TsbwqDaNTxr0^IS3J=pX#Sa`#Ye+g|pDu{tb{{d>$!Wfc5&{Pc-}= zOxN@ukOB~E#)tV=V#DxH<_?Hd|5v>XU=sc>U>1Sd{?Du}G6>M~wLz=X&xd@J;CAsX z5u+cOR#}g!7T$}VTbO@_Ac7J6Pp0bM)iMc7mnZZo*JMpI)QIVxpd!V3jHtb;2=_U@2i1pfNMIhUM^x?3F2T$eBYS2xsG)s>cfH6GX zqC!Hn0R6{g<=d$X+;zYa13GA`7asVVa8Ct`D7)hDOD@FoAk zQ-xP%smX+!%~!*vgEn9Atu{@a_N=qSmak+Qmh-3`4i9$Z5s0a&&otyjf1-43`%JLX&?sxM8j#3ERuEQ)@UI7ZB8BFq11b z^1cC|^{o7cJgtvX>o?9(X)HpjsOQQDVLR{UQf$jVv%snR-bjc&FeKmOK2fng1pY@P zQS5s*;s@N`J zOmFxV=x{7i%nIvcU{IAK>4;8*1e!TzAQ^VG_{FTDu!V>zv z7}BZ(l~#*%)O~9k*PJri`K6h-gJaya6Xgrqhm+4T-+8Qc_z1sg4ao!u+N(dyBlr}R zjFw2)(C*IuqLzu_sgfwm`0SGA_}OJ;PA8-xu}yDfF2RfYF8 z)4#jddm9P#+VW*KrCG~GiX##GP!qG7ihXU6GAH{jd9Vs@NM&kBh-p-6qI}tUs6?}D zKLj!)`J74T^4zU8%n>9pUwl6QN5ztYO7(c}|_3{x~RAUibtQnbY4|wiGNb)Gu zqx&WHjoyuv=^7JJoRV~Rg*s(PnY zTE7n&!dPLW&eK*BHaBLQ-dzahsz_@=rTCJ_fdPZIg(H2g9ta)1PQ|?#pUZevGfqs8 zYVx$X2sw=mBL{CYH2HyIMu{0lb$Ra_XYZRwD(giL4d-e5ElOP&$Q6W7OP~(t2x9wf zy^7tDpMAHgX=t(Muv}{gLSLT41ml$1^fo9%JBM!fef!TBp_8B9*S<%R8Hjlj2L5w1%z;3Y-6o=5+xpP6D-h)JTp;LvCSD6SuD) z4=;u}h0EC)6)P$KvZ%gI@|zkc6E$B5n^FJpr9)IH{(!dpV}*hZmpgiN$iP6ceL4r6 z%4(#0+k=AIQ_lP(`JS5>oJ#+5+?vV$sbjYs$52J;kCxOs-Hs3%fYUhc?7G$Lc(7ap zY8}&U`WT&xDJ3*p@2G!_PKR&0mzq3?>B>1@A({_uQxfpyFnnrO5;qD2hnPGFWqD}h z($F_57UaRcaLk}r@2W3PzYkTpKqE7T&X~YvYoUI$j4g4~$5A!vOk5+BX})s4EpiD9 zKbfPq?7rN6&{E?J@!Q`WqZchw7}HYbB1s*fyDq53nEk6$^3_XN`YvkTAEH8|Ey1kL zy88J9Zf@o-*~+dKD(~`g`QFg7disPvHqtdlCS)2GA7`29R_#A7E?%3K;^>ZMG>w?+ z5>A9Sc%@_qrNJfgX`y=226k0+;1i53uSm(24cAxTAS^aE3BMEh4%4S!e#7)~x|Ap- ztcY2w__{gmmC^fRwO9zV!x&bH)>XgRD@uso2iMV|piNm@v(D&p&2Kt($f|m(MA8$L zb~YOu5OFy66Hr)KK`^E(>+@)&QNus@9*9@yt*7Zs|@E0{z+R%UB;CNi@QPbo( z=g36!W%J}xPmqqs$WJhA(-@HL)esz<93Bg87S8#_uyPy)pC{-pjS0@I2S0ZAyQtcn z;F1e&^L(~mJ{6isBECy2kzYqRN%DBz&^H%2+3RB*?7KMHb;n{wRKfu&AyUX{6rwM& zh4Y!!Q`bDvV3b8iN>G^+#pSKUm>_}dosD{Q#@(;pjF^qGhtHe{9phUeU!du&`km{0 zOCSfkmIBn6ne_v{cS?-GhW5BsFWFX>wVq?84|-D#ClN>zrb1j}HJGl1a5s7j3d;lo z+I|d8etv79V4k%i*1Itk=5i-8R{6o%Eq|sN#=O;lfCdEHH+PmX($g_><#wRZ+O2zL zm}$6CBRYa-Ur@MEC)P?c)7pyah^>_Sfd$9&RfX_L8`7qXU{)yP6)GY{Y*CTi1?T28 zM5b64mU@8}0sI1!=Qe7^2ai3pb>%60VWGtK8eXm!6H zRzS=lWO%d|ag+l##SQ*$1e|W)-z4#q2wd%7>(46ot_=}VbI)dvj$^t;Cv|_fGoLk8 z?wwScGguUgco{kw;l`KHAPBj|9#qFT*P0K(Hk!Sw;o+zdbd5h6+iP0EuiYw`bgev1 zy=coIG*SP2!@~Whw;{VatNiX4OVcsO2zJGLltyy0w7!w2V7Z8ZeZZYfSraWjLA$H7 z1ER3(tFZiAS3Z731c@jX_+?eNYnnX`Gn}G7Htc)(^$Jy*X!3dz%?Xd zB8^TW5b?Zlz;h+93zVBe<=$%c)Lg15Nn>(!x2t_OjhoaNP6YC@(bNHo*EzO<)~gmQF?_R zDhmF z$J@y`Tmi+N&a@wOJsPcgJ1QXC12rlxKM0Wrs@00GV@Bj>c#(EZT)MK)LxzL|IP)bL z&CbN8&QFr&&K=HQ#FMojcLK0!I3Xy(%w;j)x_P|q#=@Z6G zF%=V~@)`W=1N1t)&Z+I@Hm%k5r5m*2=*8F+s1F3pG21y0_$^E2n{-=k^CTo z^tu@P9TLly`UkCiZ2Li!WNBX!pTsBFB#I_HXLaHch!o~3?n~V1R%GRhhH%aZUJ7Du zeyIx9s@3Q#CLFFZAIZu8aPzV=r|PJa`$Nz$Xb#Z@3<6cZ%Ty~dmv){J>S~?dHc=yU zfS|Dvl&uHexlMjKQ{#Snx~KS>1)TfqV?~hlUrrd*w}itxEA3Vd4Jak*@Mu%@&GL=mgsu;Pz4N?{nX^>G!kcD3Y3z`%pg$>fVo;q$h$H zDz#r9P%E}csz<88ktm|{_2(k`4`;)_)<`osQ!YbT6DY7HWQ0}{y;8hjrmR&rTQ^CM zX@!H&V^Oah(O7>I(Ng%J+6NEu`mWmocdg) zM#kf4bc8{kBdOCBAo=bVg-B-p;iM8_l#q)`nFSyA+F(B++ypt>uStI^c~So|>}V5pHy5L8}0vKS|C z5`H_-!dS$a-2 z?=!j!fen#GUO-9TK6+f^%)4&Sz$$d+oK8s=ktj8#3U(BI>S!C{Jp3w8jm^{Sx&N$D zP99cUJ50QI5U9_!tA#;Ex-;=jUHdgFaKjy_oLiI@@^!vqCTm452+4a;)@Q>cUFWQ{V1?Aaqa;lU z+}A4HhPvpkskh&WYgAP-tgl(QH>;gf4oFnMr8rhn?&4>?!&VZi#P44oqL^-z3!|`> z0RP_lOvnJcO)kN<5FE)n(x!SlMbqmq%MQq9S1B|dY%_N4Xu zra#lr%qiYk#5WoMsb=z^F3nQ3GtfqCLpAJw^25iH2|k_od^u}#5y^~7o&(_m$1vqM zaQPd=N_Nhbl3Lv5Y};F^gh!YWDBJgH=@H+|%7O7YPx_>{L*Xu!*4NydF0}kLl5{Jh z{Cc$<4{mYAbF*}OUe2Bh3cvl<3db^q)3RMZ*C2a3m*J+h$Pd;$(EnPfNTTo!t&%S8 zhdRdLg#!5sE)E?}$jeJm^b@=a8QDu<_p;7nfSzIsb>hgO06gHHsV+&)?)5St9O}Fg zN%U7SuE~qIaTi-J-G`C}0;$~&%6`804quxNqOWG^=rXO}(c1yq+|0Gv-W~u&%7@`L zHe4CL-W2I~X++ws04n8AkSf>5HMSu?+#xbI!ff42`r#`72VaU?eE!{vHueTt`4j!( zXA7_178{x14xaLI#z^H1rcZ0H@%F-X9JSOal)pMhR3&!f3-`u3=PQx`6g9;irX7>V zSGdT@Vu02NpAAsmbi}}>)Vsh*2-?d>TeGX=sB^wo)HzRf!gZ#27(M|2NDTXvfzes~ zMeS{HsZQlGa7={WM1adsW;s!vn>?Ozx z#^DzQ8EXgJDI;&puWK=_f%0%lJ@t>291jBa__Q_aXlRMvm0DhiQ4x<8$8idZ-5buQ zI|4wMdim2XqYR1zU_Vh>135c1tt;o$wJ~-u8l%0CwT6?FDu)unK}7c`Q0a7RW#C?V zFFAokOMu%`{Sj7$)7ESfb3Hn`K-oZSA=sHP|0TK6G(;Z{G)`0OhQxWH3EDHyd&(m z68&Z^L+ne9D{Peej%#qjb;Bco`V2yelI+-C-7TRc{8j^=SQ!UqwPceGvJv>XwZ}B3 z+XKQ99y&5>uLBj5QMJ;rw3I3Cd5Srp-R?TsoXGP0`H%?Q$;!7TgQ#@CIQq!@98(o()V(o+-xz?HE7u*> zu_n_TB0?pL6pQ=(xSJxs5D0Kr6jNETDNt8b@UrJ;;W!jBHu2>MEypgi18E;O@}%r? zwVCCxEg5;-C$Cs&wZ#)}racZ2A)z1Ndh@SEfvgzMzOlV?425xGn@5v|DB0Jj&3sVt3D(3l)%~E%K*YTyPUg0LxU1uzqH{W3rLKR zce2RHss(15cLX@<@Eop<32jwepCpW_y6!6@!9EmjcPpR0jJzYzMIr-~gHT;Ybq(@s ze@HfkR@p&&OLNEE^l7n|o`lo)lIn4ml165eJ0SXHKSi{5+27N_Dh-0LryLe^RT3-T z83F7;3EjvyUNVtc?LN*r+icy_-B^4Ex?y~@kM`0jNB5&`-7Q*M>sV0_jBb&ixLEfV zKghMK$bjKJRMP>A<-a+c&M0T4IR?LfWXF8E@DZ4kqr%tp8seZgEam{SsMYh~-Qn+G z=1flAg-vHQ4l>&0rRnc0!bXUKTRGXD@-k`~3Xtr=kc|LIDW7?}rk~ezkYP+$yv&!O z62`sTYtp7JrzEbUCKD|ib0*GU!EW+znhz7=Lz9Gl0+asyZtdD{dZzgZn7@*GU7E6( ziH;hLbQ;92hBAR4f8YqymD^mw$!2d7&;^{e4DBYYNsox%I}^UTRnTziWNNdPtFkdL z%1A!-_=V@oClHdNrCS=}A-~I(MW-_x+G_c=0$v5nY6W(XBBx7}z9>Qi-Gy>giU@=v z2+u>12Pv_azbb;LcBuZg^jJ?T;e6cz=L5HEbHOSXu}XMz_`?bv9BRqM2prn?bIiIi z#TcDV>Zpuj z0!I7@5Eq+Zo?rK4kPp(n?MNCvfVr;*3o`ou~$hr9n z@8&1x9EoB@08U@lUwp5>Vj&!Ov}gu}>q@J>ql4by^j4x8^#8aj`3#s*k}ga-ai$L! zWX}#FelHQlbfAjolDG<${OWe~EkA~tRMh>^8ExC}<<<9@czv?3_V2Y_Ip#Agk48py z{0_^JP2!G(HxgLeV%$A?wcvhayPq9)9Y<~Cs=atC|DxGb^bM?7`h6e0_~7|85PNCt zW}lceL&qL@VXD(0EfX|T1tRDqMgZ+tcUhnneVncyZVcC~Kvy*qUEl3wZRSsLbAf(G z8WFo&S&(1JVno7GFoy~2O)6h&4qT(b|LM-!_M*y)P;f@~r%9^CMNTFXOr}P9K3uid zk}j&__0+fAj`IrlYHEvi@W@Xq=+N3sV`X`xnNxjl>=fiWvw6g?nacr@z$liIF{Wq~ zcDtn96LEQnfjwuty_7+r@1C>5W`cN}T9@!!TaJDBL+tDO60)LWu}==YF980hsZEG? zfvV7KRfTegn~Le!X9;-61D30unH^3t8A#Y;Pmd!GS$W(OSkc!)=l8oX*m6ZKQ9xUB zdS?I0FvE+Ri7qAHTw6D5JwhA2vX>+|`t1UVc77yN0RMXqikAJD-&{f8)CPnBn-H+P zOl7|APS(R_2PiRv#{@Q37R3T)f$fOuP^_I9qvv}J-V(#(7W{o|51nf2cdeHd%i_b< zYmxfOYdOZXhEW3VS+HNKR{LzMY|qk$@dz^xz~yzFsqBo8)pOoB?Ys>OTp3$S8e2KM zX!}`^;{Kd;uTPzwmGQlqvqE=iVTLY98%NwC5*ljVY+>*1GMzS6Ngr|v7H&Sr3oRvr z%ZVz}Sd?E_+SD4j;tBI8C9Zv2!)*n-QX=~$U7)4Od^9)FQht8O6@JkHROP&%%sH2# zdDWsWG_zGNGYam0CO-&7+j?8gKuR#^T#tAOz3_eo1Q~Ogs@^S@C}ciw;;)+2W+e;JyruB$Y3uBiY+vILgZeP5&X z8}0W|I67vOwedIxZhkCp5w|8`6ATPS5|1)u6FgRR<4R2aJ~MB^%~AGU@d_ES))~6P z&?&p|L^efqNa?U2_Fl_XnDBFZO#fEDD9Nn z?sSbPVI4uS<(vaY~TrXRhrCPCfp|jZ}KQXCi<3475Z!TA=P~k7H zVxKI~LPg1Yvb41V10gJ4tAf`RK2_3mGrWjasjptXwg*Zk=J-d5UoBl@nq{42^q-oi z#P1#TT;_FR7tM4@2t<`oDZBaV=g&+eV4Owz6_L%?)^2}pYU>5EY$+(C^D4a3bU`6FFhJdpI4PH{<=Efo(C@&B4f*U*GKm7GM4OW) z3-1rsc9pXHzUx z^0yz;k%nBe^fdZ-kl`@smb-`12-S4}%6Teg&mA^Yx z+nL@VHwD^cL~nqF=^uXozN+GbaPwbT#iVxe5yO%qY>~`4X&S%d!?7M)It%ebPFIOk z7!L0Q$jHbG1HuZBezPg_-@I!;S|tUF>% zgrOX{w9*DrhGe-GKy`WS-~T$(N?<<4>-2ifZ5JhA4R5x&FeUXT(k0GMt}y^G1cL#= z%m1K0bd6*@rlB-e$Ua$r=rm=s zeV{bD2h_j-=?>F?sIQ6zV~>Ant1BeaAkDa)(xRcsu+sB{^}#qINYuB&d^|Bd`6#0N z3TTT|j}C|f-V-eq>6QT(nW3(%B+!e{XDg>m*v%Ic80QHt03-FcaM|y_f0wZTFI+|l zkVK~Z7q#|3T}$e3T!zZ)z)nSRGr2uG-Dep#`pbU@hM-1H=5F>3eyBdT#mAw$hGW(S zLGQ!bbQbnb$IUI%36g}WW*WJ)e8vTv#vvDvJn`rQR&leMt3}(wJvie4YBqbA;bz}BGq<{2S?zAfBcA545WQp!Bbmy@ z60Hc-kqqa++0q{RD*XpgQ4q3XN2AmrX455IV8VZ$o!|exZ#}H+)xbWKJ0a3H%V4Dm z{$_4C+T7|gLDIR9V|cS%UxSz3?oG+h$JgPPsr;b3HrHgUz zTA=}KbOQzZwu5=%)>^9bT6A=c)iTd68vWIulm~v2{O74q)}dVt;z(T$f5S=lCvda$6CP5PTg)Xk^K-eM)ud834gTkHmhjN&G&jXFx44L8*)hx zTRF&V!_d33%Xvl}qZxtwa8R$E{u(0sY^qKUQ#8qPGaXM#QaQx{BVxz#dxhB&Lt z$u}lX1F`G`$tY*#oM;0jAL6;&mE6Ac^84T~ncT2F0YCqotK6C-$=ZgZ@X1_kX|XOx z@Ck#9nsX2WL;CkuSL93U3reW@{nk8RW$}l~A#q|UQz*kl z-DFo`+{llL!BoNtj%>9BLzvWuoOe8%9l;xeQ_#Yf6qyIdqXuor{n7zqj2*h_oX#gX z=*sJ?U%mTAqygN_GZ-DTUG>u(&=$%*ZUdZ=suj=pb%BU$M}4(&FOC7L75t?0z2Xtx z$Dw1>ySdtJ#oMT5`(}Xu_f?8&EFdfwB1uqyG--rKpivk9ktt#q_j}=*4Tl)qEG8K@ zNGhI9wC=c@@_KB0Jm%D(LX-*Z9@z00<0)Lz-*9i;uO+;K=s?i%eI`?bk3~Mh3I0 z?qP9oSb&l%b-ckZLm_rjAkGDD9vF;~FAmhu3)bt@n@<1zY3ZWRx!J&klF5JOADtLj z!hn#qw@eX)56ctrkK@aEiDox`8Zg9zt{QA= z+{{j~=Au3K^-6MKMwS4W_n!BQ9lt+LlL6o`0j5#?$C6T+4+e?TTN52}J__Zd|Hk8>W8Dp-Q^Ebc0`q3kWpX1{vE4R1 zk7s@b0LfS#t)|i7ho3LeVwEaOi}H8VP%A9qL-$ z0;9=UcXfP79f|7$4gtgca_;e`Ymj*71VXPhVa|Bwph~IB}--|ZP1~}n`zCU4Mi^OucbI5vjUW(tsROUC{&jSP4gpaf}b3V%I3K=6Ya*^u6n9g|_YXBDGOb6%|{ zYQk@u!tiUhIl917eR1z{CK$`W26ur62;fM7~Zz4 zJ>Tr*V$M`c`te|TB{R#r-F0rw^;?qP+q$YYP9@HJ+}AnCJlDVRFtNdj1h_QpY*4Rp zATGID?Vw=(u^{7i^+&v--=!CN$#f%ER%#9GNlBO00YSOeE)w(m(v*0bqZ9RMm7eq+ zh8{_Gm<5vC*4{Zj@Vz7crTO8iv29iDWgqgBJvRX78TsfstN*@}O6ql!T9B2V{ocOn zWBI)931`E6l*uu&mYKJit!dP}-0gcjD<<3C7l&7&f|sbu?x-Uv+wKv)p@i2VWp$r$9B znU=`nn`|u0@l>98zH(3NUFdl2Rn=5NqN+!g%;lk@=ml`zl#??xIbFc`3G}&W>Ujc` z2qilBMUb^3v8!;cEAtsKxUe>=&2U-{sNWG2M8lS6f+8RC~~yL=j% z7Tyclfh)zD>aL(i*br+ug=joXHh!r0==CZ|a=;K6gAkzJTRbBk_mLf1nAf_|f_RL^T8>lb9YC5JfU6@PMszr~DZ(xE{P0UXUz4rPnO<>d0 zlUG7cWHR0A`9W!??q~DY;N#u^M4QSv02GZB zr(w%T_roGBPSLLFn<#8{+E?7lSaS#l%Ux|Fgja}3`_GFlIC!+_2ilBtwRNnVo>hkd zNpl9DHn)`98w-tm2N$Yd?BAcpuT7VC>ldoqfnB*MvKt1R>qF`?TV7vWUni(sOgiIb zhUBX8uB#59keJy_Tgn2+%e5M$p`3j`Ef}F3brxi`;fC*MI6qq{Ko*Zz;9pBa zg}yt8BYncE)5BaMP_?Gd7CAcs@H6s|`wM0zMwRfxj{y1<@`bLk25@%(Pl5$aaUG+I z+<4nF{A-<%EcMdH)saTs!@+1cichW0#^*q^I^{P#2Rml?$8odYnRB|vOaI`4=BB>+ zfAM8cugP{kf+$XEJs-9!b`P=NtG==t>VsbOW~`0oh71#^*6(8IcWSC~{5a^1Rg_Yz zU__of$e{>P_M%8N?B4v@P7I#?vkwtVmOOhIFlIdXP0>B9L~TL;t*5i_Yx<4)zD1`> zmkNk<2`VKa-J@$0MoCLIC>^7eP)b5-)J8KHA`-#~iNVMbf-puX4Wjqg-~BxI{(`+e zuXE0Iu5-OV=bQ1+&)rjX=a%$CW3F8ryyF7Zr;UI^7iDMgs236{viS^?#ep%5Y?p^O zK=qy4#v&`cE#Bhf60#^4MPoym2lvQ?Jv1BOezwPfmEj`_`nOFIgQ?6G zh1&vGZFMVqBfeKZiF;7 zURnS3P`ujP2Y8V$`og5PSoUP7w}pIK^$Ns~v2Z&1VIQdhg3}}b60)~ zsrNyYkcPRLSc;1G6W{jVCEiEHPb`c+aWTED!OIATG}tEZDKw6CVDXc_R8d^@%{}sc zJ=GQIwS%_khE=`d4eVV)TLW}~354n7tBC}kb%}j7!!vDOW}jF*G}vW(#`gRz*NN2L zXvvX=5WdZ!ZWBk(H1j<5D|UOQ`_}zsu=m|7Z?mKK;5{avLmE%W)&62>L;NQKwd|#> z#qk#(Hu@Tq!%N#O$LxNi!m{r(6}4gaJKY&ZqO|{{qn%#wEmzCZFDsB8>~H3$j8j81 zrR5B-|ET@s^P0SaB$R<9^&%&q&Gh3NI+hNI-wt6?MQ%u5GRsip{710=dy=mladfF% zmSgu?&z#$N)*iq>UY$m@RZncJR$?s+5e1I_@k||!t^N~>x98LKu)+6cCQ!QG2Brs5 zwH?44#K4ie>cQ$v^l?Qe=*q=}(&HY>b}ao~-5!CFg!>7fNm7Vtr*}BXxSrAeMP(KklkG5%4Bo9U zJ!_HuyRjp-xMBP(#F$myzx2@uS@jLbsWfnk9u@bmac&3Nj{SOi#8euBmw1$TR_mtP z{M`Q!F?GbvkZpE1zc9A$bC_=Fp449dLg$^K`htpM24#h1-oBV2yh3wd zAy6TtiNLE3y5C7UNo~>`K_C|(yh65?2n;QB>DmJn5(K+VX zXl7B=(>Da0W%D(Z14Qm7Z|>vfEIO}H*gSW@`*_RAl#u&8Y0w{(XP#=oDV+wG>tq_% zJci+EkCRcdynKx>+Y(J4N=?c!H5wnq%M)>wa@GU&0*+W0W zSp8>oF=(}sUR-caJmzG&!KR9OJP+<4;tGtRy(q0>6=vj~7#0>aO8Cy5|4xCRApfyL z(;tlSZEZ`JJvyN@%!nKQ>qU1Ogpiu1uXC1T|E!P1Ls^#?L-=K3bFAAp&jVRk6|=@a zpHCXX|4=g3n}FMh@a(S?t2>FBCl3$MoC`rFRNqi`+xFKk4KqptVr+Q@4;dVVNwRCb zre2qe@zhsH17JZy2OoP4?bV~TX(us(fUNXtPP2Elr=38lbx;rlse~IeM$I04VMdOsa zw~vDGKUXpn9X)z)YRS-MJEj9spF+ns#%loflRAkrgo z8qst!l#Pcg+EVtE0=;9bWI2JvN~I%H08BD@T)(kKxXou`5sz|n$ef*wp&e8T=L~!A z@g_za6kdoFNd<4%nIy7Cj&d1Ke;iOavmQ1_Rd+MM7JY-S)jO-zn9I7;!lrbi{5zbA zu81-kaT0GlpWEPsS00=@xwjw$;k3@npKR&OcNfv(b9sX<2e68{1)2I(^ATYT^+B#f z7}JrsVjB?_67vJ|<82OH4fq`KQeoxjHGkm&jkv|DQ!X(*Xq=;Z)%sPPAFE5K^Pt56 zpWueMQ*gMwvbb44oO_MZO=zle0Wb+OcGy)7B6)8I$R_2|HLNc;zf=J`vaN-=KFWf~ z8FT%;9Y#0fBlbIY9wg0{U8rfoDDnPhlmc4I9c<>@sb==PU|BL$5%g#3oni2{b(a(m zL53se>G)D2m7QMt*Ych^Te2K}lF0;zTioDZ+HY9}hlbzC7dM0n8OwZkBKDBztkq?Y z1QBm1_1WRG7z5yMU#L#XZ>BjR!U(Qc@0^G}*P{?6E5;H|+@&5%6>YEzbNj;{)g%-- zx0$ql+oqT@y{#=sk%dP8le|-CahqvGz5W>S_mE)|Z3QdpE!z|L8^ioK8o6b@*jP4K zy-v-Q5-{6tBlz*@9lV2(Z1QUOS}~<^_@dl9wkPwYV;r|*z+-Eb8-yZy(;Rn8C&P@_ zt+<;)uXKtM@0blFhMDK{iJ4M0S6e}!nuexy_`(!Gblf7KRI5k$yJUjn4R`zls)p^R z&Ro}MlV5OskcLDPv3Y#&ZYOc@5d+;G@wvK1p-*(n{!enuSd|NGjE&1f@XN&zW5K)V zz_NUl1Nfy_*hPTJfO2=BYPW_+?ayCiIqTyUTkU<3L;BD4?MM0Quru{h0V_r)HsuoP zRI8Fs5>weh4>Z*T`c*+7)B6^ZQfjd+oRe8|THQ;6TO9L}*q7F9HahgB0Y3ZS$U6qX zj_5*0vwz@d9((HDfmF(=%T%B`zAd8hRgXzS|Wjpb?Zhc zXap;e({A$)v7$ucPf1=9FbwR;PDt*(LiO=D*F+nuvIEZ+sdKIO4opQpfV`V4YvI{uhJQfz^ z(2=yOC~fDQ*h7(%yV~H!+%0t|J;=ns$jJ=D)q0I6FpH^Y* zC$O&Ne=1UV4oyFGFxElW6Y2EcDiyHPO&iRyN5bFBi>WR9%>%5)I zOOYL_00D32=GBzk=62-w-@IgZ>Pf`#bVW557CByCb+hj6foHDT7v6sN?eH5$Jxtk4 zqXp=Hbpdq5#pSs(EM}2vYqfMLcMkx$Qpl3PZs`N(3`u>dyIkQx*Pr8IK2`0$GG>~L zLYwiV7>t;`A%0|`M+y0EaTYk=gSkk<%#)(J(vQEOL|yArBcwA~6d%GONCgP`b}q?& z1pYXPmXW}JacZWGg{{L>ClB=i( ziW7W_)&uyNseLiorpHUSD+A&Sp)Fs{`u}2!XI(AZHSdgL2GE!^HV)pc`Oezqmxc>a zj$48W<{POYbUAE~F)MizV{z**G97~+1NwD6YbXDcju~CI7&(jul@$+2q(9AP-fj^~cKC@wY4g0`9WXF}d22e7>M`HxaJHv4tsTP6&Ui=J7Bb)*8ux z+!tyjWM<~7E5`F>fAjHrr$A4JZkU|`WyN)+KRu4?i?!F{+w$`hRjeR*AoOJm|5C3( zPLFpgwM#dko2Ifs$MfF7#FSyg*4b?YFw-p@Ju1t1^25W1P>7K_FL$5+U_Q$bgr^)- zJA!&Mh`lS;deQHpd7`Pt+`NO3YCAqA`4%H3Wyf}S5h0T7oRf6(8eefB!X#3fX$kMN zvX@%Dt-}*Hsl5x1m|9li>`WYQ-Lk$1VRzWtS!i$SlNjnOCw7$t?Fu?Y-RNlTpt;l= zVfiW=yil6NkO;0@WEY?LL)cNjYmL=I0cnfXRs0Coenv;-lV^6C{os`F`4*`@v`zS9 zM{f1nlI|82Q?uEOd-9ENy9p6fD*uM@hCZyMg_-Obd>>=Q(fq@UUD4pQrw*$86!ij2gxOpK{kd9CE799%N@?PQCyB<74)TI zWZQN$NhQc?})$lbH3GRTB8V#n_byELIgU~m}QdBK!klUFisYxa4b=Qa02-EzB05IqrPwU*Uom z^%Mp2TPoT)a+FQ>lntxgyo`gZOzMRlME5AdKg>qSW>cG*gTYnu0e zv#K<0(b) z2B;FOY`y;4q%vi_J21m*Z?Zzb6MSFYebT^=1naK5a1!;MCYj3gO?C&_kz?x27QZO_ zsL_MBMELT5g{gn{dT36uXh+{Jeg1@Z@G6P?b)K^GW=);%uhTT+2}TB$VR;Q<)S%P{ zc44xOuHsmQ6sc#bm8+9q9P}%F!uxEF{Lf^^-IDfDF{3z)ZwINc`KA?@%j(j)1|{ub z^yBOetdZ*Z8U4vy`5_AcaUELFG%$yeN$&vN0-#9vOhO1h=q1o}!QVqV!pwpBfk*%D ziVf2Qcmz8>(|0Lj0`k3*W1*qQy`6jw=w@SwJcK*oj)AGI58#Vep*G}2l)VvcyheGf z>REIRv*)3W{k8SwF4l!r9p$wf8Ev^Ki5HOcPCM^n?Fl2TH-WNAn7GC%t#B=>KL5_G7!PeJN-9C-gb;IH zQqoMZ$Z<2Hx}5v4^u?x=0P6uWuKdy#7ZtHJLEK*-<%gvGr`Yj z<%BEdGS!C>sCJGW8PWb8T&jWw4eb;mJ~okauG{7__XNA;UORfFvy2|G|pEr2Wi4l{yv1FU;0!^ns6X<$e%mYBAF@%v#7jHoNBv)F&>@ zb<+%#?Ar8+p7BAKakxSKd&AlII0K-C)yi@}T-&?_TpTcQRLMOg&BoE_s@{m!KU3!u z`ctcrkHZqf!;7XUWit9mVpZ~_y*6-q@iQ2-?uuggqI8(?7 zU0k6@Xp%n_J7y>5tXT)@}lyLel=*bW^ zE;U7o#b1RQ7R-}v96M@wfD#BdsCjQ_d5cc-zuU$K?WHYp(Sib$?r57PPQm1=RqoIR zxKDSnE&rm>wJDqBKS$zyCOX5M2(r7x5~9JE!O%vw}G8! z%ncljOmc{y3BqhSBDXn^y{4d7BR|}h(R2SAGrq>OIaLc+BFXy zi|UPw+0@h@a9QUIrE$yw9!_c(TuV(IlInBP0M4Vbgx-ngjhid~?w$Y*bG(K&`g-5d zj*PdC8{)n3NaaaYK)P5*wS}xr=n9EH#~cp0!T9pjU$4v0_;UOLjp}Msd@js{%%#z* z)NC{tsmA2fO|E@_I+;)~&DqtkYfL;mCw*>gb>Fkt99K8Wr*Hw+>^QG#-j_ zoQP$O*-rFa|AU5%-P_UVNI485A9p~QWHeQNIfhhmN%h{K(7|$B9QZC;N-+Rl&~_a} zDAq2cA>886F9|;5wcB0>s`sYxQDPz1Wc!gKIWu&JjylnhWou#D)*azt2+@OKO-tr- z>jQtv>)r7%YF`Lm;gwSGF^5c#A>hf8R?YT(=gNi&zM}StMOZk-)N&zrlHM63DOR+y zqjE28y1R*uNp2uUFt~!J%`ZTjS*!luw}kSB4%0_jeJiPpBoZ%@BvQPE!*X^ko*uvm zUY_FU=;!OPO~m%|4JsiibOwcfDawA0g1BIa8`pJ{ZgG!w;OD=ktIk^y_^pp3Yu6 z&Ys6-kc))+?_SE2Yp9Dv+AH|~b;8bdJT&L01?-B`t!YnLTlNtvj~p-azW|#s4hUr_ zdLyes+^%E)pX^jC_pEzI%``k%V`cMUv8h~&nD&rC7*$An=1{M?W@JbMMI_vCXI9vh z7y?II21}&V);7qNr}{r{^cl}BcLKG{R*yWmn)!QWBDdVkgcmRP7;tZUspEJfg@Cal z=u$hKUsU?3BBlkNhzU?%_!T*p*wdvO0WAfC5vZD1YYzm`r}gw zbJ=6Gp}F~98r`0;zj}3uZk!nBdb|Yc%k+oFE6rdprG+Y?WE;_iq1t|_4egTS-r@Z5 z3H4^FM;qs?on;l%(vPJ@!HY1{XZ`|5%`mkuw_<1?x9LD%kEgXtNizjrtl8HDywN8s zScEr=_%fG7-nom>rXCZo(t?exCAI*sB6y#VOYEoIQiD~%+oSYAM~@lO|W_$a-Zw_j*()@3P-uJL`yMCvvYRk?Qqv?==`6N z00qmMbCdET$Ee!UPnU_@n-p0|{lc(#i$hvDP0kAtSzT1G`_Y<|GGW;Uc$8njCcm#J-V(Jppg;*CBojpwF6dwPv6 z_q=-i8!SK{0ktczlDm|DV=Esqi>iKd5w>^QM2C8!It>|TBTy2w2b_xWAw-7~;$0=kIBt{;3d zUu^N8{7ypwEa&T0KWJ7mc7V-QvhHRJUxb>?1&{|{41&fKs+V3WgLJUqwdp9Y48sH8 zJhM#oPAFYna+lhz-9(R2mAsrKeUk`lmY6m@`Dp8i3Th-6SXXmef|@fNXHVDc{mgKI z3x~dQ$2h8GE8N^8Wj`>*@naK3hg9WX`NPY%4oh@)S7OL1(%c(q4DTbsAS+HgsFkv_ z=9{#MTcSj}!c$Prxl28`>%6Kzi!o{)Rwsz_i-w%Mm=l*$kXj)n)oCw4dw|_`Fi)s;d;fT>_SUPjAFJKw`Mq=tHcH#Ui(aY%Y`Rt(# z>Cg4HC-dgo-s3=rdF#WSSY5h3y2Id^U6o%u z7Hmk7H~Ia+NU$wqgGKYNxMPpZLE&2c2O>DBv#!^0aDTDnN60Bug5Il%duel*7K(;ywA*h~SlUO3mvf>O#e6RG=I+J6<9d&-FOG=$MBz)wp}U$sufHtK%> DdO9%` literal 0 HcmV?d00001 diff --git a/src/participate/during-contest/write-program.md b/src/participate/during-contest/write-program.md new file mode 100644 index 0000000..b8d3804 --- /dev/null +++ b/src/participate/during-contest/write-program.md @@ -0,0 +1,13 @@ +# プログラムの作成 + +**TODO** このページは書きかけです。 + +テストが用意できたらプログラムを作成します。エディタを開いて思う通りにコードを書きましょう。 + +ちなみに、 AtCoder のコンテストでは、一部の例外的なコンテストを除いて、例え類題検索のようなことであっても、コンテスト中に自由にインターネットを検索・閲覧してよいことになっています。 + +> Note: このことは厳密には各コンテストごとのルール (例えば [AtCoder Beginner Contest 160](https://atcoder.jp/contests/abc160) であれば[こちら](https://atcoder.jp/contests/abc160/rules)) に記されています。 + +したがって、コンテスト中に[標準ライブラリのドキュメント](https://doc.rust-lang.org/std/index.html)やその他の外部クレートのドキュメント、使い方やサンプルコードなどを検索することは問題ありません。たとえば `itertools` にこういうメソッドなかったかなと思うことがあれば、遠慮なく Google で "itertools rust" などと検索してみましょう。大抵はそれでドキュメントが見つかるはずです。 + +(TODO: コンテスト中に特に有用なページがあればまとめたい) From aba370fd8183cb8ff179067186fc6e4f1817d07f Mon Sep 17 00:00:00 2001 From: statiolake Date: Mon, 6 Apr 2020 20:23:49 +0900 Subject: [PATCH 18/24] Add how to test code --- src/SUMMARY.md | 2 +- src/participate/during-contest/test.md | 71 ++++++++++++++++++++++++++ 2 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 src/participate/during-contest/test.md diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 8beadcc..a972731 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -20,7 +20,7 @@ - [コンテスト開始後の流れ (TODO)](./participate/during-contest/index.md) - [テストケースの作成 (TODO)](./participate/during-contest/write-tests.md) - [プログラムの作成 (TODO)](./participate/during-contest/write-program.md) - - [プログラムのテスト (TODO)](./todo.md) + - [プログラムのテスト (TODO)](./participate/during-contest/test.md) - [プログラムの提出 (TODO)](./todo.md) - [Tips(小技集) (TODO)](./todo.md) - [クレートの使用例 (TODO)](./todo.md) diff --git a/src/participate/during-contest/test.md b/src/participate/during-contest/test.md new file mode 100644 index 0000000..ca52f0c --- /dev/null +++ b/src/participate/during-contest/test.md @@ -0,0 +1,71 @@ +# プログラムのテスト + +**TODO** このページは書きかけです。 + +一通り書き終わったと思ったら、提出前にまずは一度サンプルケースで答えが合うかどうかを確認してみましょう。コマンド プロンプトまたは端末を開いてプロジェクトフォルダに移動して、次のようなコマンドを実行します。 + +```console +$ cargo test + Compiling abc000 v0.1.0 (C:\Users\dicen\workspace\daily\2020\0406\abc000) + Finished dev [unoptimized + debuginfo] target(s) in 0.52s + Running target\debug\deps\main-1ecbd097f851d76e.exe + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out + + Running target\debug\deps\sample_inputs-05a0de7d755e5cc1.exe + +running 3 tests +No +test sample3 ... ok +Yes +test sample1 ... ok +No +test sample2 ... ok + +test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +``` + +すると、このようにテスト結果が表示されます。このように最後に `test result: ok.` となっていれば、すべてのテストに成功しているということになります。一方で、もし成功しないテストがあれば、次のようになります。 + +```console +$ cargo test + Compiling abc000 v0.1.0 (C:\Users\dicen\workspace\daily\2020\0406\abc000) + Finished dev [unoptimized + debuginfo] target(s) in 0.68s + Running target\debug\deps\main-1ecbd097f851d76e.exe + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out + + Running target\debug\deps\sample_inputs-05a0de7d755e5cc1.exe + +running 3 tests +No +test sample2 ... ok +Yes +No +test sample1 ... FAILED +test sample3 ... ok + +failures: + +---- sample1 stdout ---- +thread 'sample1' panicked at 'assertion failed: `(left == right)` + left: `"Yes\n"`, + right: `"No\n"`', tests\sample_inputs.rs:16:5 +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace. + + +failures: + sample1 + +test result: FAILED. 2 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out + +error: test failed, to rerun pass '--test sample_inputs' +``` + +最後の `test result: FAILED.` により失敗したことが示されています。その横には成功と失敗の個数が示されています。そして上には失敗したときのコマンドの出力も示されています。 `assertion failed` 以降から、 `No` と出力すべきところを `Yes` と出力してしまったことがわかります。 + +> Note: メッセージに示される `left:` と `right:` はマクロ `assert_eq!(left, right);` に渡される引数の左右です。用意したテストコードでは実際の出力を左、期待される出力を右として `assert_eq!(output.stdout_str(), "No\n");` としていたことから、本来は `No` と出力すべきところを `Yes` と表示した、ということがわかります。 From 3cf8cd261a3ec8c0b6848e68360247dffa499e4e Mon Sep 17 00:00:00 2001 From: statiolake Date: Mon, 6 Apr 2020 20:26:24 +0900 Subject: [PATCH 19/24] Add submit page simply --- src/SUMMARY.md | 2 +- src/participate/during-contest/submit.md | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 src/participate/during-contest/submit.md diff --git a/src/SUMMARY.md b/src/SUMMARY.md index a972731..3285b90 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -21,7 +21,7 @@ - [テストケースの作成 (TODO)](./participate/during-contest/write-tests.md) - [プログラムの作成 (TODO)](./participate/during-contest/write-program.md) - [プログラムのテスト (TODO)](./participate/during-contest/test.md) - - [プログラムの提出 (TODO)](./todo.md) + - [プログラムの提出 (TODO)](./participate/during-contest/submit.md) - [Tips(小技集) (TODO)](./todo.md) - [クレートの使用例 (TODO)](./todo.md) - [AtCoder運営者向けの情報](./atcoder-env/index.md) diff --git a/src/participate/during-contest/submit.md b/src/participate/during-contest/submit.md new file mode 100644 index 0000000..9163c1a --- /dev/null +++ b/src/participate/during-contest/submit.md @@ -0,0 +1,5 @@ +# プログラムの提出 + +**TODO** このページは書きかけです。 + +テストも終わって問題ないとなれば、最後は提出です。書いたコードをコピーして、コンテストページから提出し、結果を確認してください。 `AC` ならば正解で、 `WA` ならば不正解です。サンプルが通るのに `WA` になった場合は、考慮漏れや他のバグがないか確認してみましょう。 From f98167757f3a2420d5a7a1b1bba35978c0a7904f Mon Sep 17 00:00:00 2001 From: statiolake Date: Mon, 6 Apr 2020 21:40:26 +0900 Subject: [PATCH 20/24] Organize TODOs --- src/SUMMARY.md | 14 +++++------ src/installation/cargo-generate.md | 4 +--- src/installation/editor.md | 6 ++--- src/installation/index.md | 4 +--- src/installation/rls.md | 2 -- src/installation/toolchain.md | 24 ++++++++++++------- src/introduction.md | 2 -- .../before-contest/choose-crates.md | 4 +++- .../before-contest/copy-project.md | 8 ++++--- .../before-contest/generate-project.md | 2 +- src/participate/before-contest/index.md | 4 +--- src/participate/during-contest/index.md | 4 +--- src/participate/during-contest/test.md | 2 -- src/participate/during-contest/write-tests.md | 2 -- src/participate/index.md | 2 +- 15 files changed, 40 insertions(+), 44 deletions(-) diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 3285b90..cee3189 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -2,7 +2,7 @@ # Summary -- [はじめに (TODO)](./introduction.md) +- [はじめに](./introduction.md) - [AtCoderの環境について (TODO)](./todo.md) - [ソフトウェアのバージョンなど (TODO)](./todo.md) - [単一のソースファイル (TODO)](./todo.md) @@ -10,17 +10,17 @@ - [開発環境の準備 (TODO)](./installation/index.md) - [Rustツールチェインのインストール (TODO)](./installation/toolchain.md) - [ソースコードエディタの準備 (TODO)](./installation/editor.md) - - [Rust Language Server のインストール (TODO)](./installation/rls.md) - - [cargo-generateのインストール (TODO)](./installation/cargo-generate.md) + - [Rust Language Server のインストール](./installation/rls.md) + - [cargo-generateのインストール](./installation/cargo-generate.md) - [コンテストの参加方法 (TODO)](./participate/index.md) - - [コンテスト直前の事前準備 (TODO)](./participate/before-contest/index.md) + - [コンテスト直前の事前準備](./participate/before-contest/index.md) - [Cargoパッケージの作成 (TODO)](./participate/before-contest/generate-project.md) - [利用するクレートの選択とコンパイル (TODO)](./participate/before-contest/choose-crates.md) - [プロジェクトのコピー (TODO)](./participate/before-contest/copy-project.md)] - - [コンテスト開始後の流れ (TODO)](./participate/during-contest/index.md) - - [テストケースの作成 (TODO)](./participate/during-contest/write-tests.md) + - [コンテスト開始後の流れ](./participate/during-contest/index.md) + - [テストケースの作成](./participate/during-contest/write-tests.md) - [プログラムの作成 (TODO)](./participate/during-contest/write-program.md) - - [プログラムのテスト (TODO)](./participate/during-contest/test.md) + - [プログラムのテスト](./participate/during-contest/test.md) - [プログラムの提出 (TODO)](./participate/during-contest/submit.md) - [Tips(小技集) (TODO)](./todo.md) - [クレートの使用例 (TODO)](./todo.md) diff --git a/src/installation/cargo-generate.md b/src/installation/cargo-generate.md index 06334db..25ad201 100644 --- a/src/installation/cargo-generate.md +++ b/src/installation/cargo-generate.md @@ -2,11 +2,9 @@ # `cargo-generate` のインストール -**TODO** このページは書きかけです。 - AtCoder で利用できる Rust のバージョンやライブラリを指定したプロジェクトを簡単に生成するために、 [atcoder-rust-base の ja ブランチ](https://github.com/rust-lang-ja/atcoder-rust-base/tree/ja)にプロジェクトの雛形を用意しています。この雛形は`cargo generate`というコマンドを使って展開するため、先にこのコマンドをインストールする必要があります。 -`cargo generate` サブコマンドを利用できるようにするには `cargo-generate` が必要です。端末 (Windows ユーザーの方はコマンド プロンプト) を開いて `cargo install cargo-generate` コマンドを実行してください。これだけでインストールできます。 +`cargo generate` サブコマンドを利用できるようにするには `cargo-generate` が必要です。端末 (Windows ユーザーの方はコマンド プロンプト) を開いて `cargo install cargo-generate` コマンドを実行してください。これだけでインストールは完了です。 ```console $ cargo install cargo-generate diff --git a/src/installation/editor.md b/src/installation/editor.md index 7137a55..c58dfb8 100644 --- a/src/installation/editor.md +++ b/src/installation/editor.md @@ -1,8 +1,6 @@ -# ソースコードエディタの準備 (TODO) - -**TODO** このページは書きかけです。 +# ソースコードエディタの準備 Rust プログラムのソースコードは単純なテキストファイルです。編集にはテキストエディタというプログラムを使います。単純にテキストを読み書きするという機能に限ればテキストエディタは OS にも付属していますが、よりプログラミングに特化した機能を多く揃えるテキストエディタが無料で簡単に使える時代ですので、ぜひ活用するべきです。それらのエディタが持つ機能には例えば次のようなものがあります。 (一例です) @@ -20,3 +18,5 @@ Rust プログラムのソースコードは単純なテキストファイルで こういった機能は Language Server Protocol という共通の仕組みの上に実装されているので、これをサポートするエディタであればこれらの機能を享受できます。 Language Server Client を実装しているエディタは無数にあり、どれを使うかは完全に好みです。 本説明はできるだけエディタによらないように進めていくつもりですが、エディタに特有の内容が現れるときは [Visual Studio Code](https://code.visualstudio.com/) を想定して説明します。それ以外のエディタを使われる方は適宜読み替えてお読みください。次節で Rust のコーディング支援機能を導入する方法を説明します。 + +(TODO: Visual Studio Code のインストールと Rust (rls) 拡張機能のインストールを説明する) diff --git a/src/installation/index.md b/src/installation/index.md index 3986e69..27d0c11 100644 --- a/src/installation/index.md +++ b/src/installation/index.md @@ -4,10 +4,8 @@ **TODO** このページは書きかけです。 - - この章では、手元のパソコンに Rust の開発環境と、テキストエディタとして [Visual Studio Code](https://code.visualstudio.com/) をインストールする方法について説明します。 -環境を手元に用意するメリットは普段使い慣れたエディタや環境でコーディングできるようになることです。開発環境を用意して Language Server Protocol に対応するエディタ ([Visual Studio Code](https://code.visualstudio.com/) など) を利用すれば、入力補完やリアルタイムのエラーチェックなど様々な機能の恩恵を受けることができます。逆に言うと、自分の使い慣れたエディタや環境を使いたいと思わずむしろ環境を整える方が面倒だと感じられる方は AtCoder のコードテスト (リンク準備中) を利用するのが最も簡単な方法です。外部ライブラリにまつわる互換性の問題もありません。 +環境を手元に用意するメリットは普段使い慣れたエディタや環境でコーディングできるようになることです。開発環境を用意して Language Server Protocol に対応するエディタ ([Visual Studio Code](https://code.visualstudio.com/) など) を利用すれば、入力補完やリアルタイムのエラーチェックなど様々な機能の恩恵を受けることができます。逆に言うと、自分の使い慣れたエディタや環境を使いたいと思わずむしろ環境を整える方が面倒だと感じられる方は AtCoder のコードテスト (TODO: リンクが完成次第挿入) を利用するのが最も簡単な方法です。外部ライブラリにまつわる互換性の問題もありません。 既に Rust の開発環境がインストールされており、普段使い慣れたエディタや編集環境もあるという方には前半は全く不要な話となります。[`cargo-generate` のインストール](cargo-generate.md)へお進みください。それもインストールされている方はこの章で説明することはありませんので、実際に[参加方法の説明](../participate/index.md)へお進みください。 diff --git a/src/installation/rls.md b/src/installation/rls.md index 6abb4c7..e8b10dd 100644 --- a/src/installation/rls.md +++ b/src/installation/rls.md @@ -2,8 +2,6 @@ # Rust Language Server のインストール -**TODO** このページは書きかけです。 - Rust Language Server (RLS) は、ソースコード編集中の様々な支援機能を提供するためのプログラムです。例えば、プログラムを編集しながらリアルタイムでエラー箇所をハイライトしたり、コード補完機能を提供したり、定義にジャンプしたり、簡単なドキュメントを表示したりといった様々な機能があります。使い慣れたエディタとともにこうした支援機能が使えることが、ローカルに Rust の環境を作る大きなメリットです。 なお、こうしたコーディング支援機能が不要だと考える方はインストールをする必要はありません。 diff --git a/src/installation/toolchain.md b/src/installation/toolchain.md index 0db937b..1bdbf56 100644 --- a/src/installation/toolchain.md +++ b/src/installation/toolchain.md @@ -1,6 +1,6 @@ -# Rust ツールチェインのインストール (TODO) +# Rust ツールチェインのインストール **TODO** このページは書きかけです。 @@ -13,12 +13,17 @@ OS によっては Rust を実行するのに追加のプログラムが必要になりますので、まずはそれをインストールしましょう。 -- Windows - TODO: Visual Studio Build Tools などをインストール +- Windows + + (TODO: Visual Studio Build Tools をインストール) + - macOS - TODO: Cコンパイラ (に付属するリンカー) のインストール + + (TODO: Cコンパイラ (に付属するリンカー) のインストール) + - Linux (Windows Subsystem for Linux を含む) - TODO: Cコンパイラ (に付属するリンカー) のインストール + + (TODO: Cコンパイラ (に付属するリンカー) のインストール) ## ステップ 2: Rustup のインストールスクリプトを実行する @@ -27,12 +32,15 @@ OS によっては標準のパッケージ管理に Rust のパッケージが にアクセスすると、お使いのプラットフォームに合わせてインストールスクリプトを実行する方法が表示されます。大きくは Windows と macOS/Linux で分かれます。 -- Windows +- Windows + `rustup-init.exe` のような実行ファイルのダウンロードリンクが示されていると思いますので、それをダウンロードして実行します。 -- macOS / Linux (Windows Subsystem for Linux 含む) + +- macOS / Linux (Windows Subsystem for Linux 含む) + `curl` を用いてスクリプトをダウンロード・実行する方法が示されていると思います。書かれているコマンドをターミナルへ入力してください。 -TODO: 以下、スクリプトの指示に従ってインストールする方法とインストールを確認する方法を書く +(TODO: 以下、スクリプトの指示に従ってインストールする方法とインストールを確認する方法を書く) ## ステップ 3: インストールされたことを確認する diff --git a/src/introduction.md b/src/introduction.md index 298add9..57df5ba 100644 --- a/src/introduction.md +++ b/src/introduction.md @@ -2,8 +2,6 @@ # はじめに -**TODO** このページは書きかけです。 - 本書はAtCoderのコンテストにRustで参加するためのガイドブックです。 diff --git a/src/participate/before-contest/choose-crates.md b/src/participate/before-contest/choose-crates.md index 78135b5..92f0749 100644 --- a/src/participate/before-contest/choose-crates.md +++ b/src/participate/before-contest/choose-crates.md @@ -2,6 +2,8 @@ # 利用するクレートの選択とコンパイル +**TODO** このページは書きかけです。 + 先にも軽く触れた通り、依存クレートのコンパイルにはそれなりの時間がかかります。コンテストが始まってから最初の問題の提出前に実行するとなるとそれなりのタイムロスになります。そこで次の二つのことをコンテスト開始前に行ってしまい、コンテスト開始後になるべくスムーズに行動できるよう準備しておきましょう。 ## 利用するクレートの選択 @@ -14,7 +16,7 @@ 利用するクレートの選択を終えたら、次は事前コンパイルを行います。 -TODO: コマンド プロンプトまたは端末を開き、プロジェクトのあるフォルダまで移動する方法を説明する +(TODO: コマンド プロンプトまたは端末を開き、プロジェクトのあるフォルダまで移動する方法を説明する) 端末を開いてプロジェクトのあるフォルダまで移動したら、次のようにビルドを行います。 diff --git a/src/participate/before-contest/copy-project.md b/src/participate/before-contest/copy-project.md index 6564f94..7adc06f 100644 --- a/src/participate/before-contest/copy-project.md +++ b/src/participate/before-contest/copy-project.md @@ -1,6 +1,8 @@ -# プロジェクトのコピー (TODO) +# プロジェクトのコピー + +**TODO** このページは書きかけです。 競プロで書くコードは書き捨てにする、という方は先程作ったプロジェクトをすべての問題で使いまわしても問題ありませんが、コードをずっと残しておきたいとか、あるいは詰まったから一旦保存しておいて別の問題に行きたいことがよくある、といった事情で、プロジェクトを予め問題数分用意しておきたい方もいるかと思われます。この作業も少々手間ですので、このようにされたい方はコンテスト前に準備しておくとよいでしょう。 @@ -10,10 +12,10 @@ - Windows - TODO: ジャンクション (`mklink /J target /path/to/original/target`) または (必要ならローカルセキュリティポリシーまたはレジストリエディタを使って SeCreateSymbolicLinkPrivilege 権限を有効にして) シンボリックリンク (`mklink /D target /path/to/original/target`) + (TODO: ジャンクション (`mklink /J target /path/to/original/target`) または (必要ならローカルセキュリティポリシーまたはレジストリエディタを使って SeCreateSymbolicLinkPrivilege 権限を有効にして) シンボリックリンク (`mklink /D target /path/to/original/target`)) - macOS または Linux - TODO: `ln -s /path/to/original/target target` + (TODO: `ln -s /path/to/original/target target`) ただし、このときはメインバイナリ `target/debug/` すらも共有になってしまうため、別のプロジェクトを `cargo run` する前に `cargo clean -p ` としてバイナリを削除する必要があります。 `cargo` はおそらくソースファイルとバイナリの更新日時を比較してリビルドの要不要を判断しているため、状態によっては前のプロジェクトの成果物をそのまま実行してしまうことがあります。 diff --git a/src/participate/before-contest/generate-project.md b/src/participate/before-contest/generate-project.md index cd1e279..399bd1f 100644 --- a/src/participate/before-contest/generate-project.md +++ b/src/participate/before-contest/generate-project.md @@ -8,7 +8,7 @@ まずは、今から参加するコンテストのソースコードを置くフォルダを準備してください。 -TODO: フォルダを作成してそこに cd する方法を説明する +(TODO: フォルダを作成してそこに cd する方法を説明する) では、実際にプロジェクトを生成していきます。 diff --git a/src/participate/before-contest/index.md b/src/participate/before-contest/index.md index f879cbd..a303668 100644 --- a/src/participate/before-contest/index.md +++ b/src/participate/before-contest/index.md @@ -1,8 +1,6 @@ -# コンテスト開始前 - -**TODO** このページは書きかけです。 +# コンテスト開始前の事前準備 コンテストの開始前にプロジェクトを準備して一度ビルドしておくと、コンテスト開始後の動きがスムーズになります。特に初回ビルド時は依存クレートのコンパイルに時間がかかります。お使いのパソコンのスペックにもよりますが、もしすべてのクレートを有効にした場合は完了まで数分程度かかるとお考えください。 diff --git a/src/participate/during-contest/index.md b/src/participate/during-contest/index.md index 0d42996..4631789 100644 --- a/src/participate/during-contest/index.md +++ b/src/participate/during-contest/index.md @@ -1,8 +1,6 @@ -# コンテスト開始後 - -**TODO** このページは書きかけです。 +# コンテスト開始後の流れ 1. 問題を開き、テストケースを記述します。 1. プログラムを書きます。 diff --git a/src/participate/during-contest/test.md b/src/participate/during-contest/test.md index ca52f0c..b5a9884 100644 --- a/src/participate/during-contest/test.md +++ b/src/participate/during-contest/test.md @@ -1,7 +1,5 @@ # プログラムのテスト -**TODO** このページは書きかけです。 - 一通り書き終わったと思ったら、提出前にまずは一度サンプルケースで答えが合うかどうかを確認してみましょう。コマンド プロンプトまたは端末を開いてプロジェクトフォルダに移動して、次のようなコマンドを実行します。 ```console diff --git a/src/participate/during-contest/write-tests.md b/src/participate/during-contest/write-tests.md index ceb0f05..1e5b147 100644 --- a/src/participate/during-contest/write-tests.md +++ b/src/participate/during-contest/write-tests.md @@ -1,7 +1,5 @@ # テストケースの作成 -**TODO** このページは書きかけです。 - Rust には組み込みでテストをするための機構が備わっています。これらの様式に則ってテストを書くと、 `cargo test` コマンドを実行するだけでテストを実行することができます。これを競プロでもサンプルケースが通るかどうかを確かめるのに利用することができます。この機能の使い方の例として、生成したテンプレートの `tests/sample_inputs.rs` には [AtCoder Beginner Contest 086 C - Traveling](https://atcoder.jp/contests/abc086/tasks/arc089_a) のサンプルケースが書かれています。 > Note: 直接手と目で確認する場合や、別のコンテスト支援ツールを利用する場合などはこの手順は必要ありません。また `cargo test` を利用しない場合、サンプルのテストファイルは削除しても良いですし、しなくても特に問題はありません。 diff --git a/src/participate/index.md b/src/participate/index.md index 9e248ea..b8c218b 100644 --- a/src/participate/index.md +++ b/src/participate/index.md @@ -2,7 +2,7 @@ # コンテストの参加方法 -**TODO** このページは書きかけです。 +**TODO** この章は書きかけです。 本章では、手元にAtCoderのジャッジサーバーの環境と同等のプロジェクトを用意してコンテストに参加する方法について説明します。 From 5e12106adcaa02873da9f51b6b1dbaa2e8beac0f Mon Sep 17 00:00:00 2001 From: statiolake Date: Mon, 6 Apr 2020 21:57:49 +0900 Subject: [PATCH 21/24] Fix markdown styling --- src/atcoder-env/compiling-and-running-using-cargo.md | 5 ++++- src/atcoder-env/compiling-and-running-using-rustc.md | 4 +++- src/atcoder-env/installing-rust-crates.md | 7 ++++++- .../installing-rustc-dep-option-generator.md | 1 + src/atcoder-env/supported-environment.md | 1 + src/introduction.md | 12 ++++++++++++ src/participate/before-contest/choose-crates.md | 3 +++ src/participate/before-contest/generate-project.md | 2 ++ src/participate/during-contest/submit.md | 2 ++ src/participate/during-contest/test.md | 2 ++ src/participate/during-contest/write-program.md | 2 ++ src/participate/during-contest/write-tests.md | 2 ++ 12 files changed, 40 insertions(+), 3 deletions(-) diff --git a/src/atcoder-env/compiling-and-running-using-cargo.md b/src/atcoder-env/compiling-and-running-using-cargo.md index 1e99a9c..be9b62e 100644 --- a/src/atcoder-env/compiling-and-running-using-cargo.md +++ b/src/atcoder-env/compiling-and-running-using-cargo.md @@ -1,3 +1,5 @@ + + # [cargo] ファイルレイアウトとコンパイルの流れ 選手がRustプログラムを提出すると、その内容がジャッジサーバ上のファイルシステムに書き出されます。 @@ -21,7 +23,8 @@ $HOME # ユーザのホームディレクトリ 以上でCargoプロジェクトが整いました。 -# コンパイルコマンド + +## コンパイルコマンド ツールチェインのインストールのページで説明したように、コンパイルを実行するシェルに以下の環境変数が設定されている必要があります。 diff --git a/src/atcoder-env/compiling-and-running-using-rustc.md b/src/atcoder-env/compiling-and-running-using-rustc.md index 82f9360..2aae656 100644 --- a/src/atcoder-env/compiling-and-running-using-rustc.md +++ b/src/atcoder-env/compiling-and-running-using-rustc.md @@ -1,3 +1,5 @@ + + # [rustc] ファイルレイアウトとコンパイルの流れ 選手がRustプログラムを提出すると、その内容がジャッジサーバ上のファイルシステムに書き出されます。 @@ -25,7 +27,7 @@ $HOME ``` -# コンパイルコマンド +## コンパイルコマンド ツールチェインのインストールのページで説明したように、コンパイルを実行するシェルに以下の環境変数が設定されている必要があります。 diff --git a/src/atcoder-env/installing-rust-crates.md b/src/atcoder-env/installing-rust-crates.md index e645069..edbb78c 100644 --- a/src/atcoder-env/installing-rust-crates.md +++ b/src/atcoder-env/installing-rust-crates.md @@ -20,6 +20,7 @@ - 例:標準ライブラリのハッシュ関数はDoS攻撃を避けるために暗号強度があり、計算量が多い。 競技プログラミングでは暗号強度は求められず、より計算量の少ないハッシュ関数で十分 + ### AtCoder運営者様へのお願い 対象クレートの一覧は[このページ][crates-2019]にあります。 @@ -38,6 +39,7 @@ `cargo build`コマンドを実行すると、Cargoはそれらのクレートのソースコードをダウンロードし、適切なオプションと共に`rustc`を実行することでクレートをコンパイルします。 クレートのソースコードは`$CARGO_HOME/registory/src`にダウンロードされ、コンパイル済みのクレート(`rlib`ファイル)は`Cargo.toml`が置かれたディレクトリを起点とする相対ディレクトリ`./target/release/deps`配下に出力されます。 + ### 一般的な開発時のファイルレイアウト ```console @@ -63,6 +65,7 @@ $HOME # ユーザのホームディレクトリ まず、今回は各ファイルを以下のように配置し、クレートのコンパイルは導入時に済ませておくことにします。 + ### AtCoderジャッジサーバでのファイルレイアウト(導入時に配置するもの) ```console @@ -82,6 +85,7 @@ $RUST_HOME (/usr/local/lib/rust) そしてジャッジの際には[以前説明した](./supported-environment.md#一般的なrustプログラム開発環境との違い)Cargoを利用する方法と`rustc`を利用する方法のいずれかを利用してコンパイルします。 + ### [cargo] AtCoderジャッジサーバでのファイルレイアウト(ジャッジの際に作成するもの) ```console @@ -96,6 +100,7 @@ $HOME # ユーザのホームディレクトリ └-- atcoder-rust-base # コンパイル、リンク済みの実行ファイル ``` + ### [rustc] AtCoderジャッジサーバでのファイルレイアウト(ジャッジの際に作成するもの) Cargoを使用せず、`rustc`に適切なオプション(ライブラリ検索パスなど)を与えて実行することで、事前にコンパイルしておいた`rlib`ファイルとリンクさせます。 @@ -343,6 +348,7 @@ _108 = {package = "whiteread",version = "=0.4.4",default-features = false,featur [the-cargo-book-platform-specific-dependencies]: https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html#platform-specific-dependencies [the-cargo-book-specifying-dependencies]: https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html#specifying-dependencies + ## クレートのコンパイル クレートをコンパイルしましょう。 @@ -371,4 +377,3 @@ $ find target/release/deps/ -type f | egrep -c '\.(rlib|so)$' 66 # ↑ 上の数字を確認 ``` - diff --git a/src/atcoder-env/installing-rustc-dep-option-generator.md b/src/atcoder-env/installing-rustc-dep-option-generator.md index 73d3722..6769bbd 100644 --- a/src/atcoder-env/installing-rustc-dep-option-generator.md +++ b/src/atcoder-env/installing-rustc-dep-option-generator.md @@ -19,6 +19,7 @@ $ sudo apt install -y libssl-dev なお`libssl-dev`は`rustc-dep-option-generator`が`cargo`をライブラリとして用いているために必要ですが、このツールではその機能は使いません。ツール実行時のネットワーク・アクセスは不要です。 + ## ツールのインストール `cargo install`コマンドでインストールします。 diff --git a/src/atcoder-env/supported-environment.md b/src/atcoder-env/supported-environment.md index 519c72a..e9627bc 100644 --- a/src/atcoder-env/supported-environment.md +++ b/src/atcoder-env/supported-environment.md @@ -2,6 +2,7 @@ # 本章で想定している環境 + ## 用語 まずは用語を整理します。本章で用いる用語には以下のものがあります。 diff --git a/src/introduction.md b/src/introduction.md index 57df5ba..7579e96 100644 --- a/src/introduction.md +++ b/src/introduction.md @@ -25,14 +25,17 @@ AtCoderは、オンラインで参加できるプログラミングコンテス AtCoderで使える言語は非常にたくさんあります。どの言語を使ってもよいですし、問題によって使い分けても構いません。その中でなぜRustを使うのか、そのメリットとデメリットをまとめてみました。できるだけ一般論で比較するよう心がけますが、競技プログラミングにおけるC++人口がそれなりに多いことと、Rustはその特性上C++と比較されることが多いので、具体的にC++との比較になっている部分も多くあります。 + ### メリット + #### 高速である AtCoder含め、競技プログラミングでは「実行時間制限」とよばれるものがあります。この時間内にプログラムの実行が終わらないと「TLE (Time Limit Exceeded)」という判定が付いて誤答扱いとなります。多くの場合は想定されている解法であれば多少の余裕をもって解けるように設定されていますが、非常にたくさんの言語が使える都合上全ての言語で公平になるようにはできません。遅い言語に合わせて設定すると速い言語では強引な解法でゴリ押しできてしまうことがありますし、速い言語に合わせると遅い言語では想定されている解法でも通せないということになります。いずれにせよ、基本的には速い言語であるほうが計算時間的には有利です。 (もちろん遅い言語と言われるものにも、例えば書き易さであったり、ライブラリが充実していたり、なにかしらのメリットがあるはずです。どちらかが絶対的に有利ということではありません。) Rustは最速と言われるC/C++並みに速いとされていますので、(少なくともAtCoderでは) 速度面で不利になることはないと言えるでしょう。 + #### 信頼性が高い 信頼性は、ここではRustの[公式トップページ](https://www.rust-lang.org/)に倣いメモリ安全性、スレッド安全性、バグの起こしにくさであるとします。競技プログラミングで特に大事になってくるのはメモリ安全性とバグの起こしにくさです。 @@ -97,6 +100,7 @@ stack backtrace: note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace. ``` + #### 多くの問題をコンパイル時に発見できる RustはC/C++並みの速度を確保するため、実行時にやらなければいけないことをなるべく減らす方針の言語です。たとえば先ほど触れたように、多くの言語にあるガベージコレクタがありません。それだけならばC++と変わりありませんが、速度と安全性を両立させるためにRustではできるだけ多くのことをコンパイル時に確認する仕組みになっています。C++が受け入れてしまうような危険なコードもコンパイルエラーにします。 @@ -136,6 +140,7 @@ let x: i32 = s.into_iter().sum(); ジェネリクスとトレイトの仕組みも強力です。たとえばジェネリックな関数が型変数`T`をもつとき、この`T`のとりうる型を特定のトレイト (=機能一覧) を実装しているものだけに制限することができます。逆に`T`に対してできることはその特定のトレイトが定める機能のみです。従って、一度コンパイルが通った関数はその制約を満たす限りのどのような`T`を与えても関数の内部でコンパイルエラーとなることはありません。特にライブラリを整備するにあたってはこれはとてもありがたいことです。実際に使ってみなくても、コンパイルさえ通れば、将来的に作られうるどんなユーザー定義型を与えようともその関数が正しく呼び出せることが保証されます。C++のテンプレートなどでは実際に具体的な型を与えて始めて様々な検証をするので、使う段階になってからでないとエラーが発見できません。このことは、後述するコンパイルエラーの分かりやすさにも繋がっています。 + #### コンパイルエラーが分かりやすい これは少々主観的な話になるのかもしれませんが、Rustのコンパイルエラーは読みやすく分かりやすいという評判があります。実際にコンパイルエラーが発生したとき、まずエラーが起きた場所はもちろんとして、エラーが関連する他の場所 (例えば以前に借用された場所など) などをアスキーアート的な手法で視覚的に分かりやすく表示してくれます。さらに、なぜそれが間違っているのか/それをどのように修正することができるかのヒントが提示されることもあります。例えば、先ほどのエラー全体は次のようになっていました。 @@ -185,6 +190,7 @@ fn main() { (以下略) `````` + #### 抽象化のための機能を数多く備えている 例えば次のようなさまざまな機能があります。Rustは後発の言語ですので、他のプログラミング言語に備わっている優れた機能も参考にして多数の機能が導入されています。 @@ -268,6 +274,7 @@ fn main() { また、変数の個数を抑止するという効果もあります。block expression等と適宜組み合わせることで変数の数やスコープはさらに小さく保つことができ、多少関数の実装が長くなっても見通しが悪くなりにくいと言えます。競技プログラミングではmain関数が長くなりがちなので一層嬉しいのではないでしょうか。 + #### ゼロコスト抽象化を追求している Rustの言語デザインやライブラリは、一定の使いやすさを実現しつつも、使いやすさのために実行時の高速性を犠牲にはしないという**ゼロコスト抽象化** (_zero-cost abstraction_)を追求しています。 @@ -276,8 +283,10 @@ Rustの言語デザインやライブラリは、一定の使いやすさを実 このことは「簡潔な構文や関数によってその機能が必要とするコストを隠してしまう」ことを避けているとも言えます。つまり、本当にパフォーマンスが必要なときに最適化を検討するべき「コスト」の部分が明確化されているということでもあります。 + ### デメリット + #### 現れる概念が比較的難しい 先に見たように、Rustでは、いままで他の言語ではコンパイラが検証していなかったようなことをコンパイル時に検証します。そのためにRustでは所有権や借用をはじめとする独特の概念が導入されており、それらの概念の理解そのものが難しいとされることも多いようです。これらの概念が課す多数のルールがなぜ存在するのかを理解することは、仕組みをある程度理解していなければ難しいものです。 @@ -286,6 +295,7 @@ Rustの言語デザインやライブラリは、一定の使いやすさを実 Rustが課すルールにも理由がありますので、そういった事情について意識的に考えることは他の言語や競技プログラミング以外の文脈でも活きる有意義なものではあると思います。単にAtCoderである程度の競技プログラミングをするだけであれば、C#やJavaといった言語でもほぼ正解できるよう調整されているようなので、どちらを取るかは好みといっていいかもしれません。 + #### 素早く書くことにはあまり向かない仕様 Rustの安全指向や標準ライブラリの設計方針などは、時間をかけて大規模なプログラムを書くときや堅牢なプログラムを書くときには非常に役に立ちます。一方で競技プログラミングでは、一般のプログラミングと異なり、次のような特徴があります。 @@ -341,12 +351,14 @@ fn main() { Rustで参加する競技プログラマーの中には、こうした煩雑さを改善するためのマクロやヘルパ関数 (もっと便利に標準入力がとれるようにするなど) を定義し、テンプレート (ひな型) として用意している方もいます。インターネット上で公開されている方もいらっしゃいますし、過去のコンテストでの上位Rust参加者の提出などをのぞいてみると、いろいろと参考になるかもしれません。 + #### 標準ライブラリが小さい Rustは比較的新しい言語ですので、インターネット接続環境を前提にしたパッケージ管理システムCargoを標準で持ちます。このため、言語の成長とクレートやRustエコシステムの成長を分離することを目的に、Rustは標準ライブラリを最低限の抽象化とインターフェースとして位置付け、できるだけ小さく保ち続けてきました。かつて標準ライブラリの一部だったり本体にバンドルされていたライブラリ (`num`, `rand`, `regex` など) を積極的に分離することさえしています。ユーザーはCargoを使えば、使いたいパッケージを[crates.io](https://crates.io)からいつでも自由にダウンロードできます。 (TODO: クレートが導入されたかどうか追記) + #### コンパイル時間が長くなりがち 様々な解析をコンパイル時に行う都合上、コンパイル時間が長めにかかる傾向があります。Rustではコンパイル速度を速くすることはあまり重要視されていません。特に手元で提出をテストする際、外部クレートを利用するならその外部クレートのビルドも実行することになります。二回目以降のビルドではビルドキャッシュを利用するためコンパイルする必要はありませんが、初回の実行では利用する外部クレートによっては数分単位の時間をとられる可能性があります。つまり、素早く書き上げたコードを手元で軽く実行してみることにすら時間をとられてしまい、提出時刻が数分遅れてしまうということがあり得ます。結果的に手元でコンパイルが通るかどうかをチェックする時間すら惜しいとなってしまうと本末転倒です。なお、外部ライブラリを含むパッケージをコンテスト開始前に一回ビルドしておいて、競技時はそのフォルダをコピーして編集するというふうにすれば回避できます。 diff --git a/src/participate/before-contest/choose-crates.md b/src/participate/before-contest/choose-crates.md index 92f0749..e589f33 100644 --- a/src/participate/before-contest/choose-crates.md +++ b/src/participate/before-contest/choose-crates.md @@ -6,12 +6,14 @@ 先にも軽く触れた通り、依存クレートのコンパイルにはそれなりの時間がかかります。コンテストが始まってから最初の問題の提出前に実行するとなるとそれなりのタイムロスになります。そこで次の二つのことをコンテスト開始前に行ってしまい、コンテスト開始後になるべくスムーズに行動できるよう準備しておきましょう。 + ## 利用するクレートの選択 これは事前準備時間を短くする、またはビルドディレクトリのディスク容量を減らすことに効果があります。 すべての依存クレートを有効化すると、スペックや環境にもよりますが、初回のコンパイルに数分かかるようになり、ビルドキャッシュも数百 MB (メガバイト) になります。ただし二回目以降のコンパイル時間やコンパイル後のバイナリの実行速度には影響しません。すなわち、競プロとして AtCoder 上で不利になるようなことはありません。したがって、最初にすべてのクレートを有効にしてしまったほうがコンテスト中の自由度は高くなります。このあたりのバランスはご自分のパソコンのリソースと相談して選択してください。 + ## 事前コンパイル 利用するクレートの選択を終えたら、次は事前コンパイルを行います。 @@ -37,6 +39,7 @@ $ cargo build > Note: ここでは `cargo build` としてデバッグモードでのビルドを行いました。実際の AtCoder では `--release` オプションをつけて実行速度を最適化するのですが、これをつけるとさらにビルド時間が伸びてしまうことや、デバッガによるデバッグがしづらくなることなどのデメリットがあります。加えて、手元の環境ですることはサンプルケースレベルの比較的小さいサイズの入力を試す程度であることが多いため、速度を最適化する必要性もさほどないことが多いのではないでしょうか。一方、手元でもリリースビルドでテストすることがあるという方は、この段階で `cargo build --release` も加えて実行しておくことをおすすめします。そうでないとコンテスト中にリリースビルド用の依存クレートのコンパイルが行われ、多くの時間を取られてしまいます。 + ## (オプション) Rust Language Server の事前準備 > Note: この手順は Rust Language Server (RLS) を利用しない方は必要ありません。 diff --git a/src/participate/before-contest/generate-project.md b/src/participate/before-contest/generate-project.md index 399bd1f..6f33fcd 100644 --- a/src/participate/before-contest/generate-project.md +++ b/src/participate/before-contest/generate-project.md @@ -12,6 +12,7 @@ では、実際にプロジェクトを生成していきます。 + ## `cargo-generate` をインストールしている場合 `cargo generate` コマンドをインストールしている場合は、次のようにコマンドを実行してプロジェクト名を入力すれば AtCoder での環境と同様の環境のプロジェクトが生成できます。 @@ -27,6 +28,7 @@ Done! New project created /path/to/project/abc000 > Note: ここで生成されるプロジェクトはサンプルとして [AtCoder Beginner Contest 086 C - Traveling](https://atcoder.jp/contests/abc086/tasks/arc089_a) の解答例とサンプルケースのテスト方法例が書かれてます。テンプレートを自分向けにカスタマイズしたい場合は、リポジトリをフォークするなどして編集し、それを URL に指定して生成させることもできます。 + ## `cargo-generate` をインストールしていない場合 まずは空のプロジェクトを作成します。 diff --git a/src/participate/during-contest/submit.md b/src/participate/during-contest/submit.md index 9163c1a..18b09e6 100644 --- a/src/participate/during-contest/submit.md +++ b/src/participate/during-contest/submit.md @@ -1,3 +1,5 @@ + + # プログラムの提出 **TODO** このページは書きかけです。 diff --git a/src/participate/during-contest/test.md b/src/participate/during-contest/test.md index b5a9884..be8f58f 100644 --- a/src/participate/during-contest/test.md +++ b/src/participate/during-contest/test.md @@ -1,3 +1,5 @@ + + # プログラムのテスト 一通り書き終わったと思ったら、提出前にまずは一度サンプルケースで答えが合うかどうかを確認してみましょう。コマンド プロンプトまたは端末を開いてプロジェクトフォルダに移動して、次のようなコマンドを実行します。 diff --git a/src/participate/during-contest/write-program.md b/src/participate/during-contest/write-program.md index b8d3804..259b3bb 100644 --- a/src/participate/during-contest/write-program.md +++ b/src/participate/during-contest/write-program.md @@ -1,3 +1,5 @@ + + # プログラムの作成 **TODO** このページは書きかけです。 diff --git a/src/participate/during-contest/write-tests.md b/src/participate/during-contest/write-tests.md index 1e5b147..2517fe7 100644 --- a/src/participate/during-contest/write-tests.md +++ b/src/participate/during-contest/write-tests.md @@ -1,3 +1,5 @@ + + # テストケースの作成 Rust には組み込みでテストをするための機構が備わっています。これらの様式に則ってテストを書くと、 `cargo test` コマンドを実行するだけでテストを実行することができます。これを競プロでもサンプルケースが通るかどうかを確かめるのに利用することができます。この機能の使い方の例として、生成したテンプレートの `tests/sample_inputs.rs` には [AtCoder Beginner Contest 086 C - Traveling](https://atcoder.jp/contests/abc086/tasks/arc089_a) のサンプルケースが書かれています。 From 705d69d5c29d4eaf90e7887fd61b3f08acbc3b26 Mon Sep 17 00:00:00 2001 From: statiolake Date: Mon, 6 Apr 2020 22:00:30 +0900 Subject: [PATCH 22/24] Use quote style (>) for notes --- .../installing-rustc-dep-option-generator.md | 2 +- src/installation/toolchain.md | 2 +- src/introduction.md | 20 +++++++++---------- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/atcoder-env/installing-rustc-dep-option-generator.md b/src/atcoder-env/installing-rustc-dep-option-generator.md index 6769bbd..150e5a6 100644 --- a/src/atcoder-env/installing-rustc-dep-option-generator.md +++ b/src/atcoder-env/installing-rustc-dep-option-generator.md @@ -2,7 +2,7 @@ # (オプション)クレート検索パス生成ツールのインストール -**Note:** この作業は実際のビルドに`rustc`を利用する場合で、クレート検索パスを指定するコンパイルオプションをツールで生成する場合に必要となります。実際のビルドで`cargo`を利用する場合と`cargo build -v`などの出力を元にしてクレート検索パスを指定するコンパイルオプションを手書きする場合などはツールは不要です。 +> Note: この作業は実際のビルドに`rustc`を利用する場合で、クレート検索パスを指定するコンパイルオプションをツールで生成する場合に必要となります。実際のビルドで`cargo`を利用する場合と`cargo build -v`などの出力を元にしてクレート検索パスを指定するコンパイルオプションを手書きする場合などはツールは不要です。 このページでは`rustc`のコマンドライン・オプションを生成するツールである`rustc-dep-option-generator`のインストール手順を説明します。 このツールはRustで書かれています。 diff --git a/src/installation/toolchain.md b/src/installation/toolchain.md index 1bdbf56..d7a0126 100644 --- a/src/installation/toolchain.md +++ b/src/installation/toolchain.md @@ -4,7 +4,7 @@ **TODO** このページは書きかけです。 -**Note:** インストール方法は適宜変わる可能性があります。情報が古いまたは不足している場合は、公式の [book](https://doc.rust-lang.org/book/ch01-01-installation.html) にある解説を適宜参照ください (英語) 。 +> Note: インストール方法は適宜変わる可能性があります。情報が古いまたは不足している場合は、公式の [book](https://doc.rust-lang.org/book/ch01-01-installation.html) にある解説を適宜参照ください (英語) 。 まずは Rust 本体をインストールする必要があります。 diff --git a/src/introduction.md b/src/introduction.md index 7579e96..39274ae 100644 --- a/src/introduction.md +++ b/src/introduction.md @@ -9,16 +9,16 @@ AtCoderは、オンラインで参加できるプログラミングコンテスト(競技プログラミング)のサイトです。リアルタイムのコンテストで競い合ったり、約3000問のコンテストの過去問にいつでも挑戦することが出来ます。 ([AtCoderのトップページ](https://atcoder.jp/)より引用) -**Note:** 競技プログラミングはプログラミングで解決できるような問題をなるべく早く正確に解く競技です。競技プログラミングについてよく知らないが興味があるという方は、インターネット上に初心者向けの詳しい情報がたくさんありますので検索してみてください。AtCoderで開催されているものでは、大きく分けて二種類あります。 - -- 与えられる問題に対して、その解を出力するようなプログラムを書く競技 (アルゴリズム系) - - 定期開催のもの: AtCoder Beginner Contest (ABC), AtCoder Regular Contest (ARC), AtCoder Grand Contest (AGC) があり、難易度は通常 ABC < ARC < AGC です。 - - 定期開催の他、企業によって開かれるコンテストもあります。そういったコンテストで上位成績をとると、その企業への就職、インターン、アルバイトなどで多少優遇されることがあります (コンテストによります) 。 - - 例: 「整数`N`が与えられます。`N`以下の正整数から等確率に1つを選ぶとき、それが奇数になる確率を求めなさい」 (AtCoder Beginner Contest 142 A問題) - - 例: 「`N`人の身長が与えられます。`K`cm以上の人の人数を出力してください」 (AtCoder Beginner Contest 142 B問題) -- 与えられる問題に対して、少しでも良い解を出力するようなプログラムを書く競技 (マラソン系) - - 定期開催のものはまだありません。企業が自社の取り組みやそこでの課題をテーマに出題することが多いようです。 - - 例: 「ある観測データが与えられるので、可能な限り圧縮するプログラムとそれを解凍するプログラムを書いてください」 (Wethernews Programming Competition) +> Note: 競技プログラミングはプログラミングで解決できるような問題をなるべく早く正確に解く競技です。競技プログラミングについてよく知らないが興味があるという方は、インターネット上に初心者向けの詳しい情報がたくさんありますので検索してみてください。AtCoderで開催されているものでは、大きく分けて二種類あります。 +> +> - 与えられる問題に対して、その解を出力するようなプログラムを書く競技 (アルゴリズム系) +> - 定期開催のもの: AtCoder Beginner Contest (ABC), AtCoder Regular Contest (ARC), AtCoder Grand Contest (AGC) があり、難易度は通常 ABC < ARC < AGC です。 +> - 定期開催の他、企業によって開かれるコンテストもあります。そういったコンテストで上位成績をとると、その企業への就職、インターン、アルバイトなどで多少優遇されることがあります (コンテストによります) 。 +> - 例: 「整数`N`が与えられます。`N`以下の正整数から等確率に1つを選ぶとき、それが奇数になる確率を求めなさい」 (AtCoder Beginner Contest 142 A問題) +> - 例: 「`N`人の身長が与えられます。`K`cm以上の人の人数を出力してください」 (AtCoder Beginner Contest 142 B問題) +> - 与えられる問題に対して、少しでも良い解を出力するようなプログラムを書く競技 (マラソン系) +> - 定期開催のものはまだありません。企業が自社の取り組みやそこでの課題をテーマに出題することが多いようです。 +> - 例: 「ある観測データが与えられるので、可能な限り圧縮するプログラムとそれを解凍するプログラムを書いてください」 (Wethernews Programming Competition) ## なぜRustなのか? From 39fec8ab24e521ec0ea1141f466630b2b7f7fcc5 Mon Sep 17 00:00:00 2001 From: statiolake Date: Mon, 6 Apr 2020 22:12:32 +0900 Subject: [PATCH 23/24] Fix TODOs in introduction --- src/introduction.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/introduction.md b/src/introduction.md index 39274ae..8b082f9 100644 --- a/src/introduction.md +++ b/src/introduction.md @@ -334,7 +334,7 @@ fn main() { 例えば[`Index`](https://doc.rust-lang.org/stable/std/ops/trait.Index.html)で境界外アクセスしたときやメモリが足りずにアロケーションに失敗したとき、[`println!`が失敗したとき](https://doc.rust-lang.org/std/macro.println.html#panics)にパニックします。 このように「失敗するとパニックする」ものはその条件をドキュメントに`# Panics`という形で書いています。 -(TODO: proconioの当落に応じて追記) +> Note: 入力をとる方法については、2020年言語アップデートで外部クレートとして[`proconio`](https://docs.rs/proconio/0.3.6/proconio/)や[`text_io`](https://docs.rs/text_io/0.1.8/text_io/), [`whiteread`](https://docs.rs/whiteread/0.5.0/whiteread/)などのクレートが導入されたため、かなり改善されました。リンク先はそれぞれのクレートのドキュメントになっていますので、詳しくはそちらをご覧ください。 他にも、先程少し触れましたが例えば数値型の四則演算や比較を行なうときには基本的に両辺の型が等しくなければいけません。 `i32`と`&'_ i32`を両辺に持って来ることくらいは許されていますが`i32`と`i64`をそのまま足したり比較したりはできません。 @@ -356,8 +356,7 @@ Rustで参加する競技プログラマーの中には、こうした煩雑さ Rustは比較的新しい言語ですので、インターネット接続環境を前提にしたパッケージ管理システムCargoを標準で持ちます。このため、言語の成長とクレートやRustエコシステムの成長を分離することを目的に、Rustは標準ライブラリを最低限の抽象化とインターフェースとして位置付け、できるだけ小さく保ち続けてきました。かつて標準ライブラリの一部だったり本体にバンドルされていたライブラリ (`num`, `rand`, `regex` など) を積極的に分離することさえしています。ユーザーはCargoを使えば、使いたいパッケージを[crates.io](https://crates.io)からいつでも自由にダウンロードできます。 -(TODO: クレートが導入されたかどうか追記) - +しかし、逆に言えば標準ライブラリだけでは使える機能が非常に制限されるということにもなります。そのため、2020年言語アップデートでいくつかの著名な外部クレートが導入されて利用できるようになりました。2020年4月6日現在、利用可能なクレートの一覧とそれぞれについての簡単な説明が[こちら](https://github.com/rust-lang-ja/atcoder-rust-resources/wiki/2020-Update)にまとめられています。 #### コンパイル時間が長くなりがち From f35612518e3c86a38bcb17a60d87c3768b35db5d Mon Sep 17 00:00:00 2001 From: statiolake Date: Mon, 6 Apr 2020 22:41:32 +0900 Subject: [PATCH 24/24] Add rest of pages --- src/SUMMARY.md | 9 +++------ src/environment.md | 10 ++++++++++ src/tips.md | 5 +++++ src/todo.md | 5 ----- src/use-crates.md | 5 +++++ 5 files changed, 23 insertions(+), 11 deletions(-) create mode 100644 src/environment.md create mode 100644 src/tips.md delete mode 100644 src/todo.md create mode 100644 src/use-crates.md diff --git a/src/SUMMARY.md b/src/SUMMARY.md index cee3189..3f3f686 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -3,10 +3,7 @@ # Summary - [はじめに](./introduction.md) -- [AtCoderの環境について (TODO)](./todo.md) - - [ソフトウェアのバージョンなど (TODO)](./todo.md) - - [単一のソースファイル (TODO)](./todo.md) - - [利用可能なクレート (TODO)](./todo.md) +- [AtCoderの環境について](./environment.md) - [開発環境の準備 (TODO)](./installation/index.md) - [Rustツールチェインのインストール (TODO)](./installation/toolchain.md) - [ソースコードエディタの準備 (TODO)](./installation/editor.md) @@ -22,8 +19,8 @@ - [プログラムの作成 (TODO)](./participate/during-contest/write-program.md) - [プログラムのテスト](./participate/during-contest/test.md) - [プログラムの提出 (TODO)](./participate/during-contest/submit.md) -- [Tips(小技集) (TODO)](./todo.md) - - [クレートの使用例 (TODO)](./todo.md) +- [Tips(小技集) (TODO)](./tips.md) + - [クレートの使用例](./use-crates.md) - [AtCoder運営者向けの情報](./atcoder-env/index.md) - [本章で想定している環境](./atcoder-env/supported-environment.md) - [インストール](./atcoder-env/installation.md) diff --git a/src/environment.md b/src/environment.md new file mode 100644 index 0000000..90f3406 --- /dev/null +++ b/src/environment.md @@ -0,0 +1,10 @@ + + +# AtCoderの環境について + +現在 AtCoder で利用できる最新の環境は 2020 年言語アップデートによって更新された環境です。 + +- Rust 1.42.0 +- 外部クレートあり + +コンパイルオプションや利用できる外部クレートの一覧と簡単な解説やコード例など、この環境についてのより詳しい情報は [2020 Update](https://github.com/rust-lang-ja/atcoder-rust-resources/wiki/2020-Update) のページにまとまっています。ご一読ください。 diff --git a/src/tips.md b/src/tips.md new file mode 100644 index 0000000..f677732 --- /dev/null +++ b/src/tips.md @@ -0,0 +1,5 @@ + + +# Tips(小技集) + +**TODO** このページは書きかけです。 diff --git a/src/todo.md b/src/todo.md deleted file mode 100644 index dc599af..0000000 --- a/src/todo.md +++ /dev/null @@ -1,5 +0,0 @@ - - -# TODO - -このページは未作成です。 diff --git a/src/use-crates.md b/src/use-crates.md new file mode 100644 index 0000000..f46b8d0 --- /dev/null +++ b/src/use-crates.md @@ -0,0 +1,5 @@ + + +# クレートの使用例 + +外部クレートの使用例については [2020 Update](https://github.com/rust-lang-ja/atcoder-rust-resources/wiki/2020-Update) のページに具体的なソースコードと一緒にまとまっています。