MogLog

日記 兼 備忘録

`destroyed_by_association` で親モデルの関連により削除されるかどうかを判定する

Rails (ActiveRecord) ネタ。 ActiveRecord::AutosaveAssociation#destroyed_by_association を使うと、モデル間の関連設定により削除されるのか、それとも自身で削除するのかを判定することができる。 例えば、次のように Team と User という2つのモデルが…

.tigrcの地道な改善

.tigrc改善のモチベーション PullRequestを作る revertする mergeする rebaseする stashする おわりに 普段から、開発時にお世話になっている tig について、ちょくちょく改善を加えているので最近加えた設定についてまとめてみる。 .tigrc改善のモチベーシ…

逆算思考でドキュメントを書く

誰のために書くか(対象読者)を考える 対象読者に何を得てもらいたいかを考える 対象読者がその状態になるために何を書くかを考える ドキュメントの構成を考える おわりに 最近ドキュメントを書く機会が増えてきたこともあって、良いドキュメントを書くには…

ActiveRecordのautosaveの設定で子モデル含めた新規作成・更新時の振る舞いはどのように変わるか

最初に結論 検証に利用するModelと関連設定 autosave オプション未指定時 子モデルごと新規作成 子モデルごと更新 子モデルにバリデーションエラーが発生する場合 autosave: true の時 子モデルごと新規作成 子モデルごと更新 子モデルにバリデーションエラ…

実装速度を向上させるためのセルフリファインメント

セルフリファインメントとは なぜセルフリファインメントなのか? どうやるか 具体例 最後に 実装速度を向上させる目的で最近個人的にやっている「セルフリファインメント」について紹介。 セルフリファインメントとは 「セルフリファインメント」というのは…

timecopはどのようにして時を止めているか

最初に結論 想定するケース コードリーディング 規模感の把握 .freeze の定義元へ向かう .send_travel の定義元へ向かう instance を調べる #travel の定義元へ向かう .send_travel を再確認 :thinking_face: time_extensions まとめ timecop というgemがど…

ruby-buildとrbenvのプラグイン機構

ruby-buildとは何か rbenv install コマンドはruby-buildが提供している rbenvはどのようにしてプラグインを読み込むか おまけ:さらに深ぼってみる まとめ 参考 前回の記事 に続いてrbenvネタ。 今回は、ruby-buildとrbenvの関係について。 ruby-buildとは…

rbenv rehashをちゃんと理解する

rbenv rehashとは何か rbenv initがやっていること いつ rbenv rehash を実行すればいいか 実際に試してみた rehashをいつ実行するか?の考察 まとめ 雰囲気で使っているものをちゃんと理解しようという取り組みを時々しており、今回は複数のバージョンのrub…

NERDTree上でファイルの新規作成、リネーム、削除をする

vim

小ネタ。 NERDTree というファイルエクスプローラ用のVimプラグイン上でファイルの新規作成やリネーム、削除をする方法をgif動画付きでご紹介。 ファイルの新規作成 NERDTreeを起動 → m キーでNERDTree menuを開く → a キーで新規作成 ファイルのリネーム NE…

ISUCON10予選にチームモツ鍋として参加した

事前準備 当日朝 予選開始 Botからのリクエストの遮断 MySQLサーバを分離 indexの追加 POST /api/estate/nazotte の効率化 レプリケーションの設定 アプリケーションサーバの複数構成化 バルクインサート 残り数分 全体を通しての感想 2020年9月12日に開催さ…

コードリーディング:DraperのDecorator探索ロジックを追う

想定する状況 最初に結論 コードリーディング Draper::Decoratable#decorate Draper::Decoratable#decorator_class Draper::Decoratable::ClassMethods#decorator_class 感想 Draper が、具体的にどういったロジックでDecoratorクラスを探索するかを調べた。…

instance_doubleとinstance_spyの使い分け

環境・バージョン #instance_double と #instance_spy の違い・共通点 Verifying Doubles as_null_object 存在するメソッドを自動でスタブするか否か APIドキュメントの説明を見る 使い分けの方針 その他参考資料 RSpecの #instance_double と #instance_spy…

IIJmioひかりのインターネットが遅くなってきたので、ルータを変えて接続方式もIPoEに変えたらかなり速くなった

自分はインターネット接続サービスとして IIJmioひかり を使っているのだが、ここ最近どうも速度が遅いなぁと感じていた。特に夕方以降は遅い。 以下は、インターネット回線の速度テストができる fast.com で計測した結果である。 速度には様々な変数が関わ…

git resetをちゃんと理解する

git

はじめに git reset コマンドは何をするのか HEADとは何か git reset [mode] [commit] git reset --soft HEAD^ git reset --mixed HEAD^ git reset --hard HEAD^ おまけ:ファイルパスを指定したgit reset 参考URL はじめに 過去を振り返ってみて、gitの理解…

【Rails】ActiveRecordでJOIN先のテーブルのカラムで絞り込む

#includes や #joins でテーブルをJOINしたときに、軸となるテーブルではなくJOIN先のテーブルのカラムで絞り込む方法について。 例として、デッキとカードという2つのモデルがありデッキがカードをN個持つ関係にあるとする。 app/models/deck.rb class Deck …

