Ruby

表参道.rb #34 行ってきた

お勉強会レポ。 メモだけど 少し整理して、スライドとかもまとめたので、公開。

ハッシュタグ #omotesandorb
参加者さんも多く、サプライズゲストもいたので盛り上がりました。

テーマ

いつもはデプロイとかテストとか、なんらかの緩めのテーマがあり、
それに沿ったLT会をやって、時間があまれば質疑応答、って流れです。

今回はテーマが「Rubyに関することならなんでもあり」でした

人数

25人くらい。最近盛況ですね。

場所

外苑前徒歩0分。すげー立地の会社でした。
オープンスペースで勉強会やってたんだけど
後ろが壁一面本棚でした! ビジネス系起業系だらけ。
下手な本屋さんより充実している可能性。

Matzがいた

びっくり。

会場提供の会社の顧問をやってるらしく、
今回サプライズゲストで参加されたのだとか。

ぼくが生でMatzのお話聞くのは初めてでした。
エンジニアらしい情熱と、ユーモアさがある親しみやすそうなお方でしたね。
あんまり話できなかったですが。

DSLホストのお話

発表者:Matz
スライド:(公開していらしたら誰か教えて下さい)

DSL=ドメイン特化言語

-外部DSL(ホストと違う言語、SQLとか正規表現)
-内部DSL(ホストの文法を濫用(らんよう)したもの)
JSON(JavaScript Object Notation) Rakefile Gemspec RSpec

アプリケーションを開発することは、DSLの開発をするのとほぼ同意

by 達人プログラマーの人

  • 文法
    • 括弧を省略できるとか
  • 語彙
    • メソッド
  • スコープ
    • describe "test" do ~ end
    • ネストできるのは結構偉大なこと。

なんでできるか?
中でinstance_execする
するとselfが変わる
インスタンス変数@varが変わる

濫(らん)用できる

抽象度を高くできるとうれしい。
Rubyはやりすぎ?

ちょうどいい点を探すのは難しい。
えいやでやってみないと分からない。

ソフトウェア開発において、たのしいは正義

(正義!)

RubyのAST(抽象構文木)入門

発表者:神速さん
スライド:https://qiita.com/sinsoku/items/d112d7eee4283a38f70e

Rubyがコードを解釈する順番みたいな?
Ripperで分解できるよ

実務で役立つASTとしては

Rubocopに新しいルールを拡張するのがオススメ!
(Rubocopが静的解析するときも、このASTを使ってるのか、なるほど、って当たり前か)

誤検知の話。
Rubocopはメソッド名しかみてないので継承関係みてない。

型推論の夢

(Java使いとしては面白いなーと思った。いちいち型書かなくてもいいのが
こういう言語のいいところじゃん!それをわざわざ逆いくのかー。
でもまあ、静的解析が誤検知するのはアレだし、型書いても書かなくてもいい、
って形が実現できるならありかも。一方Java10は逆にvar採用したりしてる。
「ガチガチの型言語」vs「スーパーフリーダム言語」ではなく、
中間のちょうどいい型推論の模索が今アツいのかな?)

仕様かバグかわからんRubyをなおす

発表者:うなすけさん(@yu_suke1994)
スライド:https://github.com/unasuke/omotesandorb-34

CASHを作ってる会社の人。

AST見たい

ruby hoge.rb --dump=parsetree だと見れるけど

ruby test.rb --dump=parsetree は見れない

なんでだろう。いろいろ調べてるとMatzによる贅沢なレビューが始まる(笑)

答え 「仕様」 by Matz

コマンドラインの問題で ruby test.rb --dump=parsetree
で--dump=parsetreeオプションはtest.rbに渡っちゃう。

正解

ruby --dump=parsetree test.rb

E2EのテストをRSpecとCapybaraでやっちゃうプロトタイプ

発表者:@mokuoさん
スライド:https://speakerdeck.com/mokuo/e2e-prototype-capybara

ColdFusion

  • 自動テスト一切なし
  • 毎回手動テスト
  • つらみ(わかる)

・リーダーも課題感あった(うちには課題感ないです)

ページをクラスに見立てる

(Seleniumも練習したいんだけどなー)

GraphQLを使ってみたお話

1ページ複数のリクエスト

1ページ1APIでやればいいのでは?
(きつくね?)

APIエンドポイントが増えてつらい(やっぱり)

そこでGraphQLです

Facebookががんばってるらしい。

フロント側でどういう表示をするかを定義できる。

APIに対してのクエリ言語の1つ
(要はネストでAPI叩けるってこと?)

グラフ理論

一筆書きが可能か?
最短経路とか?
(セールス巡回問題とか?)

Rubyでの書き方

field

edgesとnode

N+1問題が起きやすい?

まだ実用的でない?

(Facebookは1ページに何十とAPIリクなげたりしてそう。認証だけですごそう。
コレの恩恵がでかいのかも。
一方で、Rails使いはマイクロサービス指向なので、そんなにメリットないかも。わかんないけど。)

byebugにプルリク出した話

発表者:@tzm_freedomさん
スライド:https://www.slideshare.net/tzm_freedom/cbyebugpr

デバッグどうやってる?
byebug派か RubyMine派か?

Ruby2.5で Rails5.2から入ってるbootsnapを使うと
RubyVM::なんとかでTracePointのコールバックが効いてない説

名前空間区切ってるんだからバッティングしないはず。

byebug全部読んでみた(すごい)

後半ついていけずorz
結論から言うと、debaseが外部呼び出し可能extern宣言?してたから
byebugとかぶってしまったのが悪かった?

解決策はバッティングした名前を変更プルリクした。無事マージされた。

Matz「debaseの書き方の方がちょっとお行儀悪いかも」

オチ

byebugオーナー「あーdebaseからforkしたんだよね :)」

Rails on Docker

発表者:@bigplantさん
スライド:https://speakerdeck.com/bigplants/rails-on-docker

OpsDevとかの話

無限ステージングの夢

空気を吸うようにデプロイしたい
(お、おう?)

ビルドは1秒でも早い方がいい
(せやな)

ビルド高速化Tips

  • Gemfileなどに変更がない場合はスキップできるよう先にCOPYする技 キャッシュが効くように順番とか気をつける。

まず必要なものを全部入れる
そしていらないのを削除する

1.5Gから500MB! これはでかい。

  • docker history で どこが容量食ってるか分かる

(あんまりやりすぎると変なバグ出そう)

  • docker buildではenv渡せない
    (API_KEYを生で書いたりするからかな?)

  • ARGで書く

  • assestがネックになる?ならない?

(自分、ビルド以降の話ぜんぜん知らないんだなあと感じた)

懇親会

Matzのナッツ食べながらRubyの話とかしてました。
楽しくて終電逃しそうになったけど間に合いました。

会場提供してくださったビジネスバンクさんありがとう。