ガジェット通信

見たことのないものを見に行こう

実践的なテーマの発表も増えた「東京Crystal勉強会」第3回の様子をレポート!

DATE:
  • ガジェット通信を≫

東京 Crystal 勉強会 #3 in 恵比寿

この「東京 Crystal 勉強会」は、日本のCrystalユーザーコミュニティであるCrystal-JPが主催している勉強会です。まだ発足して1年足らずのコミュニティですが、定期的に勉強会を開催しており、今回は1月22日に開催されたその第3回の様子をレポートします。

前回の第2回勉強会もこちらの記事でレポートしているので、ぜひ合わせてご覧ください。

今回は、運営メンバーの草野 (rosylilly) さんが所属する恵比寿のクックパッド株式会社さんでの開催となりました。会場が有名なキッチン&ラウンジということで、「一度ここに来てみたかった」という方も多くいらっしゃったようです。

勉強会は、まず最初に2つのトークセッションがあって、それから3名の方によるLTという流れで進行しました。これからその内容を紹介していきます。

Crystalで実際のウェブサービスは作れるのか?

まずはCrystal-JP主催者でもあるpine613さんが登壇します。「Crystal で実際のウェブサービスは作れるのか?」というタイトルの発表で、実際にCrystalを使ってWebサービスを構築し、運用していることについて話をしてくれました。

最初の発表者ということもあり、実際に作ったWebサービスの話をする前に、簡単に現在のCrystalを取り巻く状況についての説明です。

コンパイラの全面的な書き直し

v1.0のリリースに向けて、Crystalのコンパイラを全面的に書き直すという大規模な改革が進められています。これは、「コンパイル速度が遅い」といったいくつかの問題を解決するためのものです。

現状のCrystalのコンパイラは、グローバルにソースコードを解析することで変数などの型を判別するというユニークなアプローチをとっており、それによって型を制約することなく柔軟なプログラミングができるようになっているのですが、一方で、そのことが原因でコンパイルに長い時間がかかったり、REPLの開発ができないという難点もありました。

そこで、型の明示的な制約をある程度プログラマーに課すことで、プログラムの効率的な解析を可能にし、上記の難点を解決するという方針で進められています。これは、v1.0では必ず実用的なプログラミング言語にしたい、という意志の現れだと感じます。

デファクトを目指したWAFの出現

WAF (Web Application Framework) にもデファクトスタンダードとなる可能性を秘めたフレームワークが登場してきたようです。KemalとFrostというのがそれで、それぞれSinatraとRuby on RailsにインスパイアされたWAFとなっています。

やはり、現代のプログラミング言語において、優れたWAFの存在は最も気になる点の1つとなるでしょう。CrystalはHTTPリクエストの処理で非常に良好なベンチマークを記録しているので、その実行速度を活かせるWAFの登場はとても嬉しいニュースだと思います。

これから紹介するWebサービスは、上記したKemalを利用して構築したそうです。また、もう一方のFrostについては、この次に登壇するetmnkさんが紹介してくれます。

依存ライブラリを可視化する「Shards Rocks」

pine613さんがCrystalで構築したのは「Shards Rocks」というWebサービスで、プロジェクトの依存ライブラリを解析して可視化するサービスです。

既存の類似サービスとしてGemnasiumなどがありますが、そのCrystal版と言えば、ご存知の方はどういったサービスなのかすぐに理解できるのではないでしょうか。

Shards Rocksのシステム構成

Shards Rocksのシステムは以下の構成で構築されているそうです。

また、これを実現するためのCrystalのライブラリとして、

WAF: Kemal
MySQL: crystal-mysql
Redis: crystal-redis

を利用しているとのことでした。

そして、実際にこれらの構成でサービスを開発した感想として以下をあげられていました。

Kemalは非常に高速で実用的なWAFである半面、まだORMやSessionのサポートがされていないため、構築できるサービスの幅には制限があること
crystal-mysqlはまだ開発途上でバグも多く、型安全でないなどの難点があること
crystal-redisは非常に完成度が高く、大きな問題もなく利用できること
バックグラウンドワーカーのライブラリがまだ存在しないこと (Shards RocksではGoで実装)

現状のCrystalの実用性は?

最後に、実際にWebサービスを構築した経験から、「現状のCrystalの実用性」についてのまとめがありました。その内容によると、Crystalの言語それ自体や、Shardsというパッケージ管理システムは安心して利用できるように改善されており、実運用の可能性が現実的に見えてきた段階であるとのことです。

しかし一方で、ライブラリの完成度や、かゆいところに手の届く実装や機能はまだまだこれからだ、との課題をあげられていました。

