【第6週】パRails輪読会🚂 (2023-09-25~ 2023-09-29)

tags: パRails🚂

目次


2023-09-25(月)

ファシリ

@shodan

ドライバー

@hiromisugie

読んだところ

3−1−8 126p 「Rails 6.0で追加された並列テスト」から、
3−2−2 133p 終わりまで。
PR: https://github.com/hiromisugie/Perfect_Ruby_on_Rails_Ch3/pull/5

次回

3-2-3 134p 「Rackミドルウェアとは」から。🚂

学んだこと・感想

  • @sharoa

    • テストを高速に実行するための並列実行がおこなるようになった。(Rails6.0から。)デフォルトでは並列化していてテストを実行するようになっている。意識せずとも並列化の恩恵を受けることができる。
    • 目の前で実行結果の違いを見れて良かったです。
    • Rackについて。Webアプリケーションのサーバとフレームワーク間のインターフェイスを共通化した仕様であり実装となっているライブラリのこと。
    • 非常にシンプルなインターフェイスを定義している、Rackに対応するアプリケーションやフレームワークはこの規約に則ったインターフェイスを定義する必要がある。
    • 簡単なRackアプリケーションとして、こちらも実行結果が確認できて良かった。
  • @shodan

    • Rails6.0からデフォルトで並列テストが実行されるようになった。
    • test/test_helper.rbの設定で並列度を変更したりできる。テストのデバッグで使ったり?することもあるようなので頭に入れておく。
    • RackはフレームワークとWebアプリケーションサーバを仲介してくれる存在。
    • git commit --amendはタイポのお助けとしてしか見れてなかったので、覚えておきます&gitもっとちゃんと理解します……。
    • 久しぶりだったので緊張しました🫠また改めてよろしくおねがいします〜。
  • @sadanora

    • Rails6.0からデフォルトで並列テストになった。
      • 並列テストは、複数のテストをプロセスやスレッドごとに並列実行できるので高速。(デフォルトはプロセス)
      • 並列テストを実行する際は、DBも並列度にあわせて複数用意される。
    • Rack
      • WebアプリケーションサーバーとWebアプリケーションフレームワークの間のインターフェイスを共通化した仕様であり実装
      • これがなかったときは、アプリケーションサーバーとWebアプリケーションフレームワークが密結合していて大変だったらしい
        • RailsならWebアプリケーションサーバーは〇〇、みたいにそれぞれの選択に融通がききにくかったのを、Rackが間を取り持つことで柔軟に選べるようになった、みたいなこと
  • @moegi29

    • Rails6から並列テストがデフォルトになった。テストが落ちるときとか挙動を確認したいときに直列実行したりする。実際にparallelize(workers: 1)の値を変えてみたりしてよくわかった。
    • Rackが登場してWebアプリサーバとフレームワークの間のインターフェースを共通化したライブラリの組み合わせを柔軟に選択できるようになった。Unicorn,Merb,WEBrickとかよく知らなかったので調べてみたいです~
    • git commit --amendでコミットメッセージの修正もできる!
  • @motohiro-mm

    • テストを並列で行うとテストが高速で実行される
      • test_helper.rbpalallelize(workers: )のところで設定できる
        • :number_of_processorsはCPUの数で並列実行する指定
        • 1にすると直列でテストを実行できる
    • RackはWebアプリケーションサーバとWebアプリケーションフレームワーク間のインターフェイスを共通化した仕様であり実装となっているライブラリ
      • WEbアプリケーションサーバ:UnicornやPumaなど
    • Rackアプリケーションは自分で定義できる
    • Rackがまだ理解が微妙なので後でもう一度読みたいと思います
  • @hiromisugie

    • 並列テストについて。ふむふむという感じだったけど、PCのプロセッサ数に応じた並列テストができるということや、並列テストで何かうまくいかない場合に1列にしてみる、といった方法があるらしい?並列の度合いを変えて実際に結果の秒数が変わるのを確認できて楽しかった。
    • 唐突にRackが出てきてよくわからなかった…。もう少し調べてみないとなと思った。
    • git commit --amendで1つ前のコミットをいじれる。例えば1つ前のコミットに別の作業を含めたい場合は、何かしら変更を加えたのちに改めてgit add .して、git commit --amendでvimが開くのでそのまま保存すると、最後のaddが1つ前のコミットに含まれる。あとはコミットメッセージをタイポしてしまった時とかに修正もできる、らしい。gitスキルをもっと付けなければ…。

