ISHOCON1をCrystalで書いたお気持ち

アジェンダ

  • ISHOCON1にCrystal実装を追加したよ!Crystal書ける人はぜひ挑戦してみてね!
  • Crystal強い人のレビュー、お待ちしています!

 

目次

ISHOCON1にCrystal実装を追加した話

新しい言語を覚えるには

新しい言語をどんどん覚えていきたい欲はあるのですが、どのようにすればいいでしょうか。一番は、その言語で何か物を作ってみることだと思います。

まずは定番、「HelloWorld」から始まり、「FizzBuzz」書いてみたりします。標準入出力を学んだあと、ループや条件分岐を学ぶ感じですね。この後は競技プログラミングの簡単な問題で、文字列の扱いや配列の扱い、classの扱いまでやって、木構造なんかを作ってみるって感じで僕はやっています。

今回新たなルートとして、ISHOCON1に実装を追加するってフェーズを付け加えました。

ISHOCONとは

ISHOCONとは Iikanjina SHOwwin CONtest の略で、ISUCONと同じように与えられたアプリケーションの高速化を競うコンテスト(?)です。  

github.com

ISUCONクローンとして有名なプロダクトとして、pixiv社のpixiv isuconYahoo! Japan社のY!SUCONなど共に挙げられるのがこのISHOCONです。特にISHOCONは企業としてではなく、個人プロダクトとして公開されている点が特徴です。

なぜISHOCONを選んだのか

ISHOCONは、本家ISUCONや他のISUCONクローンプロダクトに比べて、コード量が少ないことが特徴的です。その分初心者向けで、コードの全容を把握してからISUCONする(最適化していく)って感じでも、全然行けるようになっています。8時間あれば、僕一人でだいたい改善したいところは改善しきることができる分量です。本家ISUCONでは三人がかりでもこんなこと絶対に無理です。なので、参考実装を作るのは、比較的楽な方だと思います。

また、作者の人と会ったこともあるってのが、心理的な障壁を大きく下げてくれました。

なぜCrystalを選んだのか

まず、Crystalとの出会いは、AtCoderで提出できる言語一覧にあった事でした。

crystal-lang.org

とりあえずWebページ行ってみると、「C言語のように速く、Rubyの書き味を持つ」(Crystal-jpのSlackより引用)ってなってて、なかなか面白そうな言語があるなーって思いました。

AtCoderで何問かCrystalを使って解いてみて、いい感じで使えたので、もうちょっとこの言語について詳しくなりたいと思いました。

CrystalのWebページには、最初にWebサーバーでHelloWorldを返すやつを立ててみるところから始まっています。これはWeb向きの言語なのかなって思いました。なので、深く学びたければ、Webサイトを作ってみるのが良さそうだと思いました。

なぜISHOCON1のCrystal実装を作ろうと思ったのか

CrystalでWebサイトを作れば、Crystalをよく学べるかなと思ったのはいいのですが、じゃあどんなWebサイトを作ればいいのってなります。僕はアイデアマンではないです。そうぽんぽんいいアイデアなんて浮かびません。また、普通のプロジェクトを別言語で書き直したところで、メンテナンスが面倒になるだけですし、一つのプロジェクトで複数の言語の実装があるなんて意味がわかりません。ですが、特殊例として、ISUCONに関してだけ言えば、複数言語による参考実装がないと困ります。

主催者が考えるに、スコアが出せるかどうかは言語の問題ではない、と思うからです。どの言語だろうと勝つ人は勝ちます。速い言語遅い言語で勝負がつくようなつまんない問題は過去一度も出されませんでした。

tagomoris.hatenablog.com

ISUCONに関して言えば、言語差はあまり関係ありません。競技プログラミングでもC++は強いけど、でもC++でないと絶対に勝てないかと言われればそうではないですよね。

ISUCON的には参考実装言語が多ければ多いほどいいと思います。その分、「あの言語なら詳しいけど、参考実装にはないから、普段使い慣れていない言語を使わざるを得なくなって、点数伸びなかった」みたいな人を減らすことができます。もちろん作るのにそれだけコストがかかる上に、その言語の実装を誰も使わない事態が起こりうるので、本家ISUCONでは参考実装される言語がメジャーな言語に絞られるのは当然のことだと思います。

しかし、ISHOCONに関して言えば、いつ始めても何時間やってもいいプロジェクトですので、いくつ参考実装があってもいいと思います。誰かが使ってくれたら嬉しいですけど、使ってくれなくても用意するだけで意味があるかなと思います。もしかしたらここからCrystalを勉強するユーザーが増えるかもしれませんしね。

というわけで、ISHOCONの参考実装を増やそう、面白そうなCrystalって言語を使ってみようってなりました。

ISHOCON1のCrystal実装の作り方

基本的にはロジックはGolang、テンプレートはERBがあるRubyを参考にしました。

ERBライクなテンプレートを使えて、ルーティングとか基本的なことをやってくれるCrystalのWebフレームワークとしてKemalを使いました。

kemalcr.com

方針としてはGolang実装を見ながら、そのままCrystalに起こしていく感じですね。関数名とか変数名とか、なんとなくCrystalっぽそうな感じに変換しながらやっていきました。僕はCrystalでWebサイトを書くのはこれが初めてなので、変換ルールとかはかなり適当です。もし気に入らないところとかあれば、プルリクとかIssueとかを大歓迎しています。

そんな感じで一気に実装していき、ベンチマークを通ればプルリクとして送ります。いくつかレビューで直す点があったので直した結果、マージされて、晴れてISHOCON1の参考実装にCrystalが加わることになりました!

今後

今後もISHOCON1に新しい言語実装を増やしてみたりしたいなーって考えてます。リクエストパラメータとかデータベースアクセスとか、AtCoderではできないような所をしっかりと学べますし(←そもそもAtCoderはそんなことを学ぶ場ではないですけどね)、何より作ってる時がとても楽しいです。

一度Crystal実装のISHOCON1を試して欲しいですし、もしもうCrystalをマスターした方なら是非「ここはCrystalの流儀だとこうする」なんか送りつけてもらえるとありがたいです。

また、参考実装を増やしてくれる人が増えたらなーって思います。色々な言語で実装されたWebサイトとか、なかなかユニークで面白いですよね。勉強にもなりますので、是非オススメします。

最後になりましたが、こんなに面白いコンテンツを作っていただいた上に、レビューまでしていただいた@showwinさんにはとても感謝しています。ありがとうございました。これからもよろしくお願いします!

github.com