圧倒亭グランパのブログ

30年後の自分にもわかるように書くブログ

Crystal 勉強会#6を開催しました!

2018/06/21 に行われた Crystal 勉強会が大変楽しかったのでレポートです。

crystal.connpass.com

 

目次

 

開催経緯

きっかけは下記の記事です。

inside.dmm.com

「Crystalの身近な採用事例が欲しい!」とずっと思っていたのですが、rubykaigi前日にこの記事が公開され、とても興奮しました。rubykaigiに向かう新幹線の中で、記事執筆者の @y2_k2mt さんに「お話をお聞きしたいです!」とメンションを送ったのが始まりです。

その後のやり取りを経て、DMM.comさん側でも何かしらのアウトプットをお考えだったと知り、あれよあれよと企画まで進みました。

最終的に30名近くお集まりいただき、LT枠も埋まり、お開きが22:30過ぎと大変盛り上がりました。発表してくださった皆さん、参加してくださった皆さん、本当にありがとうございました。

 

全体の流れ

イベントの構成は、始めに DMM.comさんの採用事例の発表、次にLT枠、あとは懇親会という形です。できるだけゆるーい会にしたかったので、始まる前から「お酒飲んで行きましょう〜」とゆるい雰囲気を出していきました。そのほうが自分も緊張しないので。

始めにピザ寿司スポンサー枠として弊社の紹介時間を少し頂いたあと、早速採用事例のお話に移りました。

 

Crystal in production

始めは @y2_k2mt さんによる発表です。タイトルは「Crystal in production」。強い。

Ruby経験者が多いことや厳しいパフォーマンスが求められることを考慮し、いろんな言語を検討した結果、 Crystal が非常にマッチしていると説明されていました。

また、ライブラリについても言及されており、「このあたりはプロダクションで経験しないとわからないよなぁ」と思いました。

個人的に気になっていたのは「v1.0に至っていないのに採用したのはなぜか」でした。当日は運営でいろいろバタバタしていたので直接お聞きするのを忘れてしまいました。しかし発表を振り返ってみると、開発スピードやパフォーマンスが求められたこと、ライブラリも徐々に充実してきていること、v1.0に至っていないとはいえ十分に使用できる段階まできているという判断、などが積み重なって採用に至ったのだと思います。

メジャーな言語は「今回のシステムだと◯◯言語か△△言語かな」と候補に挙がりやすいですが、Crystal はまだその段階に至っていません。しかし、今回の事例を踏まえると「Crystalが採用される領域はある」ということがわかってきました。こうして徐々に認知されていくことでさらに採用事例が増え、Crystalの使用領域が理解され始め、技術選定の候補に挙がってくるのだと思います。今まさにその出発点にいるようでわくわくしています。

 

DMM.comさんの二人目の発表は @fukaoi さんです。Crystalの開発周りについてお話してくださいました。

エディタの話の他、ライブラリに苦しめられてモンキーパッチをあてた話などもありました。

他には、shards 周りの話もありました。

この shard.ymlの path は初めて知りました。以下のような形で shard.yml を書くと、ローカルマシン上のそのpathからライブラリを取ってきてくれます。

dependencies:
  kemal:
    path: /path/to/kemal

ライブラリにモンキーパッチをあてて検証するときなど、とても便利ですね。自分は fork して 修正して push して branch 指定でダウンロードをしていたので辛かったんですよね。これで開発がかなり楽になります。まさに勉強会だ。。。!

その他、知らなかったツールの話やライブラリの話が豊富で、参加者の皆さんも大変勉強になった様子でした。

やはり、プロダクションで開発を行っているからこそわかる部分があるのだなと思いました。個人開発ではぶち当たることのない「壁」の存在を感じました。そのお話を聞けたのはとても貴重でした。

発表してくださった @y2_k2mt さん、@fukaoi さん、貴重なお話をありがとうございました!

 

LT

さて、ピザと寿司が振る舞われたあとはLTです。今回は5枠全て埋まりました。早速いきましょうー。

Crystalでツールを作ってみた

speakerdeck.com

トップバッターは @mofumofu3n さんです。「さっきまで沖縄にいました」との言葉から始まったLT。タイトなスケジュールでのご参加ありがとうございます。

内容は「reveal.jsを簡単に使えるようにするCrystal製ライブラリ」を作ったお話です。

github.com

CLIツールであり、Markdownファイルを指定してコマンドを実行するとWebサーバーが立ち上がり、すぐにプレゼンを始められるというものでした。便利そうですねこれ。

発表ではハマったポイントも話されていました。ぜひ資料をご覧ください。

Crystalに再びRailsの夢を見る Amber編

speakerdeck.com

続いては @msky026 さんです。RailsフレームワークAmber の紹介です。認証周りからRouter、ORM、belongs_toを使ったRelationship、migrationなど、実際のコードを混じえて紹介してくださいました。「想像以上に多機能」「これはいけるかもしれない」とのことでした。とはいえ、まだ少しのエラーがあるようで、「バグをみつけたら俺が直す、の気持ち」と力強い言葉で締めくくられています。

Macroについて

3番目は自分でした。Macroについて話しました。

speakerdeck.com

コード例を多用したせいで文字が小さくなり、後ろの席の方には申し訳ありませんでした。公開された資料のみでわかるように作ったので、気になる方は上記資料をご覧ください。

事例の紹介として、自分の作ったライブラリも紹介しました。

github.com

スターをいただけたり「使ってみます」とのお声をいただけたりして、とても嬉しかったですね。

Rubyのライブラリを移植した話

4番目は @TobiasGSmollett さんです。(すみません。資料を見つけられなかったので見出しのタイトルは正しくありません 🙇)