このように、実際に具体的なサービスを開発してみてはじめて気がつく利点や欠点も非常に多いと思います。まだまだ世界的に見てもこういった事例は少ないので、とても貴重なお話を聞くことができました!

Crystal版のRails、その名も「Frost」

続いてはetmnkさんによるセッションです。「CrystalでもRailsを使いたいですか?」というタイトルで、Crystal版のRuby on RailsといえるFrostについて、実際に使ってみたときの経験を話してくれました。

pine613さんの発表にもあったように、FrostはKemalと並んでCrystalのデファクトスタンダートとなる可能性を持ったWAFとして受け入れられています。

もちろんCrystalのWAFは他にも存在しますが、Crystal自体のバージョンアップのスピードが非常に速く、中には破壊的な仕様変更も多く含まれることから、最新バージョンのCrystalにも追従して動作するものとなると、現時点ではやはりKamelかFrostというのが現実的な選択肢となるでしょう。

ただ、それでもFrostもまだ生まれたばかりのフレームワークであり、バージョンも0.2.0でしかないので、動作させるまでに色々と苦労されたことも多かったようです。

Oh…いきなりプロジェクト生成できない…?

FrostではRailsと同じように new というコマンドラインのオプションを使ってプロジェクト雛形を生成する機能があります。ただ、いきなりそこでエラーが発生したとのこと…

これはCrystal本体のテンプレート言語の問題だったようで、一旦はこの問題を解決するパッチが提供されており解決したようですが、やはりまだ若いフレームワークで利用者も多くないことから、こうしたバグに出会ってしまうことも少なくないようです。

ただ、Frostの作者はCrystal本体のコラボレーターでもあるので、こういった場合に比較的素早く対応できるというのは安心できる材料の1つだと感じます。

生成されるプロジェクトの雛形

無事にプロジェクトが生成されると、以下のディレクトリ構成で雛形が構築されます。

Railsを使ったことがある人であれば、それぞれのディレクトリやファイルがどういった役目を持つものなのか、一目見ただけで理解できるのではないでしょうか。

それほどFrostのプロジェクトのレイアウトはRailsと似ています。Rubyユーザーから注目度の高いCrystalのWAFにおいて、このわかりやすさは大きな魅力になると思います。

データベースの操作はどこまでできる?

対応するデータベースがPostgreSQLだけだったり、まだ機能的に十分でない点があるとしながらも、Frostからデータベースを扱うときには、Railsで慣れ親しんだActive Record的なインターフェースでの操作がある程度可能になっているようです。

これは現段階ではFrostだけが持つ優位性と言えるのではないでしょうか。

バグを見つけらた俺が直す、ぐらいの勢いが必要

etmnkさんはその他にも実際にデモを見せてくれながら、Frostについて説明してくれました。

少しでも変わった使い方をするとエラーになるなど、現時点でFrostを使うには「バグを見つけたら自分で直す」ぐらいの態度が求められるそうで、今のところはより安定しているKemalを利用した方が無難であると考えているそうです。マイクロフレームワーク指向のKemalと比べて、フルスタックなFrostは開発の困難さにも大きな違いがあるのかもしれません。

ただ一方で、Frostも全体的な枠組みは完成しつつあるとのことなので、今後の発展に期待が膨らみますね!

(Yet Another Way to) Contributing to Crystal

後半のLTで最初に登壇したのはLinda_ppさん。「Contributing to Crystal」というタイトルで、独特な視点から見たCrystalへの貢献について、自身の経験を交じえて話してくれました。

これまでにいくつかの機能をCrystalに実装したり、また、VimのCrystalプラグインを開発したりといった形でもCrystalに貢献されているそうです。

そんなLinda_ppさんは、まだCrystalは「Production Ready」には早いと考えており、その理由として、破壊的な変更が数多く取り込まれていることをあげられていました。

しかし、破壊的な変更であっても、それがCrystalをより良くするものであれば抵抗なく積極的に取り込まれる今の状況というのが、自分のように言語処理系の開発に興味がある人間にとっては非常に魅力的である、という意見を述べられました。

確かに、一度安定版としてリリースされた後では、API互換性を破壊する修正を加えるのは非常に難しくなってしまうでしょう。また、Crystalはコンパイラのコードが読みやすく、GitHubのプルリクエストをベースに誰でも提案していけることも、言語処理系への貢献のしやすさとしてあげられていました。

どうしてもハードルが高く感じてしまうプログラミング言語処理系そのものへの貢献ですが、このLTを聞いて「自分もまずASTから見てみよう!」と感じた方がきっといたのではないかと思います。

