[シェル変数] [環境変数] [カーネル] [OS] 等についての知識

概要

シェル シェル変数 環境変数 カーネル OS 等についての知識が乏しかったのでまとめてみる。

OSとは

OSは、Operating System(オペレーティングシステム)を省略した言葉。

もしパソコンにOSが入っていなかったら・・・

・電源を入れても画面に何も映し出されない。

・キーボードに何かを打ち込んでも、文字の入力ができない。

・マウスを動かしても、何もクリックできないどころか、カーソルすら表示されない。

と、OSが入っていないとパソコンの機能を一切使用することができません。

パソコンを人に例えるならば、OSは人格に相当します。

もし、OSが入っていないパソコンやスマホがあるならば、それは何も入っていない箱と同じです。

具体的には、WindowsmacOSなどなど

OSとは?パソコン初心者でも分かるようにやさしく解説

シェルとは

まずはこの図を見るとわかりやすい。

f:id:mmm_st:20211127142232p:plain

画像参照させていただきました。

【10分でわかるかもしれない】シェル(shell)とは?

カーネル → OSの中核。 アプリケーションの動作で使用されるリソースを管理している。

ターミナル → シェル操作に必要な画面を提供するソフトウェア。

結局シェルは何なのか

シェル → 「人からの入力をカーネルに伝え、コンピュータからの出力を人に伝えること」を行う。

ユーザーとカーネルを仲介してくれるソフトウェア

シェルスクリプトとは

シェルによって実行される一連を記述したスクリプト

→コンピューターに対する命令を書き込んだファイル。(mkdirとかcdとかも)

もっとわかりやすく言うとシェルで使用できるコマンドの寄せ集めファイル

ユーザーがこのコマンドを使用→シェルが解釈→カーネルへの伝達という流れになる。

シェル変数環境変数について

シェルは変数を持っている。2種類に分類できる。

変数はシェル変数環境変数に分類される。 (前提として変数は値を入れておく箱)

シェル変数とは

シェルの持ち物で、シェルが動いている時に使用できる変数。シェルスクリプトから、変数の中身を見たりする。

環境変数とは

PC(正確にはOS)が動いている時に使用する変数

シェル変数環境変数の違いは何?

一言で言うと、有効範囲(使用できる範囲)

シェル変数は現在実行しているシェルの中だけで有効な変数。

環境変数は新たなシェルを起動したり、コマンドを実行した場合にも継承される。

定義の方法

bashなどのBシェル系

シェル変数VERtestを設定。

VER = test

環境変数にするには...

VER = test
export VER

↑の2行をまとめて

export VER = test

Cシェル系

#シェル変数
set VER test

#環境変数
setenv VER test

削除(Bシェル系もCシェル系も同じ)

unset VER

現在の変数を見る(Bシェル系もCシェル系も同じ)

set VER

参照

【10分でわかるかもしれない】シェル(shell)とは?

https://wa3.i-3-i.info/word15402.html

https://wa3.i-3-i.info/word11221.html

カーネル(kernel)とは - IT用語辞典

シェル変数(shell variable)とは - IT用語辞典

シェル変数と環境変数

【Rails】について言葉でまとめてみた⑦[redis]・[ジョブ]・[rakeタスク]・[FatControllerの解消]・[form object]・[Json Serializer(fast_jsonapi)]・[GET, POST]・[HTTPステータス(404, 503など)]・[トランザクションとは?]

概要

言葉でまとめてみた⑦

[redis]・[ジョブ]・[rakeタスク]・[FatControllerの解消]・[form object]・[Json Serializer(fast_jsonapi)]・[GET, POST]・[HTTPステータス(404, 503など)]・[トランザクションとは?]について言葉で説明できるようにする

言葉でまとめてみた①はこちら

言葉でまとめてみた②はこちら

言葉でまとめてみた③はこちら

言葉でまとめてみた④はこちら

言葉でまとめてみた⑤はこちら

言葉でまとめてみた⑥はこちら

[redis]

Redisとは何か?どのような処理で利用するか?

キーバリュー型のNoSQLデータベース

Read/Writeが結構速くて高パフォーマンス

初心者による初心者のためのRedis解説

[ジョブ]

ActiveJobはどんなケースで使うか?

非同期処理の時に使用する。(javaScriptの非同期処理とは違い、サーバー側の非同期処理)