AWSアカウントとIAMユーザ

AWSのアカウントとかユーザといった概念をちゃんと理解できていなかったので調べてポイントになりそうなところだけ整理した。 AWSアカウント、ルートユーザ 「AWSを使うぞ」となったらまずアカウント登録が必要になるが、このとき最初に作成するアカウントが…

aws-sdk-s3 for Rubyを使ってみた

今更感があるが、Rubyのaws-sdk-s3 gemを使ってS3と戯れた記録を残す。 事前準備 Gemとしては aws-sdk-s3 だけ使えれば良いので、これをGemfileに書く。 # ./Gemfile source "https://rubygems.org" git_source(:github) {|repo_name| "https://github.com/#…

Rails6で導入されたinsert_all、insert_all!、upsert_allを使ってみる

環境 insert_all, insert_all! upsert_all その他のメモ Rails6にて insert_all, insert_all!, upsert_all という一括作成・更新の機能が導入された。 railsguides.jp これらのメソッドを、公式のAPIドキュメントを読みつつ手元の環境で実際に使ってみた記録…

【Ruby】rescueした例外のmessageを上書きしてre-raiseする

rescueした例外のmessageを上書きしてre-raiseしたい場合、Exception#exception を使うとスッキリ書ける。 https://docs.ruby-lang.org/ja/latest/method/Exception/i/exception.html 引数を指定しない場合は self を返します。 引数を指定した場合 自身のコ…

『雰囲気で使わずきちんと理解する!整理してOAuth2.0を使うためのチュートリアルガイド』がわかりやすくてオススメ

最近読んで良かった技術本『雰囲気で使わずきちんと理解する!整理してOAuth2.0を使うためのチュートリアルガイド』の紹介をしたい。 雰囲気で使わずきちんと理解する!整理してOAuth2.0を使うためのチュートリアルガイド (技術の泉シリーズ(NextPublishing…

現場で使えるRSpecパターン集 for Rails App

はじめに 検証環境、ライブラリ 基本方針 Request spec ステータスコードが xxx であること レスポンスボディに xxx が含まれていること データが新規作成されていること データが更新されていること データが削除されていること リダイレクトされること フ…

ActiveSupport::Concernが裏でやっていること

ActiveSupport::Concern を extend したモジュールは以下の機能が使えるようになる。 class_methods do .. end ブロックに定義したメソッドをクラスメソッドとして、include する側のクラスに取り込む included do .. end ブロックに定義した処理を include …

Rails の Flash の機能はどのように実現されているか

環境 事前準備 Flash は Rails 内部でどのように管理されているか 実際に動かして確認する Flash はどのようにして「直後のリクエスト」でだけ参照できるようにしているか 事象の確認 (1) Flashをセットするリクエスト(再掲) (2) Flashを参照するリクエス…

ecs-deployを使ったAmazon ECSへのデプロイの裏側

前提 全体的な流れ 現在のECSタスク定義を取得する 現在のECSタスク定義をベースに、新しいタスク定義を作成する 新しく作成したタスク定義をAWS上に登録する 新タスク定義を使うよう、ECSを更新をする デプロイの最終確認をする まとめ ecs-deploy というデ…

if-then-elseを使うかガード節を使うかの判断基準

最初に結論から 一方が正常な振る舞い、もう一方は特殊な振る舞いと考えられる場合はガード節を使う 双方とも同等に正常な振る舞いと考えられる場合は、if-then-else構文を使う 詳細 ガード節の有効性 プログラムを書いていると、様々な条件が考えられ、それ…

RubyのProcは `#call` 以外でも実行できる

Procオブジェクトは #call を使って実行することが多いと思う。 fn = Proc.new { |v| puts v } fn.call("Hello, world!") # => "Hello, world!" しかし、次のように [] を使っても実行できるのだ。 fn = Proc.new { |v| puts v } fn["Hello, world!"] # => "…

VSCodeでマウスを使わずにパネルサイズを調整する

自分は左側にエディタ、右側にターミナルという配置で作業をすることが多いのだけれど、作業中にパネルのサイズを調整したくなることがよくある。 左にエディタ、右にターミナルの図 このサイズの調整をマウスを使わずに行いたい!VSCodeにそういった機能は…

gRPC × Rubyのチュートリアルをカスタムしてやってみた

Protocol Buffersでサービスの定義を書く Protocol BuffersからRubyコードを生成する サーバの実装を書く クライアントからサーバへrpcリクエストを送る 番外編:インターフェース定義に反するレスポンスを返すとどうなる? gRPC公式のRuby版チュートリアル…

Rubyライブラリでよく見る `configure do ... end` による設定管理の仕組み

configure を使ったサンプルコード configure メソッドの実装 Configuration モジュールの取り込みとextend 設定項目の管理とクラスインスタンス変数 まとめ Rubyのライブラリで設定を管理するときに、次のようなパターンのコードをよく見ると思う。 Xyz.con…

Rubyの`&&`と`||`

&& && をよく使うのは、if 式などでの条件を書くときだろう。つまるところ真か偽の結果を得ることを期待していると思う。 cond1 = true cond2 = false cond3 = true if cond1 && cond2 # 実行されない end if cond1 && cond3 # 実行される end ここで気をつ…