## 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]]クエリクイズ