Rubyのライブラリ「TimeCop」の Crystal 版を作成したお話でした。

github.com

RubyのTimeCopがどのように作られているかを説明されたあと、Crystal 移植の辛い部分を話してくださいました。

移植に取り組むことで Ruby のライブラリの知識も深まるとおっしゃっていました。なるほどなーと思ったのと同時に、増えてきたとはいえライブラリの数はまだまだRubyに追いつかないので、自作するチャンスはあるなと思いました。ブルーオーシャン

Exhaustiveness Check in Crystal

最後は @make_now_just さんです。

www.dropbox.com

Crystal界隈では "Patch Monster" として知られている方です。

qiita.com

今回の話は「厳密なチェック」に関するお話でした。少しだけ抜粋すると、以下のコードの場合、現状だと普通に通ってしまいます。(コードは資料中から引用させていただきました)

enum Color
  Red
  Green
  Blue
end

color = Color::Red

case color
when .red?  then puts "Chinatsu Akasaki "
when .blue? then puts "Aoi Yuki"
end

しかし、Color には Green も存在するので when .green? then ~ もあるべきだ、なければエラーにしよう、というお話です。しかし、この修正に対して「mergeは難しいと思います」とおっしゃっていました。その理由も書かれているので、ぜひ資料をご覧ください。

 

以上、5本のLTの紹介でした。大変盛り上がり、その後の懇親会のネタも豊富になっていました。

懇親会

ピザと寿司をつまみつつ、缶ビールやチューハイを片手に Crystal について語り合う。椅子があるにもかかわらず、みなさん立ちながら熱心にお話されていました。ざっと話したことを箇条書きでメモします。

  • Crystal のデバッグ方法はあるんだろうか
    • lldbやgdbがあるが、変数の中身を取れない
      • ちょっとつらそう?
  • 公式のプロファイリングツールとか欲しいかも
  • previous_def
    • ひとつのクラス内で同一名のメソッドを定義した場合、後者のメソッドから前者のメソッドを呼べる
    • super は親クラスの同一名メソッドを呼ぶが、 previous_def は同一クラスで先に定義されたメソッドを呼ぶ
  • 技術書典、今回もCrystal本出しましょう
    • 新たな執筆者募集
  • 0.25.0での heredoc について
    • 下記参照

0.25.0での heredoc について "Patch Monster" の @make_now_just さんも混じえて話しました。以下のコードは、0.24.2では通ります。

h = {
  heredoc: <<-HEREDOC
  ヒアドキュメントです
  HEREDOC,
  string: "文字列です",
  char:   'c',
}

p h
$ crystal src/heredoc.cr
{heredoc: "ヒアドキュメントです", string: "文字列です", char: 'c'}

0.25.0では通りません。

$ crystal src/heredoc.cr
Syntax error in src/heredoc.cr:10: Unterminated heredoc: can't find "HEREDOC" anywhere before the end of file

以下のようにすると 0.25.0 で通ります。

h = {
  heredoc: <<-HEREDOC,
  ヒアドキュメントです
  HEREDOC
  string: "文字列です",
  char:   'c',
}

p h
$ crystal src/heredoc.cr
{heredoc: "ヒアドキュメントです", string: "文字列です", char: 'c'}

実は、HEREDOC, の位置が、4行目から2行目に移動しています。

--- src/heredoc_0_24_2.cr
+++ src/heredoc_0_25_0.cr
@@ -1,7 +1,7 @@
 h = {
-  heredoc: <<-HEREDOC
+  heredoc: <<-HEREDOC,
   ヒアドキュメントです
-  HEREDOC,
+  HEREDOC
   string: "文字列です",
   char:   'c',
 }

これは、0.25.0 からマルチヒアドキュメントが実装されたからでした。

h = {
  heredoc1: <<-HEREDOC1, heredoc2: <<-HEREDOC2,
  ヒアドキュメント1です
  HEREDOC1
  ヒアドキュメント2です
  HEREDOC2
  string: "文字列です",
}

p h
$ crystal src/multi_heredoc.cr
{heredoc1: "ヒアドキュメント1です", heredoc2: "ヒアドキュメント2です", string: "文字列です"}

CHANGE_LOGをもっと見ないとなー。

この heredoc の話はとても盛り上がりました。

このときはほんと面白くて、ぜひこういう雰囲気を増やしていきたいですね。

 

今後の勉強会

Crystal 勉強会、とても楽しいのでまたやりたいです。どういう形式が良いかは模索中です。

やっぱり、プログラミングの話をしているのでコードを書きたくなるんですよね。何らかのいい形を見つけられたらなと思ってます。

 

最後に

Crystal、徐々に盛り上がってきているんじゃないかなーと思います(かなりバイアスかかってますが 🙏)。

また、この勉強会のTweetに、Crystal の contributor である @sdogruyol さんも反応されてました。

さらにその日、Matzも Crystal についてTweetされていましたね。

今後も、もっと盛り上がっていったら良いなーと思いました。とはいえこうして Crystal に触れていくことで足りない部分も見えてきますし、「絶対Crystalっしょ!!!!!!」と押し付けることもなんか違うなーと思うので、Crystal をもっと知り、界隈を楽しみつつ、技術を磨いていこうと思います。

また何かイベントやりましょう!楽しい!

 

あと、主催側の Crystal 勢力が弱く、運営がバタバタしていてすみませんでした 🙇 机の移動やピザ寿司配置、最後の後片付けまで手伝っていただきありがとうございました。みなさんあたたかい。。。

また開催したいので、参加したことがある方も、次が初めてだという方も、お気軽にご参加ください。ゆるーく、そして熱く、Crystalについて語りましょう!