# パRails
開始 7:30 ~ 8:30
---
[技術面談対策用HackMD](https://hackmd.io/@j6EwuLTbTKGpps8BsMbWMQ/ByU7hOvpt)
---
### 1/19
- Node.js
[Qiita](https://qiita.com/non_cal/items/a8fee0b7ad96e67713eb)
・サーバサイドのJavaScript実行環境
JSはブラウザ上でのみ動ける→Node.jsがあることでRailsにアクセスできる?
nodeenv 14.5以降だと新しいJSが
以前だと旧版のJS
裏側で動けるようになる
- Node.jsはなぜ必要?
- JavaScriptsはWeb上(ブラウザ上、クライアントサイド)で動かすための言語
- Node.jsとはJavaScriptsをローカル上で動くようにするためのソフトウェア
- Node.jsを使うと、JavaScriptをRubyやPhytonみたいにサーバーサイド言語として使えるようになる
- npm(NodePackageManager)とはrubyでいうbundlerのようなもの、バージョン管理ツール
- rails sでローカルが起動した時にサーバー立ち上げ(rackとかミドルウェアも含んで)とwebpackerが自動で走ってくれていたりしてる?
- パッケージとは、JavaScriptのプラグインやモジュールのこと
- Yarn&npm
Rubyでいうgemみたいなイメージ[Qiita](https://qiita.com/non_cal/items/a8fee0b7ad96e67713eb)
Yarnは改良版でfacebook発でnpmより新しい
- Docker
仮想環境 コンテナ
Dockerにはファイルのようなものがあり、そこに環境?を書き込んでおくと いつでもその環境を再現できる。その環境で誰もが実行できるようになる、仮想だからこそ高速
- `gem install rails`を使うことでrailsコマンドが使える
### 1/20 22p~
- bundle exec
bundle installされてるgem のバージョンをつかうよーって宣言
- rdefs
参考記事
[rdefs🤔](https://rochefort.hatenablog.com/entry/20110511/p1)
`gem install rdefs`してから相対パスで使用
`$ rdefs app/controllers/articles_controller.rb`など…
class module def の宣言名がバーっとでてくる。宣言名のみしかでてこない!Vimmerがさらさらっと確認してそう
- Coc
基本的ないわゆるCRUD?の構造など、予めの規約に従うことで構成に注力しなくてよい。
- REST
URL/URI+httpメソッドで何がしたいかが明確にわかること
---
---
☆技術面接
・リクエスト/レスポンスを Railsアプリから画面表示されるまでの流れおしえて
・ログイン機能を クッキー セッション使ってせつめいして
・コールバックってなに?
→コールバック関数・・・関数のなかに関数があるやつ
https://wa3.i-3-i.info/word12295.html
→Railsガイドのコールバック
https://railsguides.jp/active_record_callbacks.html
イベントを補足できるもの?たとえばcreate前とか後とか
あらゆるタイミングを指定できるメソッド
---
### ・deleteとdestroyのちがいは?
https://railsguides.jp/association_basics.html#dependent
**delete**・・・最小限。SQLを直接打ってるようなもの、指定のデータ1つのみを削除
**destroy**・・・Activerecordを介して削除する、関連付けられたモデルも削除
#### dependentオプションの種類:
`:destroy`、`:delete`、`:destroy_async`、`:nullify`
- `:destroy` 関連したやつ全部消える 無理心中
- `:delete`(has_manyだと:delete_all?) SQL操作のみてきな挙動。関連したやつ消えない。指定したやつのみが消える みなしご親の名前はのこる
- `:destroy_async` 非同期で削除する 何か色々手順あるっぽいけど、めちゃくちゃ削除処理が重い時はこれ使うのを検討すれば良いとかじゃないかな(たにさん)
:nullify 指定されたモデルは消え、関連しているモデルの外部キーにNULLがはいる(NOTNULL制約ついてるとROLLBACKする) みなしご 親の記憶は抹消される
https://dorarep.page/articles/rails-dependent
https://railsguides.jp/association_basics.html#has-one%E3%81%AE%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3-dependent
https://qiita.com/takayuu276/items/b86ac6b620d2b15c0164
>ex.
>**親モデル** `parent has_many :children`
>**子モデル** `child belongs_to :parent`
親オブジェクト(id: 1, name:いずみ)
子オブジェクト(id: 1, name:肉しゃん, parent_id: 1)
があったとする
>**☆親モデル** `parent has_many :children, dependent: :delete_all`にしたとき、
親モデルdestroyすると子オブジェクトにはなんら影響しない
`(id: 1, name:肉しゃん, parent_id: 1 のまま)`
※nullifyは↑でいうと子オブジェクトのparent_id: NULLになるイメージだが、NOTNULL制約が付いているとdestroyしようとするとNotNullViolationでROLLBACKする。そんなときは子モデルの方で `belongs_to :parent, optional: true`とすることで外部キーにnullが入ることが許容されるようになる
https://qiita.com/takuyanin/items/6f6be86d1265be21bf9e
dependentオプションどれを使うかははケースバイケース(たにさん)
---
### 1/21 27p~
#### binstub
- binディレクトリに用意されているファイルのことをbinstubと呼ぶ。`bundle exec`コマンドをつけなくても実行できる。
- ラッパースクリプトを動かすためのファイル、アプリケーションごとにファイルやコマンドを管理するために用います。
- spring
ギアの重い自転車を漕ぐ初動を軽くする為に、前もって漕いでくれている装置というイメージと考えられます。
binディレクトリ配下のコマンドを常に起動できる状態にしておくイメージです。
二回目以降のbin/railsやbin/rakeコマンドの起動時間が短縮されます。
- puma・・・アプリケーションサーバー(他にUnicornなどがある,Railsでは標準装備)Pumaは高速化と並行処理のために作成されている
- Webサーバーとは・・・webサーバーはユーザーから送られてきた自サイトへのリクエストを受け取り、なんらかの処理を加えるプログラムです。
- アプリケーションサーバーとは・・・アプリケーションサーバーはあなたのRailsアプリケーションを動かしているものです
**参考記事**
[binstubを理解する](https://techracho.bpsinc.jp/hachi8833/2016_08_24/25037)
[Rails: Puma/Unicorn/Passengerの効率を最大化する設定(翻訳)](https://techracho.bpsinc.jp/hachi8833/2017_11_13/47696)
http://www.code-magagine.com/?p=7331
- Rubyのselfについて説明して下さい・どんなときに使いますか・・・
Rubyのselfとは、オブジェクトそのものを指しています
https://techacademy.jp/magazine/18706
Q27: Rubyのselfはどんなときに使うかを説明してください
クラスメソッドの定義や呼び出しではselfを使う
クラス内ではselfを用いて現在のクラスを参照する、つまり、あるクラスメソッドから(訳注: 同じクラス内の)別のクラスメソッドを呼び出すときに必須となる
インスタンスからクラスメソッドを呼び出す場合はself.class.methodという呼び出し方法が必須となる
https://techracho.bpsinc.jp/hachi8833/2020_05_13/91211#6
https://docs.google.com/spreadsheets/d/1Zl7nqbs7CaelaWkL888GZnUtFaLX7-twg3ilQ7LwxAQ/edit?usp=sharing
- Rubyのゲッターとセッターについて説明してください
Rubyではゲッター(getter)を用いてインスタンス変数を参照でき、セッター(setter)を用いてインスタンス変数に値を設定(書き込む)できます。
ゲッターメソッドやセッターメソッドは、以下のように手動で定義することもできます
---
### 1/22 34p~36p
- rails db console (rails dbでも可)
たたくとDBに接続する。SQLをうてば該当のデータが表示される
`SELECT * FROM users;`
https://qiita.com/k-o-u/items/a9b5e5472ba8415dd1aa
---
### 1/24 36p~41p
- 内部DSL(Domain Specific Language)
https://gihyo.jp/admin/feature/01/dsl/0001
DSLは,メタプログラミングで使われます。
メタプログラミング・・・ メタプログラミングとは、別のプログラムを生成できるプログラムを書くことです。
おそらく、『migrateファイルはこのファイル内のみで完結するよ。外部に影響させないよ。Rubyファイルだと思って良いよ』的な事を言いたいがために
使われた表現。わかりにくい!
---
### 1/25 42p~
### 1/26 2章から〜49p~
- アーキテクチャ・・・「構造」とか「構成」みたいなことをカッコつけて言った用語
- コネクションプール・・・ゲストカード貸出型接続方式のこと。接続した状態を最初からいくつか用意しておいて、何か用事がある人にはその接続を貸してあげることで、いちいち接続する手間を減らす機能のこと
- モデルの役割のうち、振る舞いに関するコールバックやバリデーションとは?・・・普通にモデルに書くvalidatesとかbefore_actionとか
- ビジネスロジック・・・システムにおける実際のお仕事部分のこと。そのシステムにおける、システム固有の処理を行う部分……的なニュアンスだけど具体的に何を指すかは結構あいまいで、みんな何となくのフィーリングで使っている用語。
- Active model・・・多くのモジュールを含むライブラリ。モデルじゃないけどモデルみたいに扱いたいときに使うやつ。formオブジェクトがまさに。
- 例:「MVCを説明してください」
- M ... データベースとの接続に対する操作、およびビジネスロジックを記載するところ
- V ... Modelを参照し視覚表現を行うところ
- C ... Modelのロジックを呼び出し、必要なViewの選択などといったModelとViewとをつなぐところ
### ActiveRecord
>Active Recordとは、MVCで言うところのM、つまりモデルに相当するものであり、ビジネスデータとビジネスロジックを表すシステムの階層です
>Railsのモデルで、RailsからSQLを簡単な記述で操作できる便利なもの
[ActiveRecordとは(Railsガイド)](https://railsguides.jp/active_record_basics.html)
---
[モジュール・パッケージ・ライブラリの違い](https://qiita.com/yutaro50/items/f93893a2d7b23cb05461)
[モジュールとは](https://medium-company.com/%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB/)
- **モジュール** ... 部品を意味する言葉であり、部品単独でも動作することは可能だが、他の部品と組み合わせて使用するもの
- **パッケージ** ... モジュールの集まったものがパッケージとなります。
- **ライブラリ** ... ある特定の機能をもったプログラムを、他のプログラムから呼び出せるように部品化したものです
※モジュール < パッケージ < ライブラリ みたいな感じ
- **コンポーネント** ・・・ 部品単独では使用せず、他の部品と組み合わせて使うもの
- モジュールはなぜつかう?クラスとは違う?・・・クラスは継承ができる(コントローラーだとアプリケーションコントローラ)モジュールだとそういった概念なし、includeかく
> クラスはインスタンス化能力をもちメソッドを定義できる、モジュールはインスタンス化能力を持たないがメソッドを格納できる。モジュールの利用法はメソッドを格納するか名前空間として利用する。
[クラス・モジュールの概念(qiita)](https://qiita.com/fukumone/items/2dd4d2d1ce6ed05928de)
[classとmoduleの違い(TechAcademy)](https://techacademy.jp/magazine/45608#:~:text=class%E3%81%A8%E3%81%AF%E3%80%81%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92,%E8%A4%87%E6%95%B0%E9%9B%86%E3%81%BE%E3%81%A3%E3%81%9F%E3%82%82%E3%81%AE%E3%81%A7%E3%81%99%E3%80%82)
[Railsチュートリアル(古い方)](https://railstutorial.jp/chapters/rails_flavored_ruby?version=4.2#sec-a_class_of_our_own)
[superクラスとは](https://techtechmedia.com/super-overwrite-ruby/)
classは工場、モジュールは部品
classはインスタンス生成が出来る(.newとか)けどmoduleはできない。
formオブジェクトはクラス、であってモデルではない。モデルのように扱いたいのでActive RecordのモジュールであるActive Modelをインクルードしている
---
通常のモデル`(quote.rb)→class Quote < ApplicationRecord`で、`application_record.rb`で`class ApplicationRecord < ActiveRecord::Base`を継承している。アプリケーションコントロ−ラーみたいな? ApplicationRecordはパパ👨🏻 ActiveRecordはジーちゃん👴🏻
```ruby=
$ rails c
Running via Spring preloader in process 32510
Loading development environment (Rails 6.1.4.1)
[1] pry(main)> ApplicationRecord.superclass
=> ActiveRecord::Base
[2] pry(main)> ApplicationRecord.superclass.superclass
=> Object
[3] pry(main)> ApplicationRecord.superclass.superclass.superclass
=> BasicObject
[4] pry(main)> ApplicationRecord.superclass.superclass.superclass.superclass
=> nil
[5] pry(main)> ApplicationRecord.superclass.superclass.superclass.superclass.superclass
NoMethodError: undefined method `superclass' for nil:NilClass
from (pry):5:in `__pry__'
[6] pry(main)>
```
---
### 1/28 53p~57p
- find・・・見つからなかったら例外
- find_by・・・見つからなかったらnil
- where・・・見つからなかったら空のActiveRecord::Relation[]がかえる
- ### Query Interface
- Active Recordのメソッド(select、where、limitなど)のこと。
- ActiveRecord::Relatiion
- SQLのそれぞれの表現に対応したメソッドをチェーンみたいに繋げていくことが可能です。(例:`Book.where("price>?", 3000).limit(3).order(:name)`みたいな感じ)
- 実行結果のデータを普通の配列と同じような感覚で扱えます。
https://tech.smarthr.jp/entry/2021/11/11/151444
なんで配列風なの?→メソッドチェインに対応させるため。where().limit.orderで3回SQLが呼ばれる事無く、1回呼ばれて配列のようにデータが保持されて、それをもとにlimitやorderが実行できる
- to_a
- 任意のタイミングでクエリ発行する時に使う
> そもそも、SQLのクエリが発行されるのはviewファイルでインスタンス変数が呼ばれた時。
> `@book = Book.where("price>?", 3000).limit(3).order(:name)`
> という`@book`のインスタンス変数がviewファイルに記載された時に(eachとか)クエリ発行する。
> ただ、もっと前に配列を取得し破壊的に[値を追加したい(pushメソッド)]とか何かしらコネコネしたい時にto_aでメソッドを使う
https://scoutapm.com/blog/three-activerecord-mistakes-ja
---
### 1/31 57p~
通常のクラスメソッドで対象が"無し"のとき
- find・・・RecordNotFound
- find_by・・・nil
- where・・・空のActiveRecord::Relation(nilではない)
- scopeでクラスメソッド↑を空になるように定義した場合、
・findだとscopeはつかえない
find単体でも!を使った時と同じ挙動をするので必ず例外がかえってしまう
・whereだと空のActiveRecord::Relationがかえる(nilではない)
・find_byだとnilがかえるはずだけどscopeの場合はnilだと条件が無視とみなされallがよばれる。
```ruby=
scope :find_id, ->(id){find_by(id: id)}
scope :where_id, ->(id){where(id: id)}
```
```ruby=
irb(main):018:0> Quote.find_id(50) #allがよばれる!(id50はそんざいしない)
Quote Load (0.2ms) SELECT "quotes".* FROM "quotes" WHERE "quotes"."id" = $1 LIMIT $2 [["id", 50], ["LIMIT", 1]]
Quote Load (0.2ms) SELECT "quotes".* FROM "quotes" LIMIT $1 [["LIMIT", 11]]
=> #<ActiveRecord::Relation [#<Quote id: 2, title: "失恋の悲しさ", quote_image: "3.jpg", opposite_voice: "28eda1a2-457f-4407-a80f-e9f86f9feb25.wav", emotiong", opposite_voice: nil, emotion: "happy", created_at: "2021-12-20 06:16:58", updated_at: "2021-12-20 06:41:30">, #<Quote id: 5, title: "喜び:スポ根", quote_image: "喜び_スポ根もの.png", opposite_voice: nil, emotion: "happy", created_at: "2021-12-20 06:42:05", updated_at: "2021-12-20 06:42:05">, #<Quote id: 7,>, #<Quote id: 8, title: "怒り:怒ったぞ", quote_image: "本文を追加__7_.png", opposite_voice: "def7f90f53769447.mp3", emotion: "angry", created_at: "2021-12-31 04:16:22", updated_at: "2021-12-31 04:21:30">, #<Quote id: 4, title: "喜び:ずっと食べたかったやつ", quote_image: "喜び_ずっと食べたかったやつ.png", opposite_voice: "スペシャルサンドnew.mp4", emotion: "happy", created_at: "2021-12-20 06:17:47", updated_at: "2022-01-05 11:17:11">, #<Quote id: 6, title: "喜び:使い魔と魔王", quote_image: "喜び_使い魔と魔王.png", opposite_voice: "きひひnew.mp4", emotion: "happy", created_at: "2021-12-20 06:42:32", updated_at: "2022-01-05 11:27:45">, #<Quote id: 9, title: "嫌悪: 言ってみたいモブキャラセリフ", quote_image: "本文を追加__17_.png", opposite_voice: "Record__online-voice-recorder.com___8_.mp3", emotion: "disgust", created_at: "2022-01-11 05:08:03", updated_at: "2022-01-11 05:13:42">, #<Quote id: 11, title: "驚き: 相棒がゾンビ化", quote_image: "本文を追加__20_.png", opposite_voice: "ゾンビ.mp4", emotion: "surprise", created_at: "2022-01-14 04:24:59", updated_at: "2022-01-14 04:24:59">, #<Quote id: 12, title: "喜び: 笑って引退したい", quote_image: "本文を追加__24_.png", opposite_voice: "Record__online-voice-recorder.com___15_.mp3", emotion: "happy", created_at: "2022-01-16 08:30:47", updated_at: "2022-01-16 08:32:55">, ...]>
irb(main):019:0> Quote.where_id(50)
Quote Load (0.3ms) SELECT "quotes".* FROM "quotes" WHERE "quotes"."id" = $1 LIMIT $2 [["id", 50], ["LIMIT", 11]]
=> #<ActiveRecord::Relation []>
irb(main):020:0> Quote.where(id: 50)
Quote Load (0.4ms) SELECT "quotes".* FROM "quotes" WHERE "quotes"."id" = $1 LIMIT $2 [["id", 50], ["LIMIT", 11]]
=> #<ActiveRecord::Relation []>
irb(main):021:0>
```
[scope](https://railsguides.jp/active_record_querying.html#:~:text=%E6%8C%87%E5%AE%9A%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82-,14%20%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97,-%E3%82%88%E3%81%8F%E4%BD%BF%E3%81%86%E3%82%AF)
#### ActiveRecord::Relation
[Rails API](https://api.rubyonrails.org/classes/ActiveRecord/Relation.html)
ActiveRcord::Relationはモジュール部分であり、ざっくりと何をしているかというと
- クエリを生成するための条件を持っておいて、必要に応じて適切なSQLクエリを生成・発行してくれる
- その結果からオブジェクトを作って返したり保持したりしてくれる
> SQLのそれぞれの表現に対応したメソッドをチェーンみたいに繋げていくことが可能です。(例:Book.where("price>?", 3000).limit(3).order(:name)みたいな感じ)
実行結果のデータを普通の配列と同じような感覚で扱えます。厳密には配列ではないので注意!(例えば配列に使えるpushはつかえない)
[参照](https://spirits.appirits.com/doruby/8831/)
[Qiita](https://qiita.com/kichion/items/a1539fcb124b69c765bf)
---
https://runteq.jp/v2/mypage/interview_trainings/427
https://runteq.jp/v2/mypage/interview_trainings/428
https://www.youtube.com/watch?v=tXSRkNiOyV8
https://www.youtube.com/watch?v=zL6DYg7WDnk&t=1s
★自己紹介:いやご経歴素晴らしいんですが、硬い!不動産の話カットしてエンジニア希望してポートフォリオ作って結果出しましたって話しちゃっても良いような気がしました(不動産の話ちょっと昔すぎるかなーと思いまして。ポートフォリオ突っ込みたくなる人もいると思うので、自己紹介で「経理だけどエンジニアっぽいことしてる」「ポートフォリオで面白いサービス作った」ことを餌をまいておいて、その後相手がつっこみたい事をつっこませたいのです
★声優なるための期間のお仕事(経理):これ普通にすごいと思ったんですよね。不動産業で経理やってたとしても、不動産業でしているのはメインは宅建事務であって、そこからメイン経理な仕事にいくって大変さはあると思います。なので、そこは謙虚にならずアピールしていいと思いますよ!
★Mipoxさんの経理:上場会社のメーカーでしかできない花形業務、とかより東山さんの実績を伝えてほしいので、①2〜3ヶ月という短い期間で連結決算を任せられるために頑張ったこと ②①が無ければ経理ながらエンジニアっぽいことしていた話 をしてほしいです!
★Mipox退職理由:エモい話なのでここはテンション上げてほしい!笑
★今後のキャリアの話:ここもエモい話なのでテンションあげてほしい!笑
★RUNTEQで頑張ったこと:ここは頑張ったことを答えてほしいんですが、それ以上に東山さんのアピールになるといいと思います。
★ポートフォリオに関して:ここすごくお伺いしていて楽しかったです!セリフ考えていた話とか、平均的に10ページ見てくれてる話とか、すごい面白かったです!
★今の経理の大変さの話:これも面白かったです〜!多分これをベースに業務効率化とかの企業見てってもいいかもっすねー!
全体的に自分が東山さんを知っているだけに、もったいないなーと感じました!
絶対に練習すればいつもの東山さんでいけると思うので、頑張りましょ〜!
---
### 2/1 59p~63p
- 外部キー制約・・・主キーと外部キーを使った制約で利用した場合、下記の制限が入る。
1. 存在しない値を外部キーとして登録することはできない
2. 子テーブルの外部キーに値が登録されている親テーブルのレコードは削除できない(オプションでdependent: :destroyを書くことで削除できる)
https://qiita.com/kamillle/items/5ca2db470f199c1bc3ef
60pの下のブロック意味不

マイグレーションファイルのnot nullをadd_referenceに書こうとすると↑のundefinedのように、railsからみて、そもそもpublisher_idそのものが見つからないような状態になるのでエラー。(db migrateをすればたしかにpublisher_id出来るけど、この時点では)
そのため、明示的にこれからカラムが出来るんだよということを教えるためにchange_columnという形で行をわけてnot nullを書く。
``` ruby=
# 2xxxxxxxxxxxxx_add_publisher_id_to_books.rb
略
def change
add_reference :books, :publisher, foreign_key: true
#rails g migration時にreferencesをつけた事により外部キーであるforeign_keyが生成されており、この行でpublisher_idが作られます。(注:publisher_idとこの行で書いてしまうとpublisher_id_idとなってしまいます。)
change_column :books, :publisher_id, :integer, null: false
#ここで1行目に生成されたpublisher_idにnull: falseをつけることでnot null制約を付与しています。
```
### 2/3 63p~66p
- 1対多の場合、belongs_to側に外部キー作る?
- 親のhas_many側に絡む作っちゃうとマルチカラムアトリビュートになっちゃう。1のほう、belongs_toを書いてる側に外部キー書かないと。
- 参照:[Railsガイド](https://railsguides.jp/association_basics.html#:~:text=belongs_to%E3%81%A7%E3%81%AF%E3%80%8C%E5%8F%82%E7%85%A7%E3%81%AE%E4%B8%80%E8%B2%AB%E6%80%A7%E3%80%8D%E3%81%8C%E6%8B%85%E4%BF%9D%E3%81%95%E3%82%8C%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82%E3%81%9D%E3%81%AE%E3%81%9F%E3%82%81%E3%80%81%E3%83%A6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%82%B9%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E3%81%AF%E4%BB%A5%E4%B8%8B%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E5%8F%82%E7%85%A7%E3%82%AB%E3%83%A9%E3%83%A0%E3%81%A7%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%83%AC%E3%83%99%E3%83%AB%E3%81%AE%E5%A4%96%E9%83%A8%E3%82%AD%E3%83%BC%E5%88%B6%E7%B4%84%EF%BC%88foreign_key%3A%20true%EF%BC%89%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B%E5%BF%85%E8%A6%81%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82)
- 中間テーブル・・・関連"多対多"が入ると必ず中間テーブルが必要?
- nullにならないようにするために中間テーブルでIDを管理するために便利
- 参照:[やさしい図解で学ぶ 中間テーブル 多対多 概念編 Qiita](https://qiita.com/ramuneru/items/db43589551dd0c00fef9)
- has_oneのとき、外部キーはどっちも持つ?・・・一方がhas_oneであれば一方はbelongs_to
- ↓によるとhas_oneが自然なほうが持つ(例えばUserとaccountの場合userがhas_oneしている方が自然)
[Rails Association 1対多,1対1について。Qiita](https://qiita.com/s_tatsuki/items/9a875a9cf486172b8ead)
- [双方向関連付:Railsガイド](https://railsguides.jp/association_basics.html#:~:text=end%0A%20%20end%0Aend-,3.5%20%E5%8F%8C%E6%96%B9%E5%90%91%E9%96%A2%E9%80%A3%E4%BB%98%E3%81%91,-%E9%80%9A%E5%B8%B8%E3%81%AE%E9%96%A2%E9%80%A3)
```ruby=
class Author < ApplicationRecord
has_many :books
end
class Book < ApplicationRecord
belongs_to :writer, class_name: 'Author', foreign_key: 'author_id'
end
irb> a = Author.first
irb> b = a.books.first
irb> a.first_name == b.writer.first_name
=> true
irb> a.first_name = 'David'
irb> a.first_name == b.writer.first_name
=> false
```
[belongs_to の foregin_keyオプション](https://railsguides.jp/association_basics.html#belongs-to%E3%81%AE%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3-foreign-key)
belongs_to に foregin_keyオプション もしくは has_many through を使用している場合、自動認識がされない(config設定がrails最新バージョンであれば自動認識されるようにはなっている)
自動認識してくれない場合、has_側にinverse_ofオプションを書いておくことで自動認識させることが出来る
- inverse_ofとは
inverse_ofを指定したリレーションのある2つのモデルでは、双方から同一のインスタンスを参照できるようになる。両者ともメモリ上で同一のインスタンスとして扱われる。
逆に、inverse_ofの設定が無いと同一として扱われず、一方からの変更がもう一方から参照しても変更されていない。
[inverse_ofが使われないワケ(侍エンジニア)](https://www.sejuku.net/blog/66868)
※inverse_ofは一見必要無さそうに見えるけど、 has_many+条件式をscope定義しているときはつけないと自動認識されない!!
---
### 2/4 66p~
バリデーション書いたら`create` `save` `update`に`!`をつけてあげるとエラーメッセージを表示してくれる、例外だと処理がとまるエラー画面。
通常続いてredirect_toなどを書くはずだけど、例外だとその前でとまる。
[バリデーション実行時の動作: Railsガイド](https://railsguides.jp/active_record_validations.html#:~:text=!%E3%81%8C%E6%9C%AB%E5%B0%BE%E3%81%AB%E4%BB%98%E3%81%8F%E7%A0%B4%E5%A3%8A%E7%9A%84%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%EF%BC%88save!%E3%81%AA%E3%81%A9%EF%BC%89%E3%81%A7%E3%81%AF%E3%80%81%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%8C%E7%84%A1%E5%8A%B9%E3%81%AA%E5%A0%B4%E5%90%88%E3%81%AB%E4%BE%8B%E5%A4%96%E3%81%8C%E7%99%BA%E7%94%9F%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%20%E9%9D%9E%E7%A0%B4%E5%A3%8A%E7%9A%84%E3%81%AA%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%81%AF%E3%80%81%E7%84%A1%E5%8A%B9%E3%81%AA%E5%A0%B4%E5%90%88%E3%81%AB%E4%BE%8B%E5%A4%96%E3%82%92%E7%99%BA%E7%94%9F%E3%81%97%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82save%E3%81%A8update%E3%81%AF%E7%84%A1%E5%8A%B9%E3%81%AA%E5%A0%B4%E5%90%88%E3%81%ABfalse%E3%82%92%E8%BF%94%E3%81%97%E3%80%81create%E3%81%AF%E7%84%A1%E5%8A%B9%E3%81%AA%E5%A0%B4%E5%90%88%E3%81%AB%E5%8D%98%E3%81%AB%E3%81%9D%E3%81%AE%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E8%BF%94%E3%81%97%E3%81%BE%E3%81%99%E3%80%82)
https://hackmd.io/coZGaARgSwW15i9vV_tmqQ#save%E3%81%A8save%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%81%AE%E6%8C%99%E5%8B%95%E3%81%AE%E9%81%95%E3%81%84%E3%81%AF%E4%BD%95%E3%81%A7%E3%81%99%E3%81%8B%E3%80%82%E3%81%9D%E3%82%8C%E3%81%9E%E3%82%8C%E3%81%AE%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%81%AF%E3%81%A9%E3%81%86%E4%BD%BF%E3%81%84%E5%88%86%E3%81%91%E3%81%BE%E3%81%99%E3%81%8B%E3%80%82-save%E3%81%AF%E5%A4%B1%E6%95%97%E3%81%97%E3%81%9F%E3%82%89%E3%80%8Cfalse%E3%80%8D-%E3%81%8C%E8%BF%94%E3%82%8A%E3%80%81save%E3%81%AF%E3%80%8C%E4%BE%8B%E5%A4%96%E3%80%8D%E3%81%8C%E8%BF%94%E3%82%8B%E3%80%82-save%E3%81%AF%E5%A4%B1%E6%95%97%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%82%92%E6%83%B3%E5%AE%9A%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E5%87%A6%E7%90%86%E3%81%AB%E4%BD%BF%E3%81%84%E3%80%81save%E3%81%AF%E5%A4%B1%E6%95%97%E3%81%97%E3%81%AA%E3%81%84%E3%81%AF%E3%81%9A%E3%81%AE%E5%87%A6%E7%90%86%E3%81%AB%E4%BD%BF%E3%81%86%E3%80%82
[RailsのTransactionの使い方](https://qiita.com/huydx/items/d946970d130b7dabe7ec)
- create save updateの違いは?
### 2/5 69p~73p
[【Rails】一括updateでコールバックを呼べるのか検証してみた](https://qiita.com/ngron/items/6d13e98f1aedde5b30dd)
- update_all,update_columnsなどのメソッド
(https://www.sejuku.net/blog/65270)
update_allは、ActiveRecordオブジェクトを経由しない更新方法のため、バリデーションやコールバックが実行されませんので、注意が必要です。
→ということはSQL直の用な感じ
SQLを直実行する
[Rails ドキュメント](https://railsdoc.com/page/model_update_all)
---
### 2/5 73p~77p
#### Enum型
数値のカラムに対してプログラム上で扱える別名を与えることが出来る。コード上に直接数字を書くマジックナンバーを避けるためでもあり、コード上では分かりやすいシンボルで指定しつつActiveRecord側ではDB上の定義に合わせて保存できる。
```ruby=
enum status: { admin: 0, writer: 10, reader: 20 }
# 10飛ばしなどにすることで、後から前後に追加したくなったときにすぐに追加できる
```
- enumerize・・・enumよりも高機能。より複雑な定義をしたいとき。例えば英語と日本語両方定義できたりする、簡単にformでセレクトボックスやラジオボタンが作れるなど
[enumeriseの使い方](https://opiyotan.hatenablog.com/entry/rails-gem-enumerize)
---
### 2/8 コントローラの役割 2-3
```ruby=
respond_to to |format| # のようにすると
format.html # htmlを返す
format.json # json形式で返す
end
```
#### フック
アクションの前後に処理を差し込むことができるコールバック処理のようなもの
これは暗記系
[protect_from_forgery :Railsガイド](https://railsguides.jp/security.html#:~:text=Rails%E3%81%A7%E6%96%B0%E8%A6%8F,%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82)
[CSRFへの対応策 :Railsガイド](https://railsguides.jp/security.html#:~:text=%E3%81%A8%E6%80%9D%E3%81%84%E3%81%BE%E3%81%99%E3%80%82-,3.1%20CSRF%E3%81%B8%E3%81%AE%E5%AF%BE%E5%BF%9C%E7%AD%96,-%E7%AC%AC%E4%B8%80%E3%81%AB%E3%80%81W3C)
[RailsのCSRF対策について](https://qiita.com/eshow/items/915f8e8ad317aa8e49a6)
- protect from forgery・・・別サイトを横断して、処理をさせないようにトークンを使って対策できるメソッド(form_withと一緒に使ったりする)
---
### 2/10 p84~
-ルーティングの書き方 アロー関数(=>)→ , to:
```ruby
delete 'logout', to: 'user_sessions#destroy'
```
- PATCH PUT・・・通常思い浮かぶ編集がPATCH。title変更など。PUTは置き換え、画像アップロードの画像を変えたときなど。

- [shallow - Railsガイド](https://railsguides.jp/routing.html#%E6%B5%85%E3%81%84%E3%83%8D%E3%82%B9%E3%83%88)
ネストしていたとしても、親の_idが必要ではないアクション→edit、show、update、destroyはURLをスッキリ表示できる。
https://railsguides.jp/routing.html#:~:text=%E3%81%93%E3%81%AEarticles%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9%E3%81%A7%E3%81%AF%E4%BB%A5%E4%B8%8B%E3%81%AE%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%8C%E7%94%9F%E6%88%90%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82
member と collection
member・・・id必要
collection・・・不要
idの参照が必要か不要か
- concern・・・scopeを切り出して再利用するやつ(モデルディレクトリにあるやつ)
---
### 2/14 p88~93p
例外処理はなんとなく雰囲気わかった気がする
#### ストロングパラメーター
- require モジュールを呼び出していない 外部ファイルを読み込んでいる
- include モジュールを呼び出している
- permit 引数でフィルタしたカラム(属性)でActionController::parameters(parameterのこと)を新しくつくりなおす。→参照:[API Doc: require](https://api.rubyonrails.org/v7.0/classes/ActionController/Parameters.html#:~:text=show%20%7C%20on%20GitHub-,permit(*filters),-Link)
- [railsガイドpermit](https://railsdoc.com/page/parameters_permit)
**疑問**
>requireじゃなくてincludeでもよくない?
>```ruby=
>params.require(:post)
>```
>paramsはモジュールじゃないからrequireを使う
---
>```ruby=
>params.require(:post).permit(:title, :body)
>```
```ruby=
private
def post_params
params.require(:post).permit(:title, :content, :last_day, :status)
end
```
>parmit(引数)
```ruby=
def permit(*filters)
params = self.class.new
```
parmitメソッドを使うと引数を使って新しくインスタンスを作ってる感じ?🤔だから引数に渡されたもの以外は「許可しない」ってことになるのか?🤔
>
[API doc permit](https://api.rubyonrails.org/v7.0/classes/ActionController/Parameters.html#:~:text=merge(other_hash),params.permit(%3Aname))
[include? :Ruby](https://docs.ruby-lang.org/ja/latest/method/Array/i/include=3f.html)
[require :Ruby](https://docs.ruby-lang.org/ja/latest/method/Kernel/m/require.html)
[requireとincludeの違い](https://qiita.com/yanap/items/65c3953fb4e52218399a)
---
## 2/15 : p93 2-4~
```ruby=
def show
render :show
end
def show; end # ←これでも意味は同じ
```
render :showでは
・描画するテンプレートを探す
・見つかったテンプレートをもとにデータを展開し最終的なHTMLを生成する
- render,redirect_toで:statusをわたす理由
[回数制限APIをつかったときに使う](https://qiita.com/terufumi1122/items/997e24dde87f807e3944)
- 🤔 <ワカラン [status ::Railsガイド](https://railsguides.jp/layouts_and_rendering.html#:~:text=2.3.1%20%E3%83%AA%E3%83%80%E3%82%A4%E3%83%AC%E3%82%AF%E3%83%88%E3%81%AE%E3%82%B9%E3%83%86%E3%83%BC%E3%82%BF%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B)
### renderとredirecto_toの違い
>renderはcontrollerのactionを経由しない
redirect_toは経由する
・render : controller → view
・redirect_to : controller → URL → route → controller → view
[Railsガイド](https://railsguides.jp/layouts_and_rendering.html#:~:text=%E3%83%AC%E3%83%B3%E3%83%80%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%97%E3%81%BE%E3%81%99%E3%80%82-,2.3%20redirect_to%E3%82%92%E4%BD%BF%E3%81%86,-HTTP%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%81%AB)
コントローラ側から見たHTTPレスポンス
- **renderを呼び出す**: 完全なレスポンスを作成してブラウザに送信する
- **redirect_toを呼び出す**: HTTPリダイレクトステータスコードをブラウザに送信する
## 2/17 : p97 2-4-2~
- renderのlayoutオプション [:layoutオプション - Railsガイド](https://railsguides.jp/layouts_and_rendering.html#:~:text=2.2.13.2%20%3Alayout%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3)
view/layouts/内にあるlayoutファイルを適用するオプション。通常application.html.erbが呼ばれるがそれ以外使いたいとき。(ex.top.html.erb→ render layout: "top")
[実際に使う時のイメージ](https://pikawaka.com/rails/layout#renderメソッドで指定)
[layoutメソッド Pikawaka](https://pikawaka.com/rails/layout)
実際に現場で使われるかは分からない(フロントとバックエンドで分かれている場合があるのでガチガチのRailsでブログサイトを作るときは使えるかもね)
[:variants オプション](https://railsguides.jp/layouts_and_rendering.html#:~:text=2.2.13.6%20%3Avariants%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3)
[ユーザーエージェント (UA)](https://wa3.i-3-i.info/word1452.html)
※UAの情報はどうやって判断してる?→ユーザーからのHTTPリクエストヘッダーに書いてある(検証ツール使うやつ)
↓スマホ

↓PC

---
## 2/18 : p102 2-5~
- クエリパラメータ・・・クエリパラメータとは
URLの?以降に続く部分のことを指します
[【Ruby on Rails】クエリパラメータを扱う](https://note.com/matsukoutennis/n/n484cfbf51c1a)
↓これを 基礎編boards_indexのViewに書くと・・・
<%= link_to "るーと", root_path(食べ物: "りんご")%>


- 2-5-2:エスケープ処理とは?
```ruby=
$("#js-board-<%= @board.id %>").replaceWith("<%= j(render('boards/bookmark', board: @board)) %>");
```
この```j(render)```の部分の`j`がエスケープ処理をしている。
- [API doc](https://api.rubyonrails.org/classes/ActionView/Helpers/JavaScriptHelper.html#method-i-escape_javascript)
[[Rails] scriptタグ内でRuby/Railsのメソッドを使用する際のescape_javascriptについて](https://qiita.com/eitches/items/290d3e1a8ca33f849ed6)
↑🤔は?
j render(escape_javascript)→''""や改行をエスケープするやつ→JQueryのなかの<%=内でつかってる→Ruby記法だから
**JavaScriptとしての**`''""`**じゃないんだからね!!**/// ってこと?
## [j の部分のgithub](https://github.com/rails/rails/blob/2459c20afb508c987347f52148210d874a9af4fa/actionview/lib/action_view/helpers/javascript_helper.rb#:~:text=JS_ESCAPE_MAP%20%3D%20%7B,alias_method%20%3Aj%2C%20%3Aescape_javascript)
```ruby=
JS_ESCAPE_MAP = {
"\\" => "\\\\",
"</" => '<\/',
"\r\n" => '\n',
"\n" => '\n',
"\r" => '\n',
'"' => '\\"', # ←このバックスラッシュなんなん?
"'" => "\\'",
"`" => "\\`",
"$" => "\\$"
}
```
ってことで、`\`がjsにとってなんの作用があるのか?
### [JSでの \ の意味は? :JS PRIMER](https://jsprimer.net/basic/string/#:~:text=%E3%81%A9%E3%81%AE%E6%96%87%E5%AD%97%E5%88%97,%E5%AE%9F%E8%A1%8C)
```javascript=
const str = "This book is \"js-primer\"";
console.log(str); // => 'This book is "js-primer"'
```
↑文字列の中に""が重複していてもバックスラッシュ書いたらちゃんと認識してくれている!
---
### 2/19 p110~
APIモードの時にJSONを返す場合、`jbuilder`という`gem`を使うことで`render json: @book`とするよりもjsonで取って来たい情報の抽出条件を細かく指定できる
extractは"抜粋"の意味
extract!と書かないと通常のキーとして認識してしまう
[extract!について :Pikawaka](https://pikawaka.com/rails/jbuilder#json.extract!)
- jbuilderってgemがあるんだなー
- pikawakaさんの記事見たらいいんだなー
という認識
---
### 2/21 3章 p116~p121
- Action cable・・・websocketを利用した、リアルタイム通信を実現できる機能
- websocket・・・必要に応じてサーバーからクライアントに対して情報を送ってくれるシステムで、情報を得るためにクライアントがリクエストする必要がない
web技術の基本P61の上の図 ①SYNの状態を保持する
- systemテスト・・・E2Eのテストのこと
E2E とは[Qiita](https://qiita.com/mt0m/items/7e18d8802843d9f60d28)
・ブラウザ上の挙動テスト(RSpecでいうカピバラさん動かすやつとか)
・ユーザと同じようにブラウザを操作し、挙動が期待通りになっているか確認
minitestでは行を指定してテストをできる。(RSpecでも出来んのかな🤔)
---
### 2/24 3章 p122~
`=~` [結合演算子](https://www.javadrive.jp/perl/regex/ini/index2.html)
[Rubyのppとは](https://docs.ruby-lang.org/ja/latest/library/pp.html)
---
### 2/25 p134~
#### Rackとは
- サーバーとRubyアプリケーションの間の緩衝材(https://blog.mothule.com/ruby/rails/rack/rails-rack-middleware-extension)
#### ミドルウェアとは
- OSとアプリケーションの中間で頑張るプログラムなんだな~(https://wa3.i-3-i.info/word178.html)
> どこのコンビニ行ってもヤマザキパンが置いてある。(山奥でも離島でも)輸送も含めてヤマザキパンはミドルウェア なんじゃね?(←話半分で!!)
#### Rackミドルウェア
- Rackミドルウェアを使うときは`use`メソッドを使う
- 検証ツールでネットワークのヘッダーの中に"X-Runtime"という部分が追加される(処理時間)
```ruby=
#config.ru
require "rack"
require_relative "app"
use Rack::Runtime
run App.new
```
# 🤔 <ワカンネ
#### 3-2-5 RailsとRackの関係
RailsもRackの仕様に則ったアプリである。
↓Rails newしたら入ってるっぽくて見てみてたらホントだった(草)

---
普通に`rails s`するとSQLが走ってるし、何よりログが見やすい
`$ bundle exec rackup`はSQLが見れない

`$ bundle exec rails s`は見やすい

railsコマンドを打った時に見易くするために開発者はRackすなわち`bin/rails`の中に色々書いてくれてるんだと思う。。。
流石にgithubは見に行く勇気が無い
### 2/26 p139~p141 3-3前まで
### 2/28 p141~p144 3-3から
[changeとupとdown](https://qiita.com/koni4k/items/294342048cb6d47bcc3f)
[rollbackできないときどうしたらええねん](https://qiita.com/takuyanin/items/6d51ffb4078a417fed35)
→rollbackできないとき、migrationファイル修正して再度rollbackするとできるよ(本当かな・・)
[reversibleメソッド :Railsガイド](https://railsguides.jp/active_record_migrations.html#:~:text=%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82-,3.10%20reversible%E3%82%92%E4%BD%BF%E3%81%86,-%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3)
```ruby=
reversible do |dir|
dir.up do
# CHECK制約を追加
# ↓ 生のSQLを書くよ!の宣言
execute <<-SQL
ALTER TABLE distributors
ADD CONSTRAINT zipchk
CHECK (char_length(zipcode) = 5) NO INHERIT;
SQL
# ↑ 大文字SQLで囲むと「こっからここまでSQLの処理ですよ」って意味
end
```
https://stackoverflow.com/questions/2500436/how-does-cat-eof-work-in-bash#:~:text=This%20is%20called%20heredoc%20format%20to%20provide%20a%20string%20into%20stdin.%20See
---
### 3/1 p144~
#### 複数のDB
- database。ymlに設定追加すると複数のDB扱えるようになる
- モデルを複数のDBに接続したいときはestablish_connectionを使う(モデルに書く)
★なぜマルチDBを使うのか(https://tech.ga-tech.co.jp/entry/2019/06/rails-multi-db)
プロジェクトの規模が大きくなって、複数データベースを対応する必要が発生することがあります。主に以下の2つのユースケースがあると思います。
・新しいシステムで既存のDBも使いたい
・スピード改善またはデータ安全性を向上するため、読み取り専用のレプリカを使いたい
- (プライマリーDB)書き込み用データベース
- (レプリカDB)読み取り専用データベース
★高負荷分散のため[弥生開発ブログ](https://tech-blog.yayoi-kk.co.jp/entry/2020/10/09/110000)
[Active Record で複数のデータベース利用:Railsガイド](https://railsguides.jp/active_record_multiple_databases.html)
[ls6.0で複数のデータベースを利用する: Zenn](https://zenn.dev/youichiro/articles/8a1379e7693882d5f1a2)
[ self.abstract_class = true の意味](https://codaholic.org/?p=2214)
#### p149~
★書き込み用と読み込み用に分けて負荷分散
・書き込みされると自動でレプリケーション→読み込み用にコピーされる
・自動で書き込みか読み込みかでDB参照自動切り替え出来る(delayを設定しておくことで決まった秒数内に読み込みしちゃった場合は書き込みDB参照する)
---
### 3/5 p152~154
---
### 3/7 p154~
#### ・秘密情報を管理する
- Rails4.0まではsecrets.ymlで管理(secret_key_base)→ rails new時に作成される
- Rails5.1ではsecret.yml.encというファイルに暗号化した内容を記載する。(rails newで作成されないので別途作成)本番環境ではRAILS_MASTER_KEYを使って複合キー渡す
#### credentials
- Rails5.2→rails newするとcredentials.ymlとsecret_key_baseが作成される。環境別に対応することができない
- Rails6.0→rails newするとcredential.ymlとsecret_key_baseが作成される。環境別にも対応可。その場合はstaging用のymlとmaster_key_baseを作成する。別環境でも同じ環境のcredencialsを使うこともできる。その場合はconfig/environment以下の環境別ファイルにymlとkeyのpathを指定してあげる。
[credentialsの基本:Qiita](https://qiita.com/NaokiIshimura/items/2a179f2ab910992c4d39)
master_keyとcredentialはセットなのでgit cloneした時にcredentialファイルは開けない。
master_keyはgitignoreされてる
---
### 3/7 p159~
- リバースプロキシ?・・・Webサーバさんの身代わりになってホームページのファイルを返してくれるサーバさんのこと。Webサーバーのパシリ。
- プロキシ?・・・Webサーバさんの身代わりになってホームページのファイルを返してくれるサーバさんのこと。ブラウザのパシリ。
- Early hints・・・アセット等を通常より早くダウンロードしようとする仕組み。場合によっては早くならなかったりサーバー・アプリの性質によっては問題がある場合もあるので十分検討してから導入すべし
[preloard サイト高速化🤔](https://wk-partners.co.jp/homepage/blog/hpseisaku/htmlcss/preload/)
[NIKKEIのブログ: Early Hints](https://hack.nikkei.com/blog/advent20201220/)
---
### 3/10(木) p164
#### CSP
- コンテンツセキュリティポリシー
XSSの脆弱性を軽減する働きがある。
[CSP reportを利用したときの違反報告の例](https://developer.mozilla.org/ja/docs/Web/HTTP/CSP#sample_violation_report)
↑いきなり本番環境に入れたらセキュリティに引っかかりまくってサイト見れなくなるかもなので事前にreportで検証できるやつ
設定でホワイトアウト的に許可していないと"blocked-uri"に載る?
---
### 3/11(金) p167~
[nonce :Railsガイド](https://railsguides.jp/security.html#:~:text=%E6%94%BB%E6%92%83%E3%81%AF%E3%80%81%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AB-,nonce,-%EF%BC%881%E5%9B%9E%E9%99%90%E3%82%8A)
[uuid SecureRandom](https://docs.ruby-lang.org/ja/latest/method/SecureRandom/s/uuid.html)
[SecureRandom base64](https://docs.ruby-lang.org/ja/latest/class/SecureRandom.html)
[分かりそうで分からない base64](https://wa3.i-3-i.info/word11338.html)
---
### 3/15(火) p172~177 4章
---
### 3/17(木) p177~
https://browserslist.dev/?q=ZGVmYXVsdHM%3D
https://babeljs.io/
- nodeのバージョン→偶数がおすすめ。安定版を入れないとエラーのもととなる場合がある
[LTS(LongTermSupport)版を使って!](https://www.publickey1.jp/blog/21/nodejsltsnodejs_16apple_m1javascriptv8_90.html)
https://nodejs.org/ja/
[Node.jsとはなにか?なぜみんな使っているのか?](https://qiita.com/non_cal/items/a8fee0b7ad96e67713eb)
- Nuxt・・・Vue.jsのフレームワーク
- Next・・・Reactのフレームワーク
[パラメータ](https://railsguides.jp/action_controller_overview.html#%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF)
[params](https://github.com/rails/rails/blob/de53ba56cab69fb9707785a397a59ac4aaee9d6f/actionpack/lib/action_controller/metal/strong_parameters.rb#L1215)
https://github1s.com/rails/rails/blob/de53ba56cab69fb9707785a397a59ac4aaee9d6f/actionpack/lib/action_controller/metal/strong_parameters.rb
---
### 3/18 p183~
- loader
- cssや画像をJavaScriptに変換してくれるやつ
---
### 3/22 p188~
- SourceMapとは・・・コンパイル前後情報が入ったファイル。コンパイルされたファイルを使用してブラウザが表示しているがコンパイル前の情報が無いともとのファイルが特定できない→SourceMapを利用することでコンパイル前後の情報がわかるのでファイル特定ができるようになる。
SourceMapはWebpackに入ってるみたいです
https://qiita.com/syunk38/items/a9b5363903dd1fd5dc44
https://chuckwebtips.hatenablog.com/entry/2016/03/02/000000
---
### 3/24 p192~201 4-2-2
---
### 3/25 p201~203
Pjax・・・
[Railsガイド: サーバー側で考慮すべき点](https://railsguides.jp/working_with_javascript_in_rails.html#:~:text=%E3%81%B9%E3%81%8D%E3%81%A7%E3%81%99%E3%80%82-,4%20%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E5%81%B4%E3%81%A7%E8%80%83%E6%85%AE%E3%81%99%E3%81%B9%E3%81%8D%E7%82%B9,-Ajax%E3%81%AF%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88)
---
[ジグザグ](https://www.zig-zag.co.jp/)
https://youtu.be/Nv6igwCFBTo?t=7329
https://radicode.co.jp/
https://www.wantedly.com/companies/company_9848818
福利厚生
https://fu-ku-ri.com/interview/779
スライド
https://speakerdeck.com/itandi/itandi-054b9273-cff7-48ad-9b19-eca0fc4147f1
https://school.runteq.jp/v2/curriculums