ユーザーが即時の結果を期待していない処理などをキューとして入れて裏側で実行する。メール送信など。

Ruby on RailsのActiveJobとは?

[rakeタスク]

rakeタスクはどのような処理で利用しますか?

決まり切ったコマンドを順番に実行したいとき。

cronを用いて自動で実行したい処理に使用する。

[FatControllerの解消]

FatControllerとはどのようなものですか?

controllerに処理を書きすぎて、肥大化した状態のこと。

また、どのように解消しますか?

Lintエラーで基準を設けてFatControllerを察知し、メソッドの切り出しなどをして察知されないようにコードをリファクタリングする。

メソッドの書き方の改善、Controllerの分割、Helper,Model,Decoratorへのメソッドの移動で解消する。

[form object]

form objectはどのような時に利用するか?

複数のテーブルに書き込みたい時。

1回のフォームで親子関係にあるモデルを同時に作成したい時に使用。 一つのトランザクションにまとめることで実現する。

モデルと紐づかない時に利用。(検索 カテゴリーを複数登録するときなど (モデルと一対一で紐づかない。))

[Json Serializer(fast_jsonapi gem)]

serializerは何?

変換してくれる。

Railsではモデルをjson形式に変換して返す。

fast_jsonapi gemを使用する理由は?

sorcery gemのように、fast_jsonapi gemを使用すると、便利に使用できるから。 (クライアントに返す情報を制限したりなど)

ActiveModel::Serializersを使ってサクサクjsonを出力しよう

[GET, POST]

リクエストメソッドのGET,POSTはどのように使い分けるか?

GETはデータをサーバーに送信せず、POSTは送信する。

GET → DBの内容(データ)を取得する。 リクエストボディを送信しないため、GETでコメントを投稿した場合は、内容をURL上に乗せてサーバー側にデータの保存を依頼してしまう。

POST → リクエストボディに、formの内容を梱包してサーバー側に投げる。

[HTTPステータス(404, 503など)]

知っているHTTPステータスコードと内容をざっくり教えてください

400 bad request リクエスト内容に誤りがある時

404 ページが見つからない。

503 今のような状態。

200 ok レスポンスのbodyに値が入っている時

204 no_content レスポンスのbodyに値が入っていない時

302 リダイレクト。転送。

304 リクエストされたリソースを再送する必要がない時

403アクセス権限が無くリクエストを拒否された時

先輩に学ぶ HTTP Status Code

[トランザクションとは?]

トランザクションとは?

・複数の処理のまとまりが全てが正常に終了しないと、全ての処理が実行前に戻る事

・データに矛盾が生じないようにするために、処理を1つの単位として捉えて、コミットもしくはロールバックを行う。

・1処理内で問題が生じなければコミットを実行して、データの変更(保存・更新・削除)を行う。

・逆に問題が生じたら、ロールバックを実行して、データの変更はなかったことにする。

transactionを使用するケースは?

銀行の振り込み

複数のデータ変更が発生しそうなケース 例:ECサイトでの購入処理 ・商品の在庫数を減らす ・決済処理 etc

例えば銀行の例だと 例:ATMでAさんがBさんに1万円振り込む場合、

①Aさんの口座から1万円引く。②Bさんの口座に1万円加える。の2つの処理が必要

①の処理の実行後、②の処理中にエラーになった場合、Aさんの1万円は闇に葬られてしまう。

これを避けるために①と②の処理でトランザクションを組み、②の処理でエラーになった場合は①の処理を実行する前に戻り、Aさんの1万円が減らなくて問題なし!

