開発日記 2020/08/20 よすぽジャッジにRubyを追加しようとして苦戦しています

この記事は、作業の経過を書いておくことであとで同じようなことをする人の助けになればと思い書いています。経験がある人、もしくは未来人の私は助けてください。



_[Library Checker](https://judge.yosupo.jp/)を知っていますか？僕は知っています。_


こんにちは。Library Checker（よすぽジャッジと呼んでいます）の言語にRubyを追加しようとして苦戦中です。

よすぽジャッジは[競プロ](https://ja.wikipedia.org/wiki/%E7%AB%B6%E6%8A%80%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0)に必要なライブラリのテストができるサイトです。

現状、このサイトにはRubyのテスト環境はありません。残念ながら。

おそらくご存知ないと思いますが、私はRubyで競プロをすることに熱を（41.1℃ほども）入れているので、Rubyが使いたいのです。（諦めてRustに乗り換えようかとしていたのですが、Rubyをできるようにすればいいじゃないという私にとっては目からウロコの発想をくれたそすうぽよさんに感謝します）

どうにかRubyができるようにしたいので、がんばります。

## とりあえず、先駆者様のプルリクを参考にしてみます。

* [add Common Lisp #121](https://github.com/yosupo06/library-checker-judge/pull/121)
* [add golang #86](https://github.com/yosupo06/library-checker-judge/pull/86)
* [add csharp 8.0 #42](https://github.com/yosupo06/library-checker-judge/pull/42)
* [Add C++17 support #17](https://github.com/yosupo06/library-checker-judge/pull/17)

なんとなくわかったような・・・・。

## テスト環境を整えようとします。

problemsをcloneして、READMEを読みつつコマンドを打ってみます。

```bash
$ git clone https://github.com/yosupo06/library-checker-problems.git
$ cd library-checker-problems
$ ./generate.py -p unionfind
02:45:36 [INFO] Start unionfind
02:45:36 [INFO] generate params.h
02:45:36 [INFO] Test cases are already generated
02:45:36 [INFO] The checker is already compiled
```

よさげなのでjudgeをcloneして同様のことをします。

```bash
$ git clone https://github.com/yosupo06/library-checker-judge.git
$ cd ../library-checker-judge
$ pip3 install -r requirements.txt
$ ulimit -s unlimited
$ pip3 install termcolor toml psycopg2 psutil grpcio minio
$ sudo apt install postgresql-client libpq-dev python3 python3-dev python3-pip g++ cgroup-tools libcap2-bin
$ ./launch_local.sh
```

なんかエラーが出たので適当にぐぐって解決できないか試しました。エラーは消えたので覚えてません。

```bash
$ curl -OL https://github.com/google/protobuf/releases/download/v3.4.0/protoc-3.4.0-linux-x86_64.zip
unzip protoc-3.4.0-linux-x86_64.zip -d protoc3
$ sudo mv protoc3/bin/* /usr/local/bin/
$ sudo mv protoc3/include/* /usr/local/include/
$ pip3 install -U protobuf
```

```bash
./launch_local.sh
```

起動できたのでevansとやらを入れて試してみます。

```bash
# evans　インストール方法　わすれました
$ evans --host localhost --port 50051 api/proto/library_checker.proto
  ______
 |  ____|
 | |__    __   __   __ _   _ __    ___
 |  __|   \ \ / /  / _. | | '_ \  / __|
 | |____   \ V /  | (_| | | | | | \__ \
 |______|   \_/    \__,_| |_| |_| |___/

 more expressive universal gRPC client


librarychecker.LibraryCheckerService@localhost:50051>
Good Bye :)
evans: deprecated usage, please use sub-commands. see `evans -h` for more details.
```

いけたっぽい

あとjudge以下のGoも
（↓いらないっぽい）

```bash
$ cd judge
$ go run main.go judge.go
2020/08/20 03:09:33 local mode
2020/08/20 03:09:33 Connect to API host: localhost:50051
2020/08/20 03:09:34 JudgeName: tzm
2020/08/20 03:09:34 Start Pooling
```

はい

この端末は開いたままで別の端末を起動して作業します。

どうやらいけたっぽいのでfrontendもやります。

```bash
$ git clone https://github.com/yosupo06/library-checker-frontend.git
$ go run . --local
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.

[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
 - using env:	export GIN_MODE=release
 - using code:	gin.SetMode(gin.ReleaseMode)

[GIN-debug] Loaded HTML Templates (12): 
	- login.html
	- navbar.html
	- problem.html
	- ranking.html
	- register.html
	- submitlist.html
	- 
	- css.html
	- help.html
	- problemlist.html
	- submitinfo.html
	- userlist.html

[GIN-debug] GET    /public/*filepath         --> github.com/gin-gonic/gin.(*RouterGroup).createStaticHandler.func1 (4 handlers)
[GIN-debug] HEAD   /public/*filepath         --> github.com/gin-gonic/gin.(*RouterGroup).createStaticHandler.func1 (4 handlers)
[GIN-debug] GET    /register                 --> main.registerGet (4 handlers)
[GIN-debug] POST   /register                 --> main.registerPost (4 handlers)
[GIN-debug] GET    /login                    --> main.loginGet (4 handlers)
[GIN-debug] POST   /login                    --> main.loginPost (4 handlers)
[GIN-debug] GET    /logout                   --> main.logoutGet (4 handlers)
[GIN-debug] GET    /                         --> main.problemList (4 handlers)
[GIN-debug] GET    /problem/:name            --> main.problemInfo (4 handlers)
[GIN-debug] POST   /submit                   --> main.submit (4 handlers)
[GIN-debug] GET    /submission/:id           --> main.submissionInfo (4 handlers)
[GIN-debug] GET    /submissions              --> main.submitList (4 handlers)
[GIN-debug] GET    /rejudge/:id              --> main.getRejudge (4 handlers)
[GIN-debug] GET    /ranking                  --> main.getRanking (4 handlers)
[GIN-debug] GET    /help                     --> main.helpPage (4 handlers)
[GIN-debug] GET    /admin/userlist           --> main.getUserList (4 handlers)
[GIN-debug] GET    /admin/addadmin/:name     --> main.getAddAdmin (4 handlers)
[GIN-debug] GET    /admin/deladmin/:name     --> main.getDelAdmin (4 handlers)
[GIN-debug] Listening and serving HTTP on :8080
```

いけたのかな？

なんかエラーが出てたので一旦終わってなんかします。

```bash
$ cd ../library-checker-judge/judge/executor-rust
$ cargo build --release
```

適当に全部再起動したらエラーでなくなりました。

ブラウザで`localhost:8080`を見てみます。

（スクショ撮るの忘れた）問題なんもねーじゃん。

```bash
$ cd ../library-checker-problems
$ ./deploy.py
```

はい。

## おやすみなさい
Q. そんな行きあたりばったりで大丈夫か？
A. 大丈夫じゃないが