テストを書く上で、「モック」と「スタブ」といったものを利用します。 「モック」と「スタブ」についてまとめます。 前提 「モック」とは 「スタブ」とは 前提 ここでは、テストしたい対象オブジェクトをオブジェクトAとします。 そして、オブジェクトAはオブジェクトBを持っています。 オブジェクトBはメソッドfを持ちます。 「モック」とは テスト対象はオブジェクトAです。 そして、オブジェクトAではオブジェクトBのメソッドfを呼び出しているとします。 このとき、オブジェクトBのメソッドfの挙動をテストする必要はありません。 なぜなら、この場合のテスト対象は「オブジェクトA」であるからです。 ここでは、…
前回RSpecを使ってみました。 utouto97.hatenablog.com その中で、eq を使いました。 RSpecには、eq以外にも多くのMatcherが用意されています。 基本的なMatcherの使用例 a = b aとbが等しい a ≠ b aとbが等しくない a < b aがbより小さい a >= b aがb以上 a = 0 aが0 aが空 aがt型 aはtのインスタンス 基本的なMatcherの使用例 a = b aとbが等しい expect(a).to be eq(b) a ≠ b aとbが等しくない expect(a).not_to eq(b) a < b aがbより小さ…
Rubyテスティングフレームワークで人気の高いRSpecを使ってみます。 RSpecのインストール テスト対象のクラス RSpecでテストしてみる テストの記述 テストの実行 テスト失敗 RSpecのインストール RSpecを使ってテストしてみたいと思います。 まず、第一歩としてインストールからやっていきます。 Ruby環境は次の通りです。 $ ruby -v ruby 3.0.1p64 (2021-04-05 revision 0fb782ee38) [x86_64-linux] RSpecのインストールは、Gemでインストールすることができます。 ここでは、Gemfileに記述し、bund…
Ruby用テスティングフレームワーク RSpec Ruby用テスティングフレームワーク テストをRubyで書きたい、となったときに利用するフレームワークとしてどのような選択肢があるのでしょうか。 Ruby用ユニットテストのフレームワークです。 Test::Unit Rubyに標準搭載されている シンプル minitest Railsのデフォルト シンプル RSpec 高機能 Test::Unitやminitestは、RubyやRailsのデフォルトとなっており、テストもシンプルに記述できる。 ただし、機能面において、高機能でなんでもできるRSpecの人気が高いようです。 RSpec RSpec…
tmp - うとうとしながら。
utouto97.hatenablog.com 準備 同名のユーザーを追加してみる ApplicationRecord.transactionを試す 準備 以下のようなUserモデルを作成します。 validatesで:nameがユニークであることを確認します。 class User < ApplicationRecord validates :name, uniqueness: true end 同名のユーザーを追加してみる :nameがKenであるユーザーを追加します。 > User.create!(name: "Ken") 確認してみます。 >User.all.select("name"…
トランザクションとは Railsでトランザクション トランザクションとは トランザクションは処理のまとまりです。 銀行の振り込みがトランザクションの例としてよく挙げられると思うので、ここでも銀行振り込みを例にします。 AさんからBさんの口座への振り込みを考えると、 Aさんの口座額を減らす Bさんの口座額を増やす という、二つの処理をする必要があります。 そして、これらの処理はひとまとまりである必要があります。 「1. Aさんの口座額を減らす」だけ処理されて、「2. Bさんの口座額を増やす」が処理されなかった場合、おかしなことになります。 そのため、これら二つの処理はひとまとまりで処理されるべき…
RailsでN+1問題を検出するBullet Bulletを実際使ってみる (Rails) N+1問題を発生させる (TodoとUser) Bulletをインストール N+1を検出するとアラート発生 RailsでN+1問題を検出するBullet N+1問題とその解消方法について、以前まとめました。 そんなN+1問題を検出するライブラリがRailsにはあります。 Bulletというライブラリです。 github.com Bulletを実際使ってみる (Rails) N+1問題を発生させる (TodoとUser) 以前にN+1問題をまとめた記事のTodoとUserのN+1を検出してみます。 uto…
対象のN+1問題 N+1問題を解消する 対象のN+1問題 前回、触れたN+1問題を今回は解消します。 utouto97.hatenablog.com ↓で起こっているN+1が対象です。 <% @todos.each do todo %> <div> <%= todo.title %> : <%= todo.user.name %> </div> <% end %> N+1問題を解消する RailsでN+1を解消するには、includesを使えばいいです。 変更前は、↓のようにTodo一覧を取得しています。 def index @todos = Todo.all end これにinclude…
前回、ORMについてまとめました。 SQLを書かなくてもDB操作を簡単にできて便利なORMですが、 N+1問題という問題があります。 N+1問題とは RailsでN+1問題を試す N+1を確認する N+1問題とは N+1問題とは、ループ処理の中で、1回ずつクエリを発行してしまう問題です。 これにより、無駄なクエリが発行され、パフォーマンスの低下を招きます。 より具体的にいうと、Todoの一覧を取得し、Todo一つずつの担当ユーザー(User)を表示しようとするとき ループを使って記述すると、合計でN+1回のクエリが発行されます。 Todoの一覧を取得(1回) Todoの担当ユーザーを取得(N回…
ORM (オブジェクト関係マッピング) とは 各言語の有名ORM ORM (オブジェクト関係マッピング) とは ORMとは、Object-Relational Mappingの頭文字をとったものです。 その名前からわかる通り、オブジェクトと関係(関係データベース、RDB)とのマッピングを行うものです。 ここでの、オブジェクトとはオブジェクト指向におけるオブジェクトのことであり、関係とはRDBのことです。 多くのプログラミング言語はオブジェクトを扱うので、そのオブジェクトをRDBに保存できるように、対応付けを簡単にするためORMを使います。 もっと簡単にいうと、SQLを直接書くことなく、オブジェ…
前回、Babelでトランスパイルを試してみました。 utouto97.hatenablog.com このとき、利用したBabelのバージョンは7です。 $ > ./node_modules/.bin/babel --version 7.14.5 (@babel/core 7.14.6) Babel7では、設定ファイルとして.babelrcファイルだけではなく、babel.config.jsファイルも利用できるようです。 そこで、.babelrcとbabel.config.jsの違いや使い分けについて調べてみました。 Babelのドキュメントで言及されていました。 babeljs.io Proj…
Babelとは Babelを使ってみる Babelのインストール presetを設定 トランスパイルする Babelとは BabelはJavaScriptのトランスパイラです。 トランスパイラは、あるプログラミング言語で書かれているプログラムを違う言語もしくは違うバージョンの言語のプログラムに変換します。 Babelは、JavaScriptのプログラムをJavaScriptのプログラムに変換します。 より具体的には、新しいJavaScriptのプログラムを、古いJavaScriptのプログラムに変換します。 なぜ、新→古の変換の必要があるのか、というと、ブラウザの対応状況がそれぞれ異なるからで…
ES modules と CommonJS - JavaScript入門
ES modules と CommonJS import/export (ES modules) と require/exports (CommonJS) ES modules と CommonJS JavaScriptで、モジュールという仕組みがあります。 外部ファイルの読み込み/書き出しを行うための仕組みです。 import/exportが、モジュールの仕組みの一つです。 モジュールの実現方法として、主なものがES modulesとCommonJSです。 ES modulesは、ES2015で策定された仕組みです。 ブラウザで実行されるJavaScriptでもNode.jsでも利用できます…
tmp - うとうとしながら。
Expressでルーティング処理を行う express.Router Expressでルーティング処理を行う ExpressのWebサーバーで、ルーティング処理を行うのはとても簡単です。 次のように初期化したappのgetメソッドやpostメソッドで設定できます。 var express = require('express') var app = express() app.get('/', (req, res) => { res.send('Hello world!') }) app.post('/', (req, res) => { res.send('Hello Post') }) a…
Expressとは Expressをインストールする ExpressでHello world Expressとは Expressとは、Node.jsのWebアプリケーションフレームワークです。 RailsのNode.js版みたいなイメージです。 ルーティングやリクエストボディのパースなどもできます。 また、ミドルウェアを利用して認証なども行えます。 Expressには、多くのライブラリが存在し、npm等で簡単にインストールすることができます。 Expressをインストールする Expressはnpmを使って簡単にインストールすることができます。 まず、npmプロジェクトを作成します。 $ np…
はじめに Dockerを使ってNode.js環境を構築する はじめに Dockerを使ってNode.js環境を構築する 終わり
Dockerを使うためには、dockerコマンドを多用しますね。 $ docker ps $ docker build $ docker run $ docker logs ですが、dockerコマンドを実行するためには、権限が必要です。 毎回sudoをつけるのも大変ですし、sudoユーザーじゃないユーザーはdockerを使えないことになってしまいます。 実は、Docker用のグループdockerが存在しています。 このdockerグループに入っているユーザーは、dockerコマンドを実行することができます。 次のコマンドで現在のユーザーをdockerグループに追加できます。 $ sudo g…
Node.jsでhttpサーバーを秒で建てる GETパラメータを処理する。 Node.jsでhttpサーバーを秒で建てる 前提として、Node.jsがインストール済みであるとします。 では、速攻でhttpサーバーを構築します。 まず、ファイルapp.jsを作成します。 $ touch app.js ファイルを編集します。 次のようにします。 1 const http = require('http'); 2 3 const hostname = '127.0.0.1'; 4 const port = 3000; 5 6 const server = http.createServer((req…
JavaScriptはブラウザ上で動作する JavaScriptを実行できるアプリケーションNode.js Node.jsでHello world! JavaScriptはブラウザ上で動作する JavaScriptはHTMLやCSSで記述されたWebページに動きをつけるために、ブラウザ上で実行可能な言語でした。 ChromeやFirefoxなどのブラウザ毎に、JavaScriptを実行できるエンジンが実装されており、それによりJavaScriptは動作します。 JavaScriptというプログラミング言語を習得しても、ブラウザ上で動作するアプリケーションしか開発できませんでした。 JavaSc…
JavaScriptのasync JavaScriptのawait JavaScriptのasync JavaScriptで非同期処理を書く方法は、コールバック関数、Promise、そしてasyncがあります。 asyncは関数宣言につけることができ、asyncを付けた関数は非同期で処理されます。 async function f() { 何らかの処理 } asyncを付けた関数はPromiseを返すようになります。 そして、関数内でreturnした場合は、Promiseのresolveが呼ばれるように変換されます。 また、関数内でthrowした場合は、Promiseのrejectが呼ばれるよ…
非同期処理 (Promise) - JavaScript入門
JavaScriptの非同期処理 非同期処理とコールバック関数 JavaScriptにはPromiseがある JavaScriptの非同期処理 JavaScriptでは、非同期処理を行うことができます。 非同期処理とは、その処理の完了を待たずにほかの処理が実行される処理のことです。 タイマーや外部APIとの通信のように、待ちが発生してしまう処理を非同期で処理することで、処理が止まってしまわないようにします。 イメージを載せておきます。 そして、非同期処理の完了後に何か処理をしたい場合があると思います。 (例えば、APIをコールしてその結果を使いたい場合) そのようなときに、利用できる方法がJa…
JavaScriptのコールバック関数と高階関数 高階関数とコールバック関数の例 コールバック関数は非同期処理で使われる setTimeoutの例 JavaScriptのコールバック関数と高階関数 JavaScriptでは、関数はオブジェクトの一種である。 そのため、関数の引数を関数とすることもできます。 そして、関数を引数にとる関数を高階関数といいます。 逆に、関数に引数として渡される関数をコールバック関数といいます。 ↓はコールバック関数のイメージです。 真ん中の白い関数は、引数の一つとして黄色い丸のfunctionを受け取っています。 つまり、真ん中白い関数が高階関数で、黄色い丸のfun…
JavaScriptの変数・定数 varとletとconstの比較 再代入と再定義 varとletとconst 巻き上げについて JavaScriptの変数・定数 JavaScriptにもほかの言語同様に変数と定数があります。 今回は、その変数と定数の宣言方法をみていきます。 変数の宣言はいくつか方法があります。 それらの違いで重要なものとして、再代入と再定義があります。 varとletとconstの比較 再代入と再定義 JavaScriptの変数・定数の宣言方法の違いで、再代入と再定義が重要になってきます。 再代入 再代入可能は、その変数への代入が何度でも許されていることになります。 逆に、…
JavaScriptで関数を宣言する function を使う 無名関数 アロー関数を使う JavaScriptで関数を宣言する 関数は、引数をとり、処理を行い、値を返すものです。 イメージはこんな感じ 関数は、何かしらの処理をします。 ここでは、足し算を行う関数を考えます。 例えば、引数として2と3を渡した場合、関数は処理の結果5を返します。 JavaScriptで関数を宣言(定義)する方法はいくつかあります。 それらをまとめていきます。 ここでは、二つの引数をとり、それらを足した結果を返す関数を宣言します。 function を使う 一つ目の方法は、functionを使う方法です。 以下の…
JavaScriptのforEach forEachでインデックスも取得する JavaScriptのforEachから途中で抜ける (breakは使えるのか) JavaScriptのforEachでbreakは使えない breakの代替手段 continueについて JavaScriptのforEach JavaScriptでは、forEachを使ってループを記述することもできます。 ただし、JavaScriptのforEachは、配列(Array)のメンバメソッドであるため、配列(Array)でしか利用することができません 以下のように使います。 (arrは配列) arr.forEach(値…
繰り返し処理あれこれ (for, while, for) - JavaScript入門
JavaScriptの繰り返し処理 JavaScriptでforを使う for (基本) for ... in ~ for ... of ~ JavaScriptでwhileを使う JavaScriptの繰り返し処理 JavaScriptでは、ほかのプログラミング言語と同様に、forとwhileを使って繰り返し処理(ループ処理)を記述できます。 また、配列(Array型)なら、forEachを使って一つ一つ処理することができます。 forEachを使えば、インデックスと値のペアを一つずつ取得することもできます。 今回は、forとwhileの使い方をまとめます。 JavaScriptでforを使…
git merge Fast-forward Fast-forwardではないマージ コンフリクト git merge git mergeで複数のブランチを一つにまとめることができます。 前回↓も少し使ってみました。 utouto97.hatenablog.com Fast-forward 前回のマージは以下のパターンになります。 この場合だと、masterブランチをdocブランチのところまで進めるだけになります。 特に編集も必要ないです。 Fast-forwardではないマージ 以下のような場合、Fast-forwardとはなりません。 この場合は、masterブランチとdocブランチがそれ…
git branch 新しいブランチを作成 ブランチでファイルを編集する ブランチを統合する git branch Gitでは,変更の履歴をつないで管理します。 その一つ一つをブランチといいます。 ブランチは途中から分岐したり、また一つになったりすることができます。 これにより、開発がしやすくなります。 まず、ブランチの一覧を確認してみます。 この時点でファイルはREADME.mdのみで中身は空です。 $ git branch * master masterというブランチが一つあることが確認できました。 新しいブランチを作成 続いて、このmasterブランチからdocブランチを作ります。 $ …
↓の続き utouto97.hatenablog.com 試してみる デフォルトタスク ネームスペース cleanタスク 試してみる デフォルトタスク task default:を設定することで、デフォルトで実行されるタスクを設定することができます。 デフォルトタスクは、rakeコマンドが引数なしに実行された場合に実行するタスクです。 前回、作成したsample_task1をデフォルトタスクに設定してみます。 task default: :sample_task1 引数なしでrakeコマンドを実行してみます。 $ docker-compose run ruby sh -c "cd /work …
「ブログリーダー」を活用して、utouto97さんをフォローしませんか?
指定した記事をブログ村の中で非表示にしたり、削除したりできます。非表示の場合は、再度表示に戻せます。
画像が取得されていないときは、ブログ側にOGP(メタタグ)の設置が必要になる場合があります。