【Rails】について言葉でまとめてみた⑥ [他人の掲示板を編集・削除しようとした際の制御]・[collectionルーティング]・[has_many through]・[Railsにおけるajax処理]・[data-remote="true"によるajax処理]・[debuggerを使ったブラウザの検証ツールによるJavascriptコードのデバッグ]・[単一resource(ルーティング)]・[モデルに紐づかないコントローラの実装]・[sorceryのパスワードリセットモジュール]・[gem conf

概要

言葉でまとめてみた⑥

[他人の掲示板を編集・削除しようとした際の制御]・[collectionルーティング]・[has_many through]・[Railsにおけるajax処理]・[data-remote="true"によるajax処理]・[debuggerを使ったブラウザの検証ツールによるJavascriptコードのデバッグ]・[単一resource(ルーティング)]・[モデルに紐づかないコントローラの実装]・[sorceryのパスワードリセットモジュール]・[gem config]・[enum]・[ルーティングのnamespace]について言葉で説明できるようにする

言葉でまとめてみた①はこちら

言葉でまとめてみた②はこちら

言葉でまとめてみた③はこちら

言葉でまとめてみた④はこちら

言葉でまとめてみた⑤はこちら

[他人の掲示板を編集・削除しようとした際の制御]

BoardsControllerのedit update destroyアクションで Board.findを使ってリソースを取得していた場合、どの様な問題点があるか。またどの様な記載が望ましいか。

✖️ これだと、urlに自分のものではない投稿のidを含めると、編集画面に遷移することができてしまう。

def edit
  @boards = Boards.find(params[:id])
end

current_userを使用しているので、現在ログインしているユーザーの投稿の中からparamsの値を使用して投稿を探し、編集画面に遷移してくれる。

また、urlに自分のものではない投稿のidを含めた場合は、current_userの部分に反するので、404(NotFound)のページが表示される。

def edit 
  @boards = current_user.boards.find(params[:id])
end

[collectionルーティング]

membercollectionルーティングはそれぞれどの様な状況で使うか?

違い → ルーテイングにIDがつくかどうか。

memberIDがつく。モデルを個別に操作したい時。特定のリソースを操作したい時。

collectionIDがつかない。:idでurlを識別する必要がない場合に用いる。モデル全体の操作のみを行いたいとき。

[has_many through]

has_many through アソシエーションを設定するメリットは?

中間テーブルで結びついている他のテーブルの値を、中間テーブルを経由して取得することができる。

has_many: 関連名, through: 中間テーブルでユーザーがブックマークした投稿を取得する的な。

[ajax処理]

ajax(エイジャックス)とは何か

JavaScriptを使用して非同期処理を行う。

何が嬉しいか

非同期通信が可能になる。

ページの遷移やページ全体の再読み込みをその都度行わないで済むため、同期通信と比べてユーザーの待機時間が短くなり、利便性が高くなる。

ex)GoogleMAPとか

[data-remote="true"によるajax処理]

form_withのremote trueを有効にした場合、しなかった場合でその後のリクエストの通信にどの様な違いがあるのかを説明せよ。

data-remote="true"あり → Ajaxによって送信。js.erbファイルを探す。

data-remote="true"なし → HTTP通信でform内容を投げる。

[debuggerを使ったブラウザの検証ツールによるJavascriptコードのデバッグ]

JavaScriptのdebuggerメソッドについて。JavaScriptデバッグをターミナルではなく、ブラウザの検証ツールで行わなければならない理由を説明してください。

JavaScriptはフロントエンド(ブラウザで作動する)言語なので、ターミナルにログは表示されず、ブラウザ側の検証ツールにしか表示されない。デバッグにはconsole.log()も使用できる。

[単一resource(ルーティング)]

単一リソースはどんな時に使いますか?resources との違いも説明してください。

idを含める必要がないとき。

例えば、あらゆるユーザーは確実にプロフィールを一つしか持たなく、他人のプロフィールにアクセスする可能性はない 。 その場合ユーザーのIDの情報はシステムが内部的に保持していればよく、URLに視認できる状態で含める意味はない。この場合に単数形リソースを使用することで、通常/profile/:id/editのようになるURLを、/profile/editという形で生成できる。

resourceでルーティングをすると、indexアクションが作成されない。

逆にresourcesは記事などの複数作成でき、対象を絞る必要がある時に使用する。

[モデルに紐づかないコントローラの実装]

プロフィールの編集機能がUsersControllerではなくProfilesControllerで実装されている場合、どのような背景があると考えられるか?

IDを必要としないため。

分離することによって、UsersControllerの肥大化を防ぐため。

プロフィールに関することを、ProfilesControllerに集めることで、変更が容易になる。(*モデルに紐づかなくても操作可能)

プロフィール編集機能の実装

[sorceryのパスワードリセットモジュール]

sorceryのパスワードリセットにおいて、トークンの発行は何のために行なっているのかを説明せよ。

・パスワードリセットを申請した人物が、登録されているメールアドレスの保持者と同一人物であるかを判断するため。

