Crystal 勉強会#6を開催しました!
2018/06/21 に行われた Crystal 勉強会が大変楽しかったのでレポートです。
目次
開催経緯
きっかけは下記の記事です。
「Crystalの身近な採用事例が欲しい!」とずっと思っていたのですが、rubykaigi前日にこの記事が公開され、とても興奮しました。rubykaigiに向かう新幹線の中で、記事執筆者の @y2_k2mt さんに「お話をお聞きしたいです!」とメンションを送ったのが始まりです。
@y2_k2mt はじめまして。 https://t.co/gpRUd1eI91 こちらの記事を拝見させていただきました。Crystalの採用事例として非常に興味があります。ぜひどこかでお話お聞きしたいです!(もしよろしければDM等でやり取りさせていただければと思います 🙏
— at_grandpa (@at_grandpa) May 30, 2018
その後のやり取りを経て、DMM.comさん側でも何かしらのアウトプットをお考えだったと知り、あれよあれよと企画まで進みました。
今回の #crystaljp なんといってもhttps://t.co/IdRudDAdgyラボの記事公開から開催までの流れがぐっと来ましたね。こういうスピード感はほんと見ていても最高に気持ちが良い
— WAKASUGI 5T111111 (@5t111111) June 21, 2018
最終的に30名近くお集まりいただき、LT枠も埋まり、お開きが22:30過ぎと大変盛り上がりました。発表してくださった皆さん、参加してくださった皆さん、本当にありがとうございました。
全体の流れ
イベントの構成は、始めに DMM.comさんの採用事例の発表、次にLT枠、あとは懇親会という形です。できるだけゆるーい会にしたかったので、始まる前から「お酒飲んで行きましょう〜」とゆるい雰囲気を出していきました。そのほうが自分も緊張しないので。
#crystaljp 勉強会に潜入したなう
— kazto (@bainarian) June 21, 2018
さっそくビール飲んでる #crystaljp
— もふもふ (@mofumofu3n) June 21, 2018
始まる前からお酒をいただいてる ^^;
— n.siena (@n_siena) June 21, 2018
そして、はじまるー!#crystaljp
voyageさんいただきます!!!!! #crystaljp https://t.co/bp3llNwqWi pic.twitter.com/dF5kEVrGzN
— Yuki Minamiya (@yuki3738) June 21, 2018
始めにピザ寿司スポンサー枠として弊社の紹介時間を少し頂いたあと、早速採用事例のお話に移りました。
Crystal in production
始めは @y2_k2mt さんによる発表です。タイトルは「Crystal in production」。強い。
Crystal in production ...なんて強い響きだ。。 #crystaljp
— ucd msky (@msky026) June 21, 2018
Crystal in production だと!! #crystaljp
— at_grandpa (@at_grandpa) June 21, 2018
Ruby経験者が多いことや厳しいパフォーマンスが求められることを考慮し、いろんな言語を検討した結果、 Crystal が非常にマッチしていると説明されていました。
暗号通貨なシステム
— n.siena (@n_siena) June 21, 2018
→処理性能じゅーよー
→golangやってみたけどつらい
→Scalaは関数型の壁が
→nose.jsはコードベースが大きい
→CrystalならRubyの文法に近くて速い!#crystaljp
また、ライブラリについても言及されており、「このあたりはプロダクションで経験しないとわからないよなぁ」と思いました。
Kemal 重いのか #crystaljp
— WAKASUGI 5T111111 (@5t111111) June 21, 2018
the fastest な https://t.co/PY1PjGJb30 が出てきた!!! #crystaljp
— WAKASUGI 5T111111 (@5t111111) June 21, 2018
https://t.co/EJ804jyaWG #crystaljp
— at_grandpa (@at_grandpa) June 21, 2018
個人的に気になっていたのは「v1.0に至っていないのに採用したのはなぜか」でした。当日は運営でいろいろバタバタしていたので直接お聞きするのを忘れてしまいました。しかし発表を振り返ってみると、開発スピードやパフォーマンスが求められたこと、ライブラリも徐々に充実してきていること、v1.0に至っていないとはいえ十分に使用できる段階まできているという判断、などが積み重なって採用に至ったのだと思います。
メジャーな言語は「今回のシステムだと◯◯言語か△△言語かな」と候補に挙がりやすいですが、Crystal はまだその段階に至っていません。しかし、今回の事例を踏まえると「Crystalが採用される領域はある」ということがわかってきました。こうして徐々に認知されていくことでさらに採用事例が増え、Crystalの使用領域が理解され始め、技術選定の候補に挙がってくるのだと思います。今まさにその出発点にいるようでわくわくしています。
DMM.comさんの二人目の発表は @fukaoi さんです。Crystalの開発周りについてお話してくださいました。
vscode + vscode-crystal-lang + Scry で書いてる #crystaljp
— かるぱねるら (@karupanerura) June 21, 2018
vscode,vscode-crystal-lang, scry一緒だ!#crystaljp
— もふもふ (@mofumofu3n) June 21, 2018
atom + ide-crystal + language-crystal-actual で動かしてます。 #crystaljp
— 今城 (@imajou) June 21, 2018
エディタの話の他、ライブラリに苦しめられてモンキーパッチをあてた話などもありました。
こうやってRubyと同じ感覚でオープンクラスしてモンキーパッチできるのはいいよね #crystaljp
— WAKASUGI 5T111111 (@5t111111) June 21, 2018
他には、shards 周りの話もありました。
#crystaljp shard.yml の path: 便利そう
— S-YOU (@__s_you) June 21, 2018
shard.yml の path しらなかった。 #crystaljp
— at_grandpa (@at_grandpa) June 21, 2018
この shard.ymlの path
は初めて知りました。以下のような形で shard.yml を書くと、ローカルマシン上のそのpathからライブラリを取ってきてくれます。
dependencies: kemal: path: /path/to/kemal
ライブラリにモンキーパッチをあてて検証するときなど、とても便利ですね。自分は fork して 修正して push して branch
指定でダウンロードをしていたので辛かったんですよね。これで開発がかなり楽になります。まさに勉強会だ。。。!
その他、知らなかったツールの話やライブラリの話が豊富で、参加者の皆さんも大変勉強になった様子でした。
Crystal Playなんてあるのか #crystaljp
— もふもふ (@mofumofu3n) June 21, 2018
crystal play ...初めて知った。。 #crystaljp
— ucd msky (@msky026) June 21, 2018
さっきJSONの話聞いてて思ったけど、0.25.0だと JSON::Serializable 使うからJSON::Mapping とかももう使わないほうがやりやすい?共存するものなのかな https://t.co/90bm0sSGcw #crystaljp
— WAKASUGI 5T111111 (@5t111111) June 21, 2018
crystal lang の静的解析ツールamebahttps://t.co/5ys3o9A5ed
— Yuki Minamiya (@yuki3738) June 21, 2018
#crystaljp
やはり、プロダクションで開発を行っているからこそわかる部分があるのだなと思いました。個人開発ではぶち当たることのない「壁」の存在を感じました。そのお話を聞けたのはとても貴重でした。
発表してくださった @y2_k2mt さん、@fukaoi さん、貴重なお話をありがとうございました!
いや〜貴重な話だった…!!!! #crystaljp
— WAKASUGI 5T111111 (@5t111111) June 21, 2018
LT
さて、ピザと寿司が振る舞われたあとはLTです。今回は5枠全て埋まりました。早速いきましょうー。
Crystalでツールを作ってみた
トップバッターは @mofumofu3n さんです。「さっきまで沖縄にいました」との言葉から始まったLT。タイトなスケジュールでのご参加ありがとうございます。
内容は「reveal.jsを簡単に使えるようにするCrystal製ライブラリ」を作ったお話です。
CLIツールであり、Markdownファイルを指定してコマンドを実行するとWebサーバーが立ち上がり、すぐにプレゼンを始められるというものでした。便利そうですねこれ。
発表ではハマったポイントも話されていました。ぜひ資料をご覧ください。
Crystalに再びRailsの夢を見る Amber編
続いては @msky026 さんです。Rails風フレームワークの Amber の紹介です。認証周りからRouter、ORM、belongs_to
を使ったRelationship、migrationなど、実際のコードを混じえて紹介してくださいました。「想像以上に多機能」「これはいけるかもしれない」とのことでした。とはいえ、まだ少しのエラーがあるようで、「バグをみつけたら俺が直す、の気持ち」と力強い言葉で締めくくられています。
Macroについて
3番目は自分でした。Macroについて話しました。
コード例を多用したせいで文字が小さくなり、後ろの席の方には申し訳ありませんでした。公開された資料のみでわかるように作ったので、気になる方は上記資料をご覧ください。
事例の紹介として、自分の作ったライブラリも紹介しました。
スターをいただけたり「使ってみます」とのお声をいただけたりして、とても嬉しかったですね。
Rubyのライブラリを移植した話
4番目は @TobiasGSmollett さんです。(すみません。資料を見つけられなかったので見出しのタイトルは正しくありません 🙇)
Rubyのライブラリ「TimeCop」の Crystal 版を作成したお話でした。
「時間を止めてやりたいな、って思って」 #crystaljp
— さっき作った (@make_now_just) June 21, 2018
RubyのTimeCopがどのように作られているかを説明されたあと、Crystal 移植の辛い部分を話してくださいました。
TimeCop誰も作ってなかったら作ろかなと思ってたら、@TobiasGSmollett san が作ってた。。 #crystaljp #crystallang
— ucd msky (@msky026) June 21, 2018
Rubyのライブラリを移植するツラミ、https://t.co/vj0gPbYq9d
— ucd msky (@msky026) June 21, 2018
作ってるときに全く同じ思いをした。。 #crystaljp #crystallang
TimeCopの勉強になる #crystaljp
— WAKASUGI 5T111111 (@5t111111) June 21, 2018
移植に挫折した悪い例です https://t.co/FUaVomnCMn #crystaljp
— WAKASUGI 5T111111 (@5t111111) June 21, 2018
移植に取り組むことで Ruby のライブラリの知識も深まるとおっしゃっていました。なるほどなーと思ったのと同時に、増えてきたとはいえライブラリの数はまだまだRubyに追いつかないので、自作するチャンスはあるなと思いました。ブルーオーシャン!
Exhaustiveness Check in Crystal
最後は @make_now_just さんです。
Crystal界隈では "Patch Monster" として知られている方です。
今回の話は「厳密なチェック」に関するお話でした。少しだけ抜粋すると、以下のコードの場合、現状だと普通に通ってしまいます。(コードは資料中から引用させていただきました)
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があるが、変数の中身を取れない
- ちょっとつらそう?
- 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 の話はとても盛り上がりました。
昨日の #crystaljp の一番最後に、「heredoc、0.25.0 で変わりましたよね?」から、みんなで画面見つつ検証していったあの感じ、「うわーほんまや!」「へぇー!」というあの雰囲気。あれを自然に頻発していきたい。
— at_grandpa (@at_grandpa) June 22, 2018
このときはほんと面白くて、ぜひこういう雰囲気を増やしていきたいですね。
今後の勉強会
Crystal 勉強会、とても楽しいのでまたやりたいです。どういう形式が良いかは模索中です。
勉強会、コストを抑えて頻度を上げたいなー。
— at_grandpa (@at_grandpa) June 22, 2018
・ネタがなくても参加できる気軽なもの
・むしろ、参加したらネタが生まれる
・主催者側も会場提供のみくらい
まぁ、もくもく会に近そう。ここで技術書典の執筆してもいいし、OSS書いてもいいし。
とはいえ、たまにガッツリ企画もやると良さそう。
「もくもく会」だともくもくしてそうだけど、そのイメージとはちょっと違うなー。「懇親会」というわけでもない。rubykaigiのコード懇親会が近いけど、もうちょっとゆるい感じがいい。「これってなんですか?」を気軽に隣の人に聞ける雰囲気。LTしたい人は勝手にやっちゃってok。OSS発足してもよし。
— at_grandpa (@at_grandpa) June 22, 2018
障壁になっているのはなんだろうなーと考えると、何か見えてきそうなんだよなー。ちょっと深く考えてみよう。
— at_grandpa (@at_grandpa) June 22, 2018
やっぱり、プログラミングの話をしているのでコードを書きたくなるんですよね。何らかのいい形を見つけられたらなと思ってます。
最後に
Crystal、徐々に盛り上がってきているんじゃないかなーと思います(かなりバイアスかかってますが 🙏)。
また、この勉強会のTweetに、Crystal の contributor である @sdogruyol さんも反応されてました。
ええ。だれ?
— Serdar Dogruyol セド (@sdogruyol) June 21, 2018
すごい!
— Serdar Dogruyol セド (@sdogruyol) June 21, 2018
さらにその日、Matzも Crystal についてTweetされていましたね。
いやー、crystal の 主張は「Duck typing なんて要らんかったんや」ですから、アレでいいのでは。主張が正しければ。 https://t.co/wZSpyCOi6i
— Yukihiro Matsumoto (@yukihiro_matz) June 21, 2018
今後も、もっと盛り上がっていったら良いなーと思いました。とはいえこうして Crystal に触れていくことで足りない部分も見えてきますし、「絶対Crystalっしょ!!!!!!」と押し付けることもなんか違うなーと思うので、Crystal をもっと知り、界隈を楽しみつつ、技術を磨いていこうと思います。
また何かイベントやりましょう!楽しい!
あと、主催側の Crystal 勢力が弱く、運営がバタバタしていてすみませんでした 🙇 机の移動やピザ寿司配置、最後の後片付けまで手伝っていただきありがとうございました。みなさんあたたかい。。。
また開催したいので、参加したことがある方も、次が初めてだという方も、お気軽にご参加ください。ゆるーく、そして熱く、Crystalについて語りましょう!