# 【第5週】パRails輪読会 \(2022\-08\-22\~ 2022\-08\-26\) ###### tags: `パRails(2回目)` - [開催概要](https://hackmd.io/rOcLR0riRqmOgEF0_Ssm0A?both) - [パRails輪読会 ノートまとめ](https://hackmd.io/5emISRvRRXapmakSiHnFJg?both) ## パRailsのサンプルコード・正誤表 - [サポートページ:パーフェクトRuby on Rails【増補改訂版】:|技術評論社](https://gihyo.jp/book/2020/978-4-297-11462-6/support) - [パRails 環境構築の手順](https://hackmd.io/y7qb2BRMT2Wd4tAtKYObcQ) ## 目次 [TOC] ------ ## 2022\-08\-22(月) ### 連絡事項や確認・相談 ### タイムキーパー ### ドライバー ### 読んだところ - P.134[3-2-3 Rackミドルウェアとは]〜 ### 次回 ### 自由に使う共有スペース rackアプリのサンプルコードをのせておきます ```ruby! # app.rb class App def call(env) pp env status = 200 headers = {"Content-Type" => "text/plain"} body = ["sample"] [status, headers, body] end end ``` ```ruby! # config.ru require "rack" require_relative "app" require_relative "simple_middleware" use Rack::Runtime use SimpleMiddleware run App.new ``` ```ruby! # simple_middleware.rb class SimpleMiddleware def initialize(app) puts "*" * 50 puts "* #{self.class} initialize(app = #{ app.class })" puts "*" * 50 @app = app end def call(env) status, headers, body = @app.call(env) puts "*" * 50 puts "* #{self.class} call(body = #{body})" puts "*" * 50 return [status, headers, body] end end ``` ### 各自の疑問点や気づき、学んだこと - @maimu_x2x - Rackと仲良しになるのはまだ先のようです・・・ - わからないがわからないため、この章を読み直します - @fuwa - rackupでRailsを起動できるのはびっくり - Rackいまいちピンときてないけど、陰でいろいろ頑張ってくれてたんだなぁ - @napple29 - この1週間くらい出てなくてRackとはなんぞやという感じでした - ソースコード見に行ったらRackのmainが落ちていた - https://github.com/rack/rack - SinatraもRackで動かせるのか。。 - @Saki - Rackができることは分かってきたけど、どういう存在かやっぱりまだ朧げ...でもこの玉ねぎの層でちょっとイメージが湧きました。これがパRails曰く「おさえておくべき基本的な機能」とはおそろしい... - railsアプリで`rackup`できるの知らなかった - @paru871 - railsアプリを`rackup`で起動させることが可能。`bundle exec rackup`で9292番ポートでRailsアプリが起動する - rack難しい。。また戻ってこよう。 - @haruguchi - 途中できたのでわかったことはないんですが、なんか書いておこうという責務で書きました - https://qiita.com/nishio-dens/items/e293f15856d849d3862b - これ3回分読んだらなんだか理解できた気がする雰囲気を味わえました - hikaru - ミドルウェアの動きがあんまり理解できなかったな〜 - ミドルウェアって全部`initialize`で`app`を受け取って自分の`call`メソッドの中で`app.call(env)`してリレーしていく感じなんですかね? - Railsのデフォルトの表示までいじれてしまうというのがミドルウェアっていう別の層の存在感がして面白い - 玉ねぎの例はわかるようなわからないような... - @cafedomancer - (読んでおいてください) - Rack は `[status, headers, body]` この配列をみんな (middlware) でバケツリレーして、必要に応じて各自がチョイいじる規格のこと - WSGI の読み方はウイスキー ### 本日の振り返り(よかった点・次回に向けての改善点・今の気分などなんでもOK) - @fuwa - 就活でミドルウェアの会社を受けてお祈りされたことを思い出しました - これからアクアパッツァを作ります - @maimu_x2x - 今日は頭に???がいっぱいです。 - 仕事の要件定義レビュー会でボコボコになりました😇 - @napple29 - はるぐちさんお誕生日おめでとうございました(先週…?????) - ありがとうございました!15日でした! - サンプルコードで見すぎて実は覚えていました、、、笑 :+1: - 正規表現忘れていて悲しかった - @Saki - 明日のドライバーなんですが、あと1ページでこのアプリのお話が終わるので、その部分だけ明日tomonariさんにドライバーしていただけるとありがたいのですが、いかがでしょうか🙏 - P.140のどこまで読みましたっけ... - 図3.4を確認するところまでですー。中途半端ですみませんでした🙏 - Herokuのデプロイができなくて困ってます😂 - どうしました - @paru871 - わからないことばっかりだなぁー - Buzzcordのアンケート、24日水曜日いっぱいまでです! - アンケートのリンク👉 https://forms.gle/BjyXWf1YYALZ8Dwn6 - @harugcuhi - オブジェクト指向ってバケツリレー多い? - オブジェクト指向はどちらかというのオブジェクト内部の状態を変更することでプログラムを実現することが多いので、バケツリレーが多いのは関数型プログラミングのほうかもしれません。 - :eyes: - SQLについてわかりたい今日この頃 - わかりすぎてつらい、、、、、(共感の意味です) - SQL書き方ドリルを地道にやっています👯‍♀️ - おー、一緒です!!(昨日からやり始めた) - 駒形さんが北海道にいて、梅本さんと話したと言っていた。リモートワークで一番最強の場所はどこか?みたいな話をしたと言っていた。 - きになる! - あいましたよ - hikaru - 沖縄そばに焼酎をたらしたら美味しかったです!泡盛の代わり! - 大人だ、、、 ------ ## 2022\-08\-23(火) ### 連絡事項や確認・相談 ### タイムキーパー - ガラムマサラさん ### ドライバー - tomonariさん ### 読んだところ - P.140[3-2-6途中 先ほどはRackミドルウェア〜] ### 次回 - P.146[3-3-5 テーブルの状態を扱う] ### 自由に使う共有スペース ### 各自の疑問点や気づき、学んだこと - @maimu_x2x - db:rollbackは自分ではやったことがなかったため今日流れを見れて良かった - runnerコマンドは完全に忘れていたため、今度こそ覚えます! - @Saki - DBの作成、`RAILS_ENV=PRODUCTION`をつけないと本番環境のDBを作ってくれない - 自作サービスでやってないのでやらなきゃ... - マイグレーションファイルを消しちゃって`db:create`できなくなった話、他にも経験者がいて安心しました。供養完了🙏 - `db:seed`を複数回実行するとその分レコードが追加されてしまう。バリデーションがあれば作成されない(同じ名前の人は登録されない等) - @fuwa - db:〜コマンドはよく使うので復習しようと思いました - よく変なことしてrollbackしまくってたのですが、やり方をその都度ググってたのでこれも復習しようかなと思いました - `runner` 初めて聞いたのですが、わりと使うんですね〜 - データ投入時にエラーに気づけるように`!` をつけましょうとのことですがつけたらどうなるんだろう - - `!` がないと`nil` になるので気づかない - @paru871 - Rackはまだ戻ってきて復習する - DBは失敗したらその分知見がたまるので、いろいろ試してみるのがよいと思った。(しかしいろいろやっかいなのでマイグレーションファイルは削除しない!) - 一度実行したmigrateを取り消す際は`db:rollback`、`STEP=n`で任意の数分巻き戻すことができる - `runner`コマンド、今度こそ覚える!タトゥーに刻みます! - @garammasala29 - マイグレーションの`change`メソッド、見たことのないのもあって、ほ〜と眺めていたら司会を忘れていました - :scream::cry: - `rails runner`便利 - @haruguchi - この輪読会が始まった当初、ふーがさんがブランチ切り替える時のマイグレーションがウンタラカンタラと言っていた記憶が - ワンライナーで実行するやつはRubyなら`ruby -e "hogehoge"`` - @tomonari - !付メソッドはあまり使ったことがないので、エラー発生にすぐ気がつけるということを覚えておきたい。 ### 本日の振り返り(よかった点・次回に向けての改善点・今の気分などなんでもOK) - @maimu_x2x - 大きい生姜があったので先週シロップを作りました。砂糖が少なかったみたいで生姜感が強くて半分残ってますw - わーーい!お仲間!! - 刻み生姜も作ってみたいです👀 - @Saki - 皆さんお疲れですかね??ゆっくり休んでください〜:tea: - tomonariさん2日続けてのドライバーありがとうございました! - @fuwa - 大人のねるねるねるねというものが今度発売されるので気になってます (https://news.yahoo.co.jp/articles/110c231e7c751e2784eaf423bf80593f92b1348b) - 例の味噌汁をあっためたのでこれから食べます〜 - えっ!まじか!お大事に!:pray: - @napple29 - 元気出していきたい! - そろそろ自作サービスをリリースしま、、す、、、、(ぱたり) - :tea: - もうすぐ卒業式?:tada: - 楽しみすぎる〜〜! - @haruguchi - jQueryを滅ぼしたい! - coffee.erbを滅ぼしたい - Add testも本当にはらたつ :tea: - あれ、まだ火曜日か! - Dが一問解けました!わーい! - @tomonari   - ドライバーも少しずつ慣れてきたかも(?) - 👏 - :100::+1::+1:  - :tada: - @paru - 刻みしょうがばっかり作っていた夏でした。 - :tada: - 杏仁豆腐(食べれない) ------ ## 2022\-08\-24(水) ### 連絡事項や確認・相談 ### タイムキーパー - Saki ### ドライバー - Paruさん ### 読んだところ - P.146[3-3-5 テーブルの状態を扱う]〜 ### 次回 - P.149[3-3-6途中 書き込みと読み込みを分離する] ### 自由に使う共有スペース ### 各自の疑問点や気づき、学んだこと - @Saki - 大規模になってくると、処理が重たくなってレスポンスが遅くなるので、複数のDBを使う - haruguchiさん > 情報の種類によって分けるサービスも。機密情報を別のDBに分けたり - エンジニア的にはDB分けるのは面倒で、お金でサーバー拡張する手もある。けど1千万くらいかかるらしい...! - うちのCTOが何をしたかったかが定かじゃないので、もしかしたらもうちょっと安いかも、、、?? - `database.yml`にsubの設定を書くことで、primaryとsub2つのDBを作成することができる - subで作成するテーブルの場合、モデルの継承を`SubBase`に変える必要がある - @fuwa - DBを複数使うこともあるんだ〜って勉強になりました。応答速度が遅くなったときとかセキュリティの面で分けることがあるんですね。 - @maimu_x2x - 不可分散と聞くとサーバー移行とかを思い浮かべてしまいますが、DBを分ける方法も選択肢としてあることは知りませんでした。 - うちの会社はサーバースペックで対応しているケースしか見たことないです👀 - hikaru - 複数DBなんて世界もあるんだなあ〜〜...大規模開発をする日が来たら思い出そうと思いました - 抽象クラスとかしれっと出てきてパはやっぱりレベル高い - @garammasala29 - `bin/setup`にも`db:prepare`が利用されている - Rails6から複数のDBをサポートできるようになった。設定がいろいろある - sqliteの`.mode`コマンド - @haruguchi - `self.abstract_class = true`にするとそのクラスはデータベースとのやりとりをするんじゃなくて基底クラス?抽象クラス?になるんですね。 - DB複数かぁ。やだなぁ。脳みそ2つ欲しい。手も4つくらい欲しい。ディスプレイも大きいの複数欲しい。 - @paru - DBの負荷分散の方法、今まで考えたこともなかった!仕事になったら必要ですね。 - 複数DBを使う方法はRails6.0からRails標準機能となった - sqliteのコマンド`.mode line`はppみたいにデータを縦にきれいに並べて表示させる - @tomonari - 難しい!2つもDBがあると、スキーマはどうなるんだろう?と思いました。 ### 本日の振り返り(よかった点・次回に向けての改善点・今の気分などなんでもOK) - @maimu_x2x - 輪読会でルーティングについて勉強したのにdeviseの課題で書き方を間違えて、昨夜ハマりました😇 - @fuwa - 昨日の異臭がする味噌汁を食べましたが元気です!大勝利! - - @garammasala29 - 膝がパキパキ鳴りすぎて今日から消炎剤飲むことになりました。人生って上手くいかないですね… - :pray::pray::pray::pray::pray::pray::pray::pray::pray::pray::pray::pray::pray::pray::pray::pray::pray: - 元気出してください - 受容と傾聴!!笑 - キューブラロスだったかな… - それは忘れました笑 - 🍛 🍻 - @Saki - 自作サービスで、中間テーブルの作成の仕方がよく分からないです😂Railsはよしなにやってくれる分、応用が難しいですね! - paruさんのdatabase.ymlのコピペくださるとありがたいです🙏 - hikaru - アジャイル開発・スクラムまとめ皆さんどれくらい詳細に書きましたか?? - 今確認したら合わせて5000字くらい書いてました! - すごい!あと50倍くらい書かないとだめだ... - 3行くらいで行きましょう!簡潔に! - エッセンスを詰め込む要約力が試されますね...! - 4220字でした!! - 2660字でした〜 - 抽象クラスとインターフェースってどうちがうんでしょうか? - 抽象クラス - 多重継承できない - 実装を持てる - インタフェース - 多重継承できる - 実装を持てない (以前の Java の話。いまは持てるかも) - @haruguchi - オブジェクト指向の力量のなさが最近滲み出ている。 - @paru - 明日のプレゼンのスライド、どうしよう〜😱 - 楽しみ! - Buzzcordの利用状況アンケート、本日いっぱいまでです〜!よろしくお願いします🙏アンケートのリンク👉 https://forms.gle/BjyXWf1YYALZ8Dwn6 - @tomonari - 明日のミートアップ楽しみにしています。Paruさん頑張ってください〜 ------ ## 2022\-08\-25(木) ### 連絡事項や確認・相談 ### タイムキーパー - tomonariさん ### ドライバー - fuwaさん ### 読んだところ - P.149[3-3-6途中 書き込みと読み込みを分離する]〜 ### 次回 - P.156 [credentialsはmaster.keyやRAILS_MASTER_KEYの値が〜] ### 自由に使う共有スペース ### 各自の疑問点や気づき、学んだこと - @maimu_x2x - 書き込み用DBと読み取り用DBの部分を読んで、前は会社のシステムのDB分かれていたことを思い出しました - 同期がうまく行かなくなって統合された記憶があります。 - @haruguchi - 輪読会で現場Railsでプロダクション環境触ったり、デプロイした時はRails5系だったのでここら辺の情報が役に立った記憶ある。 - 自分は現場RailsもRails6系(当時の最新)で動かしてハマりまくった記憶が、、、 - 自作サービスで外部サービスと連携したりするときidやkeyをここに保存するので必要になってくる - @fuwa - 秘密情報管理の歴史を知ることができた(ふーんって感じですが) - 自作サービスではあまり関係ない話だとは思うけれど、仕事で昔のRailsに触れることがあれば必要な話なのかなぁ - @Saki - 開発環境だとdotenvを使えば簡単にGitHubのclient_keyとかを格納できる - が、本番環境では`.env`はGitHubで管理しない = Herokuが値を知るために何かしらの方法でセットする必要がある。難しい! - Rails7でひいひい言っていたが、昔はもっと管理が大変だったと知ってありがたみを感じた - @paru - 秘密情報の管理の歴史は、業務についたらいつか読み返すときが来そう。 - だんだん便利になっていく過程が読んでいて楽しい。 - ### 本日の振り返り(よかった点・次回に向けての改善点・今の気分などなんでもOK) - @Paru - 今晩のミートアップ卒業式、よろしくお願いします。あのー、チャットの内容ってコピーしてあとでどこかに貼り付けていただくことってできますでしょうか?多分本番だと目を通せないと思うので。。もしもできましたらよろしくお願いします🙏 - あれってフリートークに入ると消えてしまうんでしたっけ...? がんばって手元に保存してみます! - @fuwa - Paruさんご卒業おめでとうございます〜!ミートアップ頑張ってください〜たのしみです - 今日は実家が爆破される夢を見ました - 🤯🙀 - :house::bomb:😇 - @haruguchi - paruさん卒業おめでとうございます!いや〜、感慨深いですね〜 - めでたいから酒のもう:beer: - @maimu_x2x - ミートアップ楽しみにしています!! - ページを遡って読んでいたら、反応遅れました🙇🏻 - @Saki - Paruさんの卒業式楽しみです😍わいわい!! - 中間テーブルわからん...😇 ----- ## 2022\-08\-26(金) ### 連絡事項や確認・相談 ### タイムキーパー ### ドライバー ### 読んだところ - P.156 [credentialsはmaster.keyやRAILS_MASTER_KEYの値が〜] ### 次回 ### 自由に使う共有スペース ### 各自の疑問点や気づき、学んだこと - @haruguchi - Early Hints は `application.js`などのアセットを予め返しておく - H2OはWebサーバ - HTTP1.1とかHTTP2とかなどの知識が皆無! - @maimu_x2x - HTTP2は複数のリクエストを同時に送れるため速度が速い - HTTP2とearly-hintsは別物 - リバースプロキシはレスポンスを通すとか役割を担うもの - webサーバーではない - ログの見方がとても勉強になりました!! - hikaru - アーリーヒンツなるものがあるらしい。レスポンスを待っている段階で先にcssとかを読みにいくことができるらしい - H2Oっていうwebサーバーがあるらしい - リバースプロキシは機能... - @garammasala29 - Rails5.2からcredentials.yml.encとmaster.keyで秘密情報を管理 - レスポンス200okの前に103レスポンスをするEarly Hints、先にaseetを返す - H2Oはwebサーバー - LEF - `Rails.root.join('config', 'credentials', 'development.yml.enc')`で`config/credentials/development.yml.enc`のパスを指定できることが分かりました。`join`メソッドを書くことでそのあとの括弧のカンマ`,`がスラッシュ`/`の意味を持つことが分かって勉強になりました。 - [File.join (Ruby 3.1 リファレンスマニュアル)](https://docs.ruby-lang.org/ja/latest/method/File/s/join.html) - Sakiさんがターミナルに入力している際の補完ツールが気になります!👀 自動的に候補が表示されて便利そうだな~と思いました。 - `thisisunsafe`を入力した記憶が無いです……(@_@;) オレオレ証明書のときにfirefoxで取り組んだからかも?? - @fuwa - 今日は特に難しかった。。 - `Early Hints` を使うと別のリクエストを送る前にアセットが読み込めて、処理時間が短くなるという感じかな - `H2O` はwebサーバー的なものだそうだけど、クライアントとも書いてあってうーん???? ### 本日の振り返り(よかった点・次回に向けての改善点・今の気分などなんでもOK) - hikaru - 今日は難しすぎてずっと頭の上にはてなマークが出てましたね〜 - Sakiさんドライバーお疲れ様でした!!!! - maimuさんの質問が毎回素晴らしくて尊敬 - LEF - 自分も今回の内容が難しかったので、あとで復習しようと思います📝 - herokuの無料枠が無くなるらしくてショックです😨 - @fuwa - 20時からタマキさんと`first good issue` のモブプロ会やるのでよろしければ来てくださると嬉しいです〜! - 今日は小籠包がおいしかったです - @garammasala29 - Sakiさんドライバーお疲れ様でした!!!!! - 自作サービスのテスト見直し会、梅本さん、Paruさん、Sakiさんありがとうございました!!!!! - @maimu_x2x - HTTP2の通信を見れてワクワクしました👯‍♀️ - -----