・申請した人が同一人物なら、トークン付きのメールを開いて操作することができ、別人物ならトークン付きのメールを開くことができない(そもそもメールが届かない)。

1.メールアドレスを入力してパスワードの再発行の申請をする[createアクション4.まで]

2.サーバ側ではそのメールアドレスを元にusersテーブルから対象のユーザーを取得する

3.そのユーザーのtokenカラムに「1234abcd」を保存

4.そのトークンを付けたURLをメールでその人に送る

5.ユーザーはそのリンクをクリックする

6.パスワードリセットの画面に行く[editアクション7.まで]

7.パスワードを入力してリセットボタンを押す

8./password_resets/1234abcdにリクエストをなげる[updateアクション10.まで]

9.サーバ側ではリクエストに含まれているトークンをもとにユーザーを特定する

10.そのユーザーのパスワードを変更する

【Rails】パスワード変更(トークンがどのように使用されているのか)

[gem config]

どんな時に使用するか?使用するメリットは何か?

開発環境、本番環境、テスト環境で異なる値を使用したい時に一元管理できる。

【Rails】config について

[enum]

enumを使うことでのメリットは?

admin?のようなインスタンスメソッドや.adminのようなスコープなどの便利メソッドを提供している。

[ルーティングのnamespace]

ルーティングのnamespaceを使用する場面はどのような時?

名前の重複があるとき、衝突を防ぐために使用する。

管理者権限でしか閲覧できないページなど、ページ毎に意味の塊を持たせたい場面。

URLとファイル構成を指定のパスにしたいとき。

【Rails】routes.rb [member][collection][namespace][:shallow] 使い分け

【Rails】について言葉でまとめてみた⑤ [マイグレーション全般]・[ロールバック]・[バリデーションエラー発生時の挙動]・[scope]・[resoursesのネスト]・[application.html.erbのyieldって何をしているのか?]

概要

言葉でまとめてみた⑤

[マイグレーション全般]・[ロールバック]・[バリデーションエラー発生時の挙動]・[scope]・[resoursesのネスト]・[application.html.erbのyieldって何をしているのか?]について言葉で説明できるようにする

言葉でまとめてみた①はこちら

言葉でまとめてみた②はこちら

言葉でまとめてみた③はこちら

言葉でまとめてみた④はこちら

[マイグレーション全般]

migrationファイルで管理するメリットは?

DBのテーブル・カラムが適用済みかをデータとして保存しており、履歴を残すことができる。

SQLコマンドを知らなくても rails dbで操作できる。

[ロールバック]

ロールバックはどの様な処理か?migrationだとどのようなコマンドで実行するか?

DBの変更履歴をたどり、テーブルを過去の状態に戻す。

マイグレーションの状態をupからdownにする。

transactionの場合は?

トランザクションの場合は、処理を取り消して処理前の状態に戻すこと。

[バリデーションエラー発生時の挙動]

バリデーションエラーが発生したときのメッセージを、あなたならどの様に表示させるか?errorsもしくはerrors.full_messagesという言葉を使って説明してください

full_messages → 実際にビューに表示するのに適した文章に整形されたメッセージの配列を取得する。

<% @user.errors.full_messages.each do |message| %>
  <$= message %>
<% end %>

上記のようにeachを使用して配列からエラー分を1つずつ取り出し順に表示させる

[scope]

モデルでscopeを設定するメリットは何か?

頻繁に使用されるクエリに名前をつけて設定しておくことができ、コードが短く、かつ直感的に理解しやすくなる。

[resoursesのネスト]

どんなケースでネストさせると良いか?

モデル間関連付けが設定されており、親子両方の情報をURLに含めたい場合。

あるオブジェクトが必ず特定のオブジェクトに紐づいている場合(commentは必ずboardsに紐づいているような形。)

resources :parents do
  resources :children
end

=> /parents/:parent_id/children/:id といったURLが得られる

[application.html.erbのyield(イールド)って何をしているのか?]

yieldで、各テンプレートファイル(html.erbなど)の内容を挿入する。

【Rails】について言葉でまとめてみた④ [ルーティング(REST)]・[includes(N+1問題)]・[フォームヘルパー(form_with)]・[ストロングパラメータ]・[params]・[renderとredirect_toの違い]

概要

言葉でまとめてみた④

[ルーティング(REST)]・[includes(N+1問題)]・[フォームヘルパー(form_with)]・[ストロングパラメータ]・[params]・[renderとredirect_toの違い]について言葉で説明できるようにする