2023-09-26(火)

ファシリ

@sharoa

ドライバー

@hiromisugie

読んだところ

3-2-3 134p 「Rackミドルウェアとは」から
3-2-5 「RailsとRackの関係」まで。
PR:

次回

3-2-6 139p 「自作のRackミドルウェアをRailsに追加していよう。」から。🚂

学んだこと・感想

  • @sharoa

    • 昨日からやってるRackが曲者ですw
    • Rackにはアプリケーションサーバとアプリケーションの間に処理を追加するミドルウェアという機構が備わっている。
    • 自分でもRackミドルウェアが作れる
    • 玉ねぎの図も難しい。
    • ただ、最後のrackupだけでrailsが立ち上がるのには感動した。
  • @sadanora

    • ミドルウェア
      • Appサーバーとアプリケーションの間に処理を追加する機構。Rackにもこれが備わっていてRackミドルウェアという。
    • Rackミドルウェア
      • Rackミドルウェアがinitializeで受け取る引数は、後続のアプリケーションのオブジェクト。自分のcallオブジェクトが呼ばれるとinitializeで受け取ったオブジェクトのcallメソッドを呼ぶ、みたいな感じで処理が続いていく。
    • Railsがrackupで起動するのに感動
    • RailsもRackを利用してAppサーバーとアプリの間に色々やりたい処理を追加(たまねぎの層を追加)してるのかな???って思いました。
      • ActiveRecordとか、見覚えのあるクラスの名前がいろいろあった
    • Rack、むずかしくない???
  • @moegi29

    • ミドルウェアはアプリサーバーとアプリの間に処理を追加する機能
    • useメソッドでミドルウェアオブジェクトを指定する
    • ミドルウェアはいろいろあって、便利なミドルウェアを集めた別リポジトリもある
    • 唐突に出てきた玉ねぎの図、いまいちわからない。
  • @hiromisugie

    • Rack、引き続き難しい、、、
    • タマネギの図はさっぱりわからないけど、ミドルウェア単位で「何らかの機能追加」みたいなことを足していけるのかなと思ったりした。明日、RubyRUBYに変換するだけのミドルウェアを作るというのがあるようなので、そこでも理解を深めたい。
    • Rackミドルウェアについてはよくわからなかったが、rackupコマンドでRailsを立ち上げることができたのは楽しかったし、RailsがRackアプリケーションであるということを体感出来て良かったです。
  • @motohiro-mm

    • Rackミドルウェア:アプリケーションサーバとアプリケーションの間に処理を追加する機構
      • サーバからリクエストを受けるとミドルウェアを経由してアプリケーションに到達し、アプリケーションからレスポンスデータを受け取るとさらにミドルウェアを経由してサーバに到達する(合ってるか不安)
    • Railsでもいつものrails serverではなくrackupで9292ポートにつなげることができる

2023-09-27(水)

ファシリ

@motohiro-mm

ドライバー

@hiromisugie

読んだところ

3-2-6 139p 「自作のRackミドルウェアをRailsに追加していよう。」から
3-3-2 「テーブルの定義を反映させる」まで。
PR:

次回

3-3-3 144p 「スキーマファイルの取り扱い」から。🚂

