rubykaigi 1日目 感想
「鉄は暑いうちに打て」ってよく言うし、忘れないうちに今日受けたセッションの感想とか思ったことを自分なりに書き残しておく。 (間違ってる!とか補足情報とかあればコメント欲しい :pray:)
Matz session
内容は大別するとパフォーマンス、Static Typing、Concurrency、あとちょっとだけ2.7や3.0の新機能の話をしてくれた。
世の中の言語進化のトレンドはStatic Typing
あまり多言語は詳しくないが、PHPだったらtype hinting
、pythonだったらtype annotation
、jsだったらtypescript
といった元々は動的型付けなプログラミング言語にも静的型付け
と同様の機能を後付で付与するリリースが頻発していて、Rubyでもそれらの導入が検討されているらしいという話。
個人的には多いに賛成だし、開発していて型を指定できる安心感を得られるな〜という気持ちになるのだけど、Matz自身は「型を指定するというのは、機会に余計な指示をしているようで、DRYではないので、正直あまり導入はしたくない」と嘆いてた。この考え方について「なるほどな〜」と思いつつ、でも実際のRubyを使う開発者サイドとしては「うーむ、それでもサポートしてくれないかな〜」という気持ちが正直なところではある。今後の動向に注目したい。
この機能をサポートする技術は色々検討はされているらしく、なんかeslint
のlineチェックを明示的に外すコメントアウトみたいに、rubyコードの右に型の指定を記述したコメントアウトみたいなのを追加するとか、rbi
ファイルみたいな別の型情報を持ったファイルを用意するとか、はたまた真新しいことをしなくてもサポートしようとしていたりとか、sorbet
or steep
とかをつかってtype checkするとか、、、、色々紹介してくれた。
(余談だけど、Matzの「テスト角の嫌いなんですよ。僕らはプログラムを書きたいわけで、テストを書きたいわけではない。でも人類は正常なプログラムを書けないので仕方なくテストを書いている。」って説明がなんか良かったし、ほっこりした。)
後は、よくテーマになるPerformanceの話
RubyコンパイラとしてJITとかMJITという言葉は聞いたことあるけど、Rubyって2.6は昔の2.0よりも実行速度が2.8倍も早くなったいたらしい。ただ、Railsなどのフレームワークをかますと何故か処理速度が遅くなってしまうらしい。。。この辺り、正直「なんで?」ってなってよくわからないのだけど、この辺りの疑問をもう少し自分たちなりに深掘りして調査してみると、実務でRailsサービスの速度を早く出来たりするのかな〜と逆に興味が湧いた。
あと、そういったコンパイラの実行速度改善以外に、パフォーマンス改善の手段として並列性(Concurrecy
)の話も出てきた(どうでもいいけど、Falcon
使ったことも触ったこともない)。
話によると、RubyはElixir
などの並列処理してもそれぞれのプロセスがデータを共有しない(Shared Nothing
)ような設計になっていないので、その問題を解決しないといけないらしかった。で、この問題を解決してくれるのがGuild
というものらしく、Goのgorouting
、Elixirのprocesss
のようにShared Nothing
を実現してくれるらしい。この辺りも今後の動向に注目したい(この話を聞いた後、スポンサーブースの同人誌コーナーにあった並列処理大全
って書籍がめっちゃ気になって買いたくなってしまった)。あと、Guild
って名前がゲーム業界から予約語として指摘されたのおもろかった。
あと、諸々気になったワードをメモ
- Deep Fronzen Object
?
Literal wwwwww- メソッドオブジェクトを取り出す???
Proc.curry
::
でメソッド呼び出しができるの知らんかった- Ruby Pattern Matching
keyword extension
あと、とにかく、RubyGemsアカウントは乗っ取られないように、2段階認証やパスワード共有禁止などして、みんなで安全な世界をRuby世界を作りましょう!って気持ちになった。
How to use OpenAPI3 for API development
実務で使えそうなお話かな〜と思い聞きに行った。そもそも知らなかったのが、Swagger
とかOpenAPI
とか名前が自分の中で混在してたのだけど、「あ、一緒なんだ」、、、という感じの僕みたいな知識レベルでもわかりやすかった。
OpenAPIなどのこういったJSONスキーマを定義しておくツール?は、あくまでjson
やyml
でリクエスト・レスポンスのルール書いて、それに基づいてフロント・バックエンド・アプリなどの多方面のプラットフォームがそれを念頭に開発するというメリット持ったルールになる。なので、これ自体が実装するプログラミング処理に直接関わるというのはちょっと違う(あんまりJSONスキーマを定義してから、開発するという経験が薄いので、改めてメリットを知れてよかった。ちなみこういったschema first development
と言ったりする)。
そして、更にそれらルールをmachine readable
にすることで、色々とメリットはある模様。そのmachine readble
なメリットを持っているのでOpenAPI3
らしい(json hyper schema
, graphq
、gRPC
なども類似としてあるけど、それぞれ違いやメリデリはある。)
OpenAPI3
は幾つかStructureがあって、紹介してたSecurity Object schema
は、Oauth2とかベーシック認証などもぱっとymlに書くだけでいいのが良かった。(別に定義したからと言って、それがすぐ使えるようになるわけではないです。)
あと、リクエスト・レスポンスの両方をRack層でvalidationしてくれるcommittee gemも紹介してもらい、スキーマ通りの実装が出来ているかどうかを担保することができるんだな〜スゲ〜、ってなった。
~あと、openapi-parserみたいなどを使えば、ymlのネストをRubyで読み込むとオブジェクトが入れ子になってて見づらい問題を解決してくれるらしい。~
あと、諸々気になったワードなどをメモ
- openapi-parser
- json schema not equal json hyper schema
- openapi-generator
- https://openapi.tools/
Pragmatic Monadic Programing in Ruby
日本語だったのに、1日目で一番「僕の知識では追いつけない...うまく咀嚼して理解できない...」と思ってしまった。有名なjokerさんのセッションだったのと、モナド
という未だによく理解していない概念を知れるきっかけになればいいと思って聞いたが、僕にはまだ早かった...。
話の流れ的には、AST実装を例に、関数型言語にある概念?の一つにあるモナド
的な動きをする処理をRubyで黒魔術を使って書いてみたという話...と解釈したけど、あってるかな...。
https://rubykaigi.org/2019/presentations/joker1007.html#apr18
とにかく、覚えて帰ったのが、「monad はある法則に基づいて動く flatMap
」
あと、諸々気になったワードなどをメモ
- Fanctor
- Applicative fanctor
- bind operator
>>=
- moand 計算チェーン??
RubyVM::AST.of
Ruby for NLP
自然言語処理でよく出るMeCabもあるけど、RubyでもNLP(Natural Language Processing
)できるやで!っていうのを形態素解析の基礎から説明してくれたセッション。大学生の時ニューラルネットワークやら自然言語処理やらをちんぷんかんぷん状態で聞いていて、まったく知識がない状態だったけど、めっちゃわかりやすい説明で良かった。最後のDemoをもっと見たかった...。
資料が挙がったら、発表の最後の方に紹介してもらった、RubyでNLPを実現するためのツール群を調べて、色々遊んでみたい!
A Bundle of Joy: Rewriting for Performance
bundle install
,bundle exec xxx
、、、bundler遅いから新しく書き直して、gel
というgem manager作ったよ!というお話だった。
実行速度を紹介してもらったが、installやらrmやら諸々のbundlerの実行コマンドがgelに置き換わっただけで、半分以上も短縮されてて、「とにかく、やばそう!!!!1」ってなった。
この辺り、どうやって実現していたのか、英語力が足りなくて悔しかった。bundler
からRubyGems
に完全移行する話も最初のセッションで柴田さんが言っていたけど、それらの動きと、このgem managerがどういった感じで関連してくるのかな〜というのも気になった。
気になるワードやらURLやら
Pattern matching - New feature in Ruby 2.7
Ruby2.7から導入されるPattern Maching
機能について。
実用面ではjsonなどを受け取って、そのjsonパターンと一致した場合に何か処理をしたり、そのjsonの一部を変数に代入したりといった使い道が紹介されていて、早く使ってみたい!という気持ちになった。
Array,Hash,Value,String,...(後なんだっけ)などの、色々なパターンがあって、リリース時に是非ドキュメントを熟読して実務で活かせたらいいな。特に、Array patternのパターンマッチが色々説明があって、より複雑なパターンのマッチを処理したいときに有効そう。ネストした配列、マッチしたパターンの一部を取得?...etcなど、すげー!ってなったけど、ドキュメントを見て改めて整理した。
ref: https://speakerdeck.com/k_tsj/pattern-matching-new-feature-in-ruby-2-dot-7
After Party 最高でした!!!!1明日も楽しみ!!!!1