言葉でまとめてみた①はこちら

言葉でまとめてみた②はこちら

言葉でまとめてみた③はこちら

[ルーティング(REST)]

ユーザーを新規作成する際、どんなURL, どんなHTTPメソッドでリクエストを送りますか?RESTfulの考え方を用いて説明せよ。

URL: users

HTTPメソッド: POSTリクエス

→ POST/users

[includes(N+1問題)]

N+1について説明せよ

関連付けを持つあるモデル(A)について、検索をかける際に外部キー参照により関連するテーブル(B)の値も合わせて取得しようとした時、「まずAのレコードN件を取得するクエリが1回、次に各Aレコードに対して関連テーブル(B)の値を引っ張ってくるクエリがN回発行されてしまう」という問題。 見た目上は動くがパフォーマンスが悪い。

N + 1クエリ問題を解決する

[フォームヘルパー(form_with)]

Railsではform_withメソッドが提供されていますが、メリットは何か?

新規作成時・編集時に使用する。

その際にモデルのインスタンスを渡すとよしなにPOSTかPATCHを判断してくれる。Ajax通信を簡単に実現できる。

コントローラーで設定したインスタンス変数が永続化されていなければcreateアクション(新規作成)永続化されていればupdateアクション(編集)に自動で振り分けられる。

(persisted?を使用してコンソールで確認できる)

永続化されているかコンソールで確認してみる。

Board = Board.new
Board.persisted?
=>false

Board2 = Board.first
Board2.permit?
=>true

[ストロングパラメータ]

ストロングパラメータの存在意義は?仮にこれがなかった場合何がまずい?マスアサインメント(一括代入)という言葉を使って説明せよ

フォームにないデータをrequestした時にそれを弾くことができる

マスアサイメント機能(フォームから送られてきたパラメーターをひとつにまとめて、一度に保存できるRailsの機能)を使うと意図せぬ属性が紛れ込んでいるときに想定外の属性についても登録・更新されてしまう(勝手にadminとか作ったりできちゃう)ので、ストロングパラメーターで特定のパラメータを決めておくと安心!

Railsガイド strong-parameters

[params]

POST /boards/10/comments リクエストボディ comment: { body: “hello” }

・コントローラ側で10という情報を取得したい場合はどう書きますか?paramsを使って答えてください。例(params[:board_id])

params[:id]

・コントローラ側でhelloという情報を取得したい場合はどう書きますか?paramsを使って答えてください。

(params[:comment][:body])

・params.require(:user)の:userってHTMLのどこに対応したものですか?

<input type = "user" name = "user"[:email] >

name = "user"[:email]ここの部分に対応している。

[renderとredirect_toの違い]

renderredirect_toについて、それぞれの違いは?

300番代にステータスコードを返すか、200を返すか

redirect_to → HTTPリクエストを送信する。クライアントに返して、リクエストがクライアントからまたくる。routingactionviewの流れになる。

render → HTTPリクエストを送信しない。現在のページにリクエストしたviewを組みこむ。actionは経由しない。

【Rails】について言葉でまとめてみた③ [デバッグ]・[i18n]・[decorator]・[アソシエーション]・[dependent: :destroy]・[DB側の制約(not null制約、外部キー制約)]

概要

言葉でまとめてみた③

[デバッグ]・[i18n]・[decorator]・[アソシエーション]・[dependent: :destroy]・[DB側の制約(not null制約、外部キー制約)]について言葉で説明できるようにする

言葉でまとめてみた①はこちら

言葉でまとめてみた②はこちら

[デバッグ]

デバッグでどんなことを確認するか?

変数の中身、メソッド戻り値、paramsに入っている値など

[i18n]

i18nとは何か。i18nについて、日本語と英語でページを出し分けるときに、localeという単語を使って、どの様に翻訳処理が行うのかを簡単に説明せよ。

Railsのアプリケーション内で複数の言語を併用する仕組み。

config/locales下にymlファイルを作成する。(英語であればen.yml、日本語であればja.yml)。userクラスにlocaleという属性を設定し、beforeアクションにてcurrent_userのlocaleを確認するメソッドを定義すればユーザーごとに言語を切り替えられる。

Railsガイド Rails 国際化 (i18n) API

[decorator]

