## Log
- [[🗃️Kaigi on Rails]]
- [Kaigi on Rails 2023](https://kaigionrails.org/2023/)
- [-] チケット購入 📆2023-10-20
- [Kaigi on Rails 2023 - Kaigi on Rails | Doorkeeper](https://kaigionrails.doorkeeper.jp/events/161847)
-> オフライン参加を逃してしまった 😭
## HTTPリクエストを手で書いて学ぶ ファイルアップロードの仕組み
- application/x-www-form-urlencoded
- =(0x26)後は、valueと解釈する仕様
- 実際にリクエストをなげる
- httprequest.rb
- `&`が入っていた場合
- コンテンツが正しく届けられるための仕組み
- エンコード
- %エンコード
- Base64エンコード
- バイナリを埋め込むさいはよくつかわれる
- サーバー側では、decodeして値を扱う必要がある
- base64エンコードをした値を渡すのがよさそう。
- mutipart/form-data
- boundary = 区切り文字として指定ができる
- バイナリー変換しなくてもよくなる
- 基本的に、form-urlencodedと変わらない
- [[🗃️JavaScript]]では、FormDataを使うことで、形式を揃えて送信ができる
- PUTを使ったアップロード
## 生きた Rails アプリケーションへの delegated types の導入
- 💭こういうのがあるのが初知り[[ActiveRecord] Delegated Type|Railsの練習帳](https://zenn.dev/igaiga/books/rails-practice-note/viewer/ar_delegated_type)
- [[🗃️Delegated Types(Rails)]]
- cookpadは、デプロイ履歴をhako-consoleというアプリケーションを内政している
- cloudtrail -> redshift -> バッチ実行してデータを蓄積
- [[🗃️デプロイ]]履歴を保持している
- ECS固有の情報などの汎用的なデータが有る
- ECSサービス名、Lambda固有
- STI(Single Table Inheritance)
- 複数のモデルで1つのテーブルを共用で使う
- メリット
- テーブルが1つで済む
- SQLクエリがシンプルになる
- デメリット
- NULLが避けられない
- 横に巨大テーブルになりがち
- Delegated Types
- 定義+ `delegated_type :deploy_historyable`
- has_one_associationで管理している
- 気づき
- factory botでも問題なく動く
- [[🗃️ActiveRecord]]と同様に扱うことができる
- bad
- [[🗃️継承]]の関連ではないので、baseという命名は違和感
- 共通テーブルに外部キー制約をかけられない
- [[🗃️PostgreSQL]]のチェック制約でも無理だった
- Nullを避けてきれいになったけど、外部キー制約をつけられないのはつらい
## Exceptional Rails
- [[👤willnet]] sanのありがたいお話
[[🗃️例外処理]]の話
- 必要があるときだけ、例外を発生させるのがいい
- 迷ったときはやらないに倒したほうがいい
- 理由
- 見づらい
- 処理が遅い
- 原則として異常系で使うとよい
- 例 ) DBサーバーへの接続に失敗したとき
- 来るはずのない分岐にきたとき
- case文のelse句
- ユーザー入力に依存しない保存/更新処理
- destroy!
- [[🗃️DB]]の更新をするときは、`!`をつけるとよい
- 例外をいつどのようにrescueするのか
- なるべく具体的に例外を補足する
- `ActiveRecord::RecordInvalid, ActiveRecord::NotSaved`で具体的に補足する
- beginとrescueは狭くするとよい
- [Rails アプリケーションのエラー通知 - Railsガイド](https://railsguides.jp/error_reporting.html)
- 開発者に対する通知をどうするのか?
- ログに書き込むだけだと、気づけ無い
- エラートラッキングサービスを使ってあげる
- 対応できないエラーについて通知がきてもノイズになってしまう
- ApplicationControllerで、rescue_fromで、StandardErrorを使う
- Rackのレベルでエラーになると、railsのデフォルトエラーが出てしまう
- `rails middleware`を使うとmiddlewareが見られる
- 動的なエラーページを表示したいときは、
- rambulanceという[[🗃️gem]]が役に立つ
- 単体テストがらく
- 簡単にエラーページを表示して、確認ができる
## update billion records
- 50~60億レコードを更新する
- 更新期間も安定して、使えるようにしたい
- parallel、activerecord-importで、並列かつbulkで更新していた
- 実行し続ければ、1ヶ月かかる
- idにsnowflake idを利用していた
- timestampに基づいて生成される時系列ソート済みのID
- [[🗃️Sidekiq]]
- 並列数を高めると、[[🗃️DB]]の負荷が高まってしまう
- rails runnerでバッチ起動。非同期jobを登録
- 40分 / 1000万件
- 小さく試して、進めるのがよい。
## TracePointを活用してモデル名変更の負債解消をした話
- TracePoint is [[🗃️Ruby]]の標準ライブラリ
- モデル名を変更する負債解消
- Project::Sheet::Section::Item::InputNumber
- ネームスペースでネストしたモデル名を採用していた
- まずapp/model直下に配置した
- 利用箇所を特定するために、TracePointを活用した
- TracePointの基本
- [[🗃️Ruby]]上の様々なイベントを
- `TracePoint.new(:call)`
- 指定したイベントで、[[🗃️トレース]]して、情報にアクセスできる
- Tips
- メソッド呼び出しファイルの特定
- ソースコードの特定
- RubyVM:AbstractSyntaxTreeを使うと抽象構文木にトレースして、場所を特定できる
## [[🗃️ActiveRecord]]クエリクイズ