学んだこと・感想

  • @sharoa

    • 自分のプラクティスがRailsに入ったので、出てくる単語が少しずつわかってきて、うれしいです。(感想✨)
    • 自作のRackミドルウェアをRailsに追加できる。config.middleware.useを使う。
    • 目の前で変化が確認できたのがよかった。
    • 他にも、config.middleware.insert_after ~insert_before ~delete がある。
    • railsコマンドは覚える(前にも言ったかも。)
    • マイグレーションファイル内で利用できる専用のメソッド、up,down,changeの3つがある。むずい。
  • @sadanora

    • Rackがふわっとおわった。
      • config/environments内の環境ごとの設定ファイルや、config/application.rbから呼び出すことで自分で書いたミドルウェアを使える
      • config.middleware.useなどconfigオブジェクトを通じて追加したり削除したり、呼び出す順番を指定したりできる
    • migrateの状態が良くわからなくなって怖かったですが、migrationファイルは、changeしか使っているところをみたことがなかったのでupdownを試せたのはよかったです。
  • @moegi29

    • Rackミドルウェアを追加するとき常に使用したい場合はconfig/application.rb内、develop環境でのみ使う場合はconfig/environments/development.rbに追加する。
    • 通常のuseメソッド、既存ミドルウェアの最後に追加される。順序変えたりもできる。
    • DB操作は極力しないようにしていたのでいろんな操作を見れて勉強になりました。
  • @motohiro-mm

    • 自作のミドルウェアをRailsに追加するには、/libにミドルウェアディレクトリ、その中にファイルを作成して、それを/config/envinronmentsのファイルにrequireすると使える。
    • Rackミドルウェアのメソッドには4つある
    • Rails_ENV=productionをつけてdb:createするとproduction環境のデータベースが作れる
  • @hiromisugie

    • RackミドルウェアでRubyの表示をRUBYに変えるというのを試して面白かった。
    • 自作のミドルウェアを既存のミドルウェア群のどの順番に差し込むかと言うのを設定できる。
      • 例えばinsert_after 引数1, 引数2で、引数1のミドルウエアの直後に引数2のミドルウェアを差し込む、など。
    • db:xxxのタスクは半分くらいは使ったこともないだけど、ふむふむという感じで確認しました。
    • db:migrateで、マイグレーションファイルに記載されているテーブル定義を反映させる。
    • マイグレーションファイル内の設定でchangeメソッド以外にupdownメソッドがあるが、まだちゃんと理解できていない…。基本的にはchangeを使い、db:migrateで反映、db:rollbackで戻す、というのをまず使いこなしたいと思った。

2023-09-28(木)

ファシリ

@motohiro-mm

ドライバー

@hiromisugie

読んだところ

3-3-3 144p 「スキーマファイルの取り扱い」から
3-3-6 「複数DBを扱う」まで。
PR:

次回

3-4 152p 「秘密情報を管理する」から。🚂

学んだこと・感想

  • @sharoa

    • RailsではDBの構成をdb/schema.rbとして残している。
    • db:migrateなどを実行したときに作成されるものだけど、このファイルに書き出される内容はマイグレーションファイルではなく、DBに定義されている内容を反映したもの。
    • schema.rbを読み込むことで、マイグレーションを実行することなく現在のDB環境を作成することもできる。
    • db:seedの使い方。
    • db/seeds.rbを実行してデータを読み込む。ActiveRecordのコードを直接書くことができるから、簡単にデータの投入を行うことができる。
    • 複数DBを扱うところは再度よみます。
  • @moegi29

    • bin/rails runner "p Blog.count"のようにrunnerを使えばわざわざコンソールを開かなくて良いのが便利。
    • 特定のモデルを特定のDBへ接続させたい場合はestablish_connectionを利用する、rails dbタスクはreplica:trueで制御できる。
    • 複数DBへ接続する場合のいろいろを学んだ ちゃんと整理して理解したい。
  • @shodan

    • db:setupを実行した時に参照されるのはマイグレーションファイルではなくスキーマファイルと、db/seeds.rb(あらかじめ用意しておいた、投入したいデータ群)。
    • db:prepareを使うと、DBがあればマイグレーション、なければdb:setupを行う。
    • 複数DBを使ったり、読み込み・書き込み専用のDBを分けて作ったりできる。その場合はモデルの方にも、処理の際にどのDBに所属・問い合わせるをするのかを明示したりするような設定が必要。
    • 感想:まさにパーフェクトRuby on Railsって感じですね😇
    • connect_toではなくconnects_toが正そう? https://api.rubyonrails.org/classes/ActiveRecord/ConnectionHandling.html#method-i-connects_to
  • @hiromisugie

    • schema.rbにはマイグレーションファイルではなくDBに定義されている内容が反映されているということを初めて知った。マイグレーションファイルの内容だと思っていた。。。
    • rails runnerは任意のスクリプトを実行できる。rails cせずにDBに入ってるかどうかを確認したりできるので便利。
    • Rails6.0から複数DBに対応している。それまでは専用のgemを使う必要があったらしい。
    • 書き込み用DB、読み込み用DBに分けるというのがよくある構成。そういえばそういうのは聞いたことがある気がするが、実際の仕組みをおぼろげながら見ることができて良かった。
    • 感想:今読んでいる章、まだ3章目でしかも「押さえておきたいRailsの基本機能」というタイトルなのに今まで見たことも使ったこともない機能がたくさん出てきて、Railsの奥深さを感じています。。。😇
  • @motohiro-mm

    • bin/rails runner "〜"で任意のスクリプトを実行できる
    • スキーマファイルはテーブル定義を反映したもの
    • シードファイルはデータを書いておくとbin/rails db:seedでデータを読み込んでくれる
    • 複数のDBを扱うことができる
      • DBの応対速度を上げるため
        • 例えば、書き込み専用と読み取り専用にする

