MogLog

日記 兼 備忘録

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 ここで気をつ…

mysqldumpに`--complete-insert`オプションをつけるとカラム名を含むINSERT文を出力してくれる

mysqldumpコマンドのデフォルト状態で出力されるINSERT文にはカラム名の情報が含まれていない。以下例(※ 見やすいようにインデントしている)。 INSERT INTO `users` VALUES (1,'taro',20,'male',1,'2019-02-13 23:44:02','2019-02-13 23:44:02'), (2,'jiro…

RSpec with Railsでテスト時のデータはどのように削除されているか

use_transactional_fixtures 削除の仕組み before(:each) と before(:all) Tips 参考リンク RailsアプリでRSpecを使うと通常example実行のたびにデータが削除されるようになっているが、これが具体的にどのように行われているかについて。 検証環境は以下の…

書き出して自分と対話・思考しながら仕事を進めるスタイルとそれについて考えたこと

ふと考えたことをとりとめもなく書いてみる。 書きながら自分と対話・思考しながら物事を進めるスタイル 自分は仕事をするときに、作業の記録を書き残しながら進めることが多い。 書いているのは以下のような内容。 何のためにやるのか どうしてやることにな…

「既存のコードがそうなっているから」は逃げる理由になりがち

何らかの追加実装の作業をしているとき、往々にして既存のコードと類似した実装をする、あるいはそうできる場面に遭遇することがあると思う。 このような時、既存のコードと同じパターン・同じ構成で実装するというのは1つの選択肢になる。 なぜならそのよう…

【Rails】データベース名を明示せずにActiveRecordでMySQLに接続する

環境 Rails 5.1.6 MySQL 5.7.21 状況 データベースはまだ存在しないが、ActiveRecordでMySQLへの接続だけは確立したい。 何も考えずに次のようなコードを実行すると... ApplicationRecord.connection.execute("<なんかSQL>") 次のようなエラーが起こる。 Act…

【Rails】app/以下に新規作成したディレクトリのファイルが読み込まれない件

結論:springの再起動が必要だった あらまし Ruby On Railsアプリケーションの開発中、app/以下に新しくvalidatorsというディレクトリを作ることになった。 最近のRailsではapp以下のファイルを自動で読み込んでくれるようになっているので、追加の設定は不…

draperを使ってみた

draperとは なぜdraperを使うのか 使ってみる セットアップ デコレートメソッドを追加する Controllerでモデルをデコレートする Viewでデコレートメソッドを呼び出す アソシエーションに対応する その他のメモ draper というデコレーター(またはプレゼンタ…

ActiveModel::Serializersを使ってみた

出鼻をくじかれる README.mdを読んだ fast_jsonapiの登場 Getting Started アソシエーションに対応させる アダプタを切り替える 独自の属性を追加する その他気になった機能 使ってみての雑感 ActiveModel::Serializers(AMS) という、出力するJSONをいい感じ…

SOP(Same Origin Policy)とCORS(Cross Origin Resource Sharing)について調べた

Web

SOP(Same Origin Policy)の理解が怪しいなぁと思ったのでちゃんとした仕様を調べた。 同時にCORS(Cross Origin Resource Sharing)についても調べることになったのでまとめて整理した。 SOP(Same Origin Policy: 同一生成元ポリシー) Webブラウザなどの…