Crystalを学習してこんなところが印象的だった!

次のLTはstefafafanさんによる「Crystal学習の際に印象に残った点」です。Crystalを実際に学習してみて、その中で印象に残った点について紹介してくれました。

まず、Crystalには標準で以下のような便利なコマンドが搭載されているところが印象的だったそうです。

確かに、クラス階層の表示コマンドやフォーマット用のコマンド、そしてドキュメント生成ツールなども最初から組み込まれているので、特にそのためのライブラリを探す必要もなく、すぐに利用を開始できるところがCrystalの大きな特徴だと感じます。

また、C言語で書かれたライブラリを使いたいときに、簡単にバインディングを用意することができる点も印象的だったと話してくれました。

C言語のバインディングの書きやすさもまたCrystalの魅力の1つですね。crystal_libというC言語バインディングの自動ジェネレータがあることからも、その容易さを伺い知ることができるのではないでしょうか。

勉強会に参加された方の中には、まだCrystalに触ったことがない人も多くいらっしゃるようでしたので、このように、実際に学習してみてそのポイントを紹介してくれるのは嬉しいですね!

CrystalでRubyの拡張は書けるのか?

最後は、この記事の執筆者でもある若杉 (5t111111) による「Rubyの拡張をCrystalで書いてみる」というLTです。

Rubyでは、特に速度が求められる処理の実装や既存のライブラリを使いたいときにC言語で拡張ライブラリを書くことができます。また、stefafafanさんのLTにもあったように、Crystalではとても簡単にC言語のバインディングを作ることができます。

それならばCrystalでRubyの拡張を作るのも難しくないはず、ということで実際に簡単な拡張ライブラリを作りました。そして、例えばフィボナッチ数列の関数のベンチマークをとってみると…

期待通り、Rubyでそのまま実装したものと比較してかなり高速な結果となりました。

ただ、シンプルにRubyのC APIのバインディングとして使うと、せっかくのCrystalの表現力が活かせなかったり、マクロや関数ポインタに対するバインディングを用意するのが大変であるなど、決して嬉しいことばかりではなく、このまま実用するのは少し難しいという印象でした。

しかし、実は公式のリポジトリ上に、Crystalのマクロを活用した (そして実際に最低限動作する) Ruby拡張のコンセプトコードが公開されています。

このように、Crystalは公式自らがRubyの拡張という用途に対して積極的であることもあり、もしこういったコンセプトが進化して自然な形でのRuby拡張の記述が実現したら、よく似た文法という利点を最大限に活用することのできる、最高のRuby拡張言語としてのあり方も期待できると考えています。

次回へ向けて

前回に引き続きバラエティに富んだ内容で、様々な人がCrystalに期待を抱き、そして、それぞれ異なった方法でCrystalに関わり貢献していることを知ることができたとても充実した勉強会でした。

しかしながら、何人もの方がトークやLTの中で触れていたように、v1.0のリリースというのは決して順風満帆に実現できるものではないようです。

そこではコンパイラの全面的な書き直しという根本的で非常に大規模な改革もありますし、今日のプログラミング言語において特に重要視される並行性についても、まだまだ多くの課題が残っている状況です。

リリースまでの開発が長引いてしまえば、もしかしたら資金的にもこれまで通りのペースでの開発が難しくなるかもしれません。

ただ、あるプログラミング言語に対してこういった意識を持って接することができて、新バージョンのリリースに大いに盛り上がることができるのも、まだ情報もほとんどない手探りの状態から関わっているからこそだと実感します。

v1.0がリリースされるまではしばらく大きなニュースもなさそうなので、次回の勉強会は少し間を置いて5ヶ月後くらいの開催を予定していますが、「それまでにv1.0が出たらお祝いも兼ねてすぐ開催しよう!」ということに決定したので、興味のある方はぜひCrystalの日本語公式サイトを訪れてみて、そして次回の勉強会にご参加ください!

最後になりますが、記事中に掲載した写真はすべて参加者のyucao24hoursさんに撮影していただいたものです。素敵な写真をありがとうございました!


若杉 洋文
都内を中心に活動するフリーランスのエンジニア。ハンドルネームは5t111111で、何と読むのか聞かれますが自分でもわかっていません。Rubyが好き。

Twitter: @5t111111
Blog: http://fiveteesixone.lackland.io

カテゴリー : デジタル・IT タグ :
CodeIQ MAGAZINEの記事一覧をみる ▶
  • 誤字を発見した方はこちらからご連絡ください。
  • ガジェット通信編集部への情報提供はこちらから
  • 記事内の筆者見解は明示のない限りガジェット通信を代表するものではありません。

TOP