decoraterは何のために必要か?

既存のオブジェクトをラッピング(包み込む)ことで、既存のオブジェクトを変更することなく、機能(メソッド)を追加したりできる。

Helperと何が違いますか?

decoraterはmodelに依存するロジックを書く。(last_nameとfirst_nameを合わせたfull_nameみたいな。)

user_decorator.rbboard_decorator.rbに同じ名前のロジックを使用しても問題ない。

Heplerはview全体に関係するようなものを書く。(ページのタイトルを動的に切り替える等のロジック。)

helperはグローバルなので、user_helper.rbboard_helper.rbに同じ名前のロジックを使用してしまうと、どっちのロジックを使用するのかRailsがわからなくなってしまう。

どのviewからも使用できるように。

ロジックをViewに書くことの問題点は何でしょうか?

ロジックをviewに記述するとviewファイルが肥大化(fat化)し、可読性が低下する。

[アソシエーション]

アソシエーションの定義をモデルに書くと、具体的にどの様な変化があるか?

メソッドチェーンを使用して他のモデルの値を取ってこれるようになる。

ex)

#Board.where(user_id: user.id)が以下の1行で持って来れる
user.boards

UserモデルとPostモデルがあるとした場合、1人のユーザーは複数の投稿できるので、Userモデルにhas_many: postsと記載する。 逆に1つの投稿は1人のUserが所有するので、Postモデルにbelongs_to :userと記載する。

Railsガイド has_manyで追加されるメソッド

[dependent: :destroy]

dependent: :destroyの使い方

モデル間のリレーションが設定されている場合、この設定をした親モデルが削除される時、関連する子モデルも同時に削除され、参照先が存在しないというバグを防ぐ。

UserとPostモデルがあるとした場合、1人のユーザーは複数の投稿ができるので、Userモデルにhas_many :posts, dependent: :destroyと記載する。

Railsガイド 4.3.2 has_manyのオプション

[DB側の制約(not null制約、外部キー制約)]

モデルのバリデーションだけでなくDBの制約もかけたほうがよい理由を説明せよ

SQLから直接データを入力するとバリテーションをすり抜けて登録されてしまうから。

【Rails】について言葉でまとめてみた② [処理の全体象]・[セッション/クッキー]・[バリテーション]

概要

言葉でまとめてみた②

[処理の全体象]・[セッション/クッキー]・[バリテーション]について言葉で説明できるようにする

言葉でまとめてみた①はこちら

[処理の全体象]

Railsアプリで、Boardの一覧画面を見るために、ブラウザのアドレスバーにURLを打ち込んで、表示されるまでの流れ

クライアント → HTTPリクエスト → ルーテイング → コントローラー → モデル → DB → ビュー → HTTPレスポンス → クライアント

これを言葉にすると

ブラウザからサーバーにリクエストが渡り、railsがリクエストを解析、routingを参照して処理するコントローラとアクションを決定、コントローラでDBへの参照が必要ならActiveRecordを介してやり取りし、DBから値を取得。Viewに値を埋め込んでHTMLや画像、cssなどのアセットファイルを含めてブラウザに返す。ブラウザはレスポンスからHTML,css等を解析して装飾して画面に表示する。

[セッション/クッキー]

ログインの仕組みをセッション、Cookieという単語を使って説明せよ。(HTTP、ステートレスなどの単語も出てくるとGOOD)

HTTPリクエスト → ステートレスなので状態を保持できない。(1回のやり取りで処理が完結してしまう為、1回目のリクエストとレスポンスと2回目のリクエストとレスポンスに繋がりがない)

セッション → サーバー側で保存されている小さな情報またはその領域

Cookie → クライアント側で保存されている小さな情報またはその領域

ログイン → セッションとかCookieにユーザーの情報を保存することで異なるHTTPリクエストに繋がりを持たせること

例えば...通販などで、商品選択して、選択一覧画面を見ると中身が入っていない。みたいな

参照

Railsガイド セッションストレージ

Railsガイド セッション

Railsガイド Cookie

HTTP はステートレス

[バリテーション]

savesave!(エクスクラメーションマーク付き)の挙動の違いは?使い分けは?

save → 失敗したらfalseが返る

save! → 失敗したら例外が返る

saveは失敗することを想定している処理に使用し、save! は失敗しないはずの処理に使用する。

Railsガイド バリテーション