Crystal と僕(2015年総まとめ)

この記事は [Crystal Advent Calendar 2015](http://www.adventar.org/calendars/800) 、 12/25 の記事であり、『なんかリリースする』という淡い夢は叶わなかった記事です。

# Crystal との1年

Crystal と僕が出会ったのが 6/7 のことで、いろいろ見ていて勉強会がしたくなったので Tweet をしたのが始まりでした（ちなみにこの時点で1行も Crystal は書いてない）

<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr"><a href="http://t.co/umxUAFWY7K">http://t.co/umxUAFWY7K</a> の勉強会したいんですけど有志いませんか</p>&mdash; ハト先生 (@rosylilly) <a href="https://twitter.com/rosylilly/status/607543840052895744">2015, 6月 7</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

当時の Crystal はまだ 0.7.2 ぐらいでしょうか？ まさに昨日、Crystal Advent Calendar の 24 日担当であり Crystal committer である @asterite が [0.10.0](http://crystal-lang.org/2015/12/23/crystal-0.10.0-released.html) をリリースしていたので、マイナーバージョンだけで3つほど進んだことになります。言語仕様もいくつか変わり、僕自身が書いたコードもいくつか Crystal に取り込まれました。

(こういう地方言語圏コミュニティにメインコミッタがふらっと現れる所も、新興言語って感じで楽しいですよね)

僕が Crystal に対して貢献できていることといえば、大きなもので二つ。 power_assert.cr と `crystal doc` でしょう。

power_assert.cr は多くのユーザーのテストの手助けになるものです。というか、もはや僕は言語を選定するときに『power_assert があるか』『ないか』を自分の習熟する言語の指標のひとつとして採用している節すらあります。中毒性が高いですね。

`crystal doc` は、こっちのほうが実は大変なんですが、案外みんなには必要とされていません。なぜかといえば、まだドキュメントが必要になるほど巨大な Crystal のライブラリがないこと。なので、これは時が経つに連れ必要とされていくものです。その時が来るまでに、更に良いものに改良しておこうと思っています。

Crystal は Ruby-like なシンタックスを持つ言語ですが、 Ruby-compatible ではありません。この認識が甘い状態で、やたらと Crystal を世に宣伝してしまったのはすこし間違いだったなと思っています。

## Crystal と Ruby で使い分ける

今、個人で書いている最も大きな Crystal のコードは Citrine といいます。

https://github.com/rosylilly/citrine

Citrine はいわゆる chef や puppet 、 ansible に itamae といった、プロビジョニングツールの下敷きとして作っています。なぜ下敷きかというと、 Citrine 単体でバイナリにすることを想定しておらず、 Citrine を require した main にレシピを書くことで、プロビジョニングを行うバイナリを生成させようとしているからです。

車輪の再発明なのは重々承知なのですが、個人的には rc.local に `curl -O ... && chmod +x ... && ./...` と1行書いておけば、起動時に最新のバイナリを落としてきて実行してくれるプロビジョニングツールが欲しかったというのが本当の所です。この辺は、ドキュメントのテンプレートまで crystal バイナリの中に埋め込んでしまう Crystal 自身の振る舞いを見て、それならプロビジョニングしたいファイルのテンプレートをプロビジョニングバイナリに埋めてもいいよな、という発想から来ています。事実、 Go などには go-bindata などの、アセットデータをバイナリに埋め込むのはわりとよくあることですから、考えてみれば当然の発想だったのかもしれません。

Citrine を Go でもなく C でもなく、あえて Crystal で書くのは、僕が Ruby 風のシンタックスでプロビジョニングレシピを書きたかった、という点が1つ。もう一つは、 Crystal で何か実用的なツールを作らないと、おもちゃあつかいで終わってしまうのではないかという危惧がもう一つです。

僕は Crystal は今でも実用的なことに使える言語だと確信していますが、標準ライブラリや周辺ライブラリの不足から、まだホビー言語として扱われている側面の方が強いだろうなと思っています。そういう時に言葉で何を言っても意味はないので、なら俺が使えるもの出してやるよ！という精神からくるものです。

本当は今日までに何かしら動くところまで持って行きたかった。無念。

とはいえ、 Rails アプリケーションを Crystal で書きなおして高速化したぜ最高！みたいなことは考えていません。僕は Rails 大好きですし、その周辺のコミュニティによるエコシステムに助けられています。要は適材適所なのです。

適材適所なのは当たり前ですが、シンタックスが似ているというのはつまり設計やソフトウェア構造を使いまわしやすいともいえます。 Ruby のクラス構造をそのまま Java や Go に持っていくことは、言語仕様上厳しいものがありますが、 Crystal へ転用するのはさほど難しくありません。逆もしかりです。

ソフトウェア設計は、想像以上に自分が普段使用する言語やフレームワークの思想を色濃く受け継ぎます。 Rails が前提な人が口に出す『モデル』と、その他の人が口に出す『モデル』にはおそらく大きな認識の隔たりがあるものです。そして、そういった Ruby 的バックグラウンドを持つ設計が適用できる、もしくは翻訳が容易であるという点も、 Crystal の大きな魅力のうちのひとつだと思っています。

## docrystal のメンテフリー化

いくつか間に合っていない所も多いのですが、 Crystal のドキュメンテーションホスティング・ジェネレーションサービスである docrystal.org は、その多くを自動化することで、僕にかかる運用コストを下げようとしています。

たとえば、個人向けのメールアドレス rosylilly@docrystal.org などのメールアドレスは docrystal.org のスタッフ全員に自動的に貸与されますが、これらは GitHub org との webhook で自動的に発行されます。

```
+------------------------+   +-----------------------+   +-------------------+
|                        |   |                       |   |                   |
| GitHub                 |   | Heroku                |   | Mailgun           |
| Organization Web Hooks +---> Webhook Receiveer App +---> Mail Forward Rule |
|                        |   |                       |   |                   |
+------------------------+   +-----------------------+   +-------------------+
```

GitHub にはユーザーの Primary Mail address が入っているので、そのアドレスへメールが転送できるように設定。また、そのユーザーが各 GitHub org/team のどれに所属しているかで、 team 毎の ML(Mailgun 管理) へ自動登録されるようになっています。なので、特定の Team へ連絡がとりたいときは Team 名の ML へメールするだけでいいわけですね。

info@docrystal.org などの外部連絡受付用 ML も、そのようにして運用されています。

監視などの連絡受付先、外部とのやり取り用に、いまだメールアドレスの管理は大切です。正直、知らない人からメールが来た時にそのドメインが @gmail.com か、 @yahoo.co.jp か、それともちゃんとそのサービスのドメインのメールアドレスであるかで、かなり対応は変わります。

ですから、そのメールアドレスを発行忘れてたとか ML 入れ忘れてたとか無いように、こういう形で自動管理しています。今は Mailgun 管理ですが、そのうち Google Apps 用のこれらのスクリプトも用意しようかなと考えているところです。

# なんか話が発散してきたので閑話休題

![](https://pbs.twimg.com/profile_images/567285191169687553/7kg_TF4l.jpeg)

コーヒーブレーク

# これからの日本語圏 Crystal コミュニティ

@pine613 と始めた Crystal-jp ですが、今ではすっかり人も増え、Slack には総勢 60 名を超えるメンバーが加入している状況です。しかもその Slack が死んでおらず、ちゃんと Crystal の話題でなんかしら毎日話しているわけですから、かなりサイコーです。みんなありがとう！愛してるよ！

また、日本人だけが Crystal-jp に居るわけではありません。こういったダイバーシティのごちゃごちゃ感も新興言語コミュニティならではです。英語は苦手なんだけど……という人は是非 Crystal-jp の Slack へ来てみてください。あなたが想像を絶するほどどうでも良い会話が繰り広げられていますよ。

[Crystal-jp はこちら](http://crystal.connpass.com/)

また、僕と eBook Japan で主催するもくもクリスタルというもくもく会も、毎週木曜日に eBook Japan オフィスにて開催しています。次の開催は年明け 1/7 ですし、せっかくですからみんなで七草粥の出るお店に晩ごはんを食べに出かけて、七草粥と Crystal と洒落こむのもいいかもしれません。

[もくもクリスタル 1/7 のページはこちら](http://connpass.com/event/24654/)

大きな勉強会でがっつり話を聞きたい！という場合は、1/22 にクックパッドで開催される東京 Crystal 勉強会 #3 へお越しください。 #2 の様子も CodeIQ さんで記事にしていただけましたから、参考にご一読していただければと思います。

[1/22 の東京 Crystal 勉強会 #3 はこちら](http://crystal.connpass.com/event/22754/)
[東京 Crystal 勉強会 #2 のレポートはこちら](https://codeiq.jp/magazine/2015/10/31516/)

1/22 の勉強会はまだ LT 枠も余っています。もしなにか LT をしてくれたら、僕はとっても嬉しいです。

Crystal-jp の Slack は、まぁなんか部室みたいな感じで暇な人が暇な時にだらだら喋ってる感じになるといいなーと思っていたんですが、僕が何もしなくても @pine613 が頑張ってくれたおかげで、だいたいそんな感しになって、本当によかったなと思っています。

来年も楽しく Crystal をいじっていけたらなと思っていますし、未だに Crystal 本体の方に出した Improve docs の PR およびブランチでみんなを待たせているので、そっちも頑張っていくつもりです。来年くらいには『いいドキュメンテーションブラウザの作り方』とかで何か話せるようになっているといいですね ;P

ということで、今年もお疲れ様でした。来年もよろしくお願いします。メリークリスマス！

# 露　骨　な　宣　伝

Crystal-jp では、Crystal に興味のある人、ない人、あるようでない少しある人を歓迎しています。もし気になったらぜひ [Crystal-jp](http://crystal.connpass.com/) から勉強会や Slack へお越しください。

また、もくもクリスタルの会場提供を行っている eBook Japan では新たにエンジニアの採用も行っています。もくもく会で見学に来るもよしなので、興味があればぜひ @rosylilly までご連絡ください。

また、2016年4月から自分がメイン講師として開始するプログラマーズハイレベルハイスクールというプログラマ養成のためのスクールのアシスタント講師も絶賛募集中です。興味があれば是非[こちら](https://progres05.jposting.net/pgdwango/u/job.phtml?job_code=1084)からご連絡ください。ちなみに GitHub にある問題は僕が作りました(なお、 Crystal を授業で扱う予定はありません。あしからず)。

あともう一個！もう一個だけ！！

自分が CTO を務めるマグネットでも、絶賛求人中です。 Crystal で仕事したい！という気概のある方は是非ご連絡ください。真剣に話を聞きますが、賛成するとはまだ言ってないからな。興味が湧いたら[こちら](http://www.mgnt-inc.jp/jobs)からご応募ください。なお、マグネットはリモートワークのため、東京都内在住である必要はありません。

以上、この宣伝が僕からのクリスマスプレゼントだ！ごめん！ほんと Citrine 間に合わなくてごめん！！！来年もよろしくな！！！