2023-09-29(金)

ファシリ

@motohiro-mm

ドライバー

@hiromisugie

読んだところ

3-4 152p 「秘密情報を管理する」から
3-4-6 「Rails 6.0(credentialsの拡張)まで。
PR:

次回

3-5 159p 「HTTPとRailsアプリケーション」から。🚂

学んだこと・感想

  • @sharoa

    • 今日は全体的に「ふむふむ」の感じでした。というかなんだか難しかった。
    • Railsにおける秘密情報の取扱の歴史はこんな感じだったんだな~と頭の片隅においておきます。
  • @shodan

    • 現場Railsでこの辺やったはずなんですが、正直ふわ〜っと進めていたので全然まっさらな状態で読むことになりました😅(しかも現場RailsはRails5)
    • config/master.keyがないとそもそも秘密情報の参照・編集はできない。rails newした段階でmaster.keyは発行されるが、第三者がこれを使って秘密情報にアクセスしてはいけないので、自動的にgitignoreに追加してくれる。
  • @sadanora

    • credentials
      • 環境変数ごとに値を切り替えない
      • credentilasの登場人物
        • credentials.yml.enc
          • 暗号化した設定ファイル
        • master.key
        • RAILS_MASTER_KEY
          • master.keyの値を環境変数経由で受け渡す場合の環境変数名
    • credentailsの扱いがよくわからなくて、自作サービスではdotenv-railsというgemに頼りました。
  • @moegi29

    • Rails4.0では秘密情報の文字列を安全に管理する標準的な方法がなかった~Rails6.0でcredentialsの機能が拡張されるまでの変遷を知れた
    • masterkeyはrails newしたひとのローカル環境でしか見れない、EDITOR="vi"を前につけるとcredentials:showをvimで編集できるようになる
    • DHHが43歳ということに衝撃をうけました
  • @motohiro-mm

    • Railsの秘密情報の管理の歴史がなんとなくわかりました
    • credentials:master.keyを使って情報を暗号化・復号化している、master.keyは情報と別に保存されていて共有されない
    • 今現場Railsでちょうどcredentialsの話のところが出たので、どちらも見ながら復習したいと思います。
  • @hiromisugie

    • 秘密情報を管理する方法はRailsの歴史とともに移り変わっているとのことで、Rails4からの変遷を見ることができた。
    • ほぼわからず、「ふむふむ」という感じでした…。まず「秘密情報」がピンときていないが、クラウド環境へ接続するためのトークンやアプリケーションで固定の値として利用している外部に見せてはいけない秘密の文字列のこと。(ユーザーのパスワードとかかなと思ったけど、ちょっと違うっぽい)
    • vimの使い方を完全に忘れている。iで入力モード、escでそれを解除し、:wqで保存して閉じる。これくらいは覚えておかないと…。
    • ここから宣伝です💬 10/27・28開催のKaigi on Rails 2023 のお手伝いしています、チケットの残りが少なくなってきたので迷われている方は是非!先日タイムテーブルも公開されました。フィヨブー卒業生が6人ほど登壇するようです。おすすめはフィヨブー卒業生3人組によるライブコーディングです!(オンライン鑑賞は無料、現地参加は割と良いお値段です😇)
      https://kaigionrails.org/2023/talks/tebiki/
  • @ayu-0505
      - Railsチュートリアル上でRAILS_MASTER_KEYをよく理解せぬままチュートリアルに沿って使っていたのですが、理由がわかってよかったです。


Select a repo