Doiya’s blog

日々の進捗を書く雑記ブログ(メインはエンジニアやプログラミング関連)

基礎編 総復習 その3

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

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

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

・申請した人が同一人物なら、トークン付きのメールを開いて操作できるはず。

・逆に別人物ならトークン付きのメールを開けないはず。

以下の手順でやる。

1: メールアドレスを入力してパスワードの再発行の申請をする

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

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

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

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

6:パスワードリセットの画面に行く

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

8:/password_resets/1234abcdにリクエストをなげる

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

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

34 gem config

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

・Railsで便利に定数を管理できる。

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

#透過的(アプリを使用する時)

35 enum enumを使うことでどんなメリットがありますか?

class Article
  enum status: { draft: 1, published: 2 }
end

Article.where(status: 1)
Article.draft #集合とる

article = Article.first
article.update(status: 2)
article.published! #ステータス変える。

article.status == 1
article.draft? #ステータス確認。
・1カラムに多数の定数を含めることができ、選択肢を使うバリデーションを指定する時に便利。
DB上ではintegerで管理されているため、値を変更する際なども楽。

・文字列と数値を関連付けて、DBには数字が保存されて、画面に表示される時は文字列が表示される。
(数値:1、2、3, 数字: いち、に、さん)

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

36 ルーティングのnamespace

ルーティングのnamespaceはどのような場面で使いますか?

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

・管理者権限でしか閲覧できないページなど、ページ毎に意味の塊を持たせたい場面。
 
・管理者が行える操作と一般ユーザーが行える操作をURLレベルで分けたいとき。

37 redis

応用編で利用したRedisとは何ですか?どのような処理で利用しますか?

メリット
・キーバリュー型のNoSQLデータベース
・Read/Writeが結構速くて高パフォーマンス
・redisを使うとセッションidを保存できるとかいう話があった気がする。

デメリット
・joinができない

38 ジョブ

ActiveJobってどんなケースで使いますか?

・非同期処理(ex:slack通知)。
・ユーザーが即時の結果を期待しない処理などをキューとして入れて裏側で実行する。
・メール送信など。

ps cookie storeは危ない。(なりすましの被害起きる可能性大)

余談やけど面接でcookie storeの話をすると、「できる奴!」と評価が上がるらしい。

RailsのCookieStoreの脆弱性について - 平凡なエンジニアの独り言

Rails SessionにCookieStore使った時の問題点 - OAuth.jp

39 rakeタスク

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

・決まり切ったコマンドを順番に実行したいとき
・ブラウザなどからアプリケーションを起動することなく、ターミナル等からアプリケーションを操作、処理を実行する。
一般ユーザーに対してインターフェイスは実装されていないが、開発者は利用したい処理を定義する(例としてはCSVのインポート・DBに保存されているデータの一括編集などがよく挙げられていた)。
・データベースの作成、移行の実行、テストの実行のための事前定義する。

40 FatControllerとはどのようなものですか?また、どのように解消しますか?

・controllerに処理を書きすぎて、コードが読みにくくなること。

・各アクションの中の記述が多いために行数全体が肥大化したコントローラ。
Lintエラーで基準を設けてFatControllerを検知、コントローラーの切り出しなどをして検知されないようにコードをリファクタリング。
処理部分のメソッドをmodelに書く。

・そのコントローラの責務を超えた処理をコントローラ内で行っている。

41 form object

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

・一回のフォームの送信で親子関係にあるモデルを同時に作成したい時に利用。
・一つのトランザクションにまとめることで実現。
・モデルと紐づかないformを作成したいときに利用する。

42 Json Serializer(fast_jsonapi)

serializerは何のために利用しますか?

・シリアライズ化がより便利になる。(socery的な)
・モデルのカラムからクライアント側に送るカラムを制限する(noteのIPアドレス流出)

ps  json形式は、フロントサイドのフレームワークで用いる。(ex react.js)  暗号的な画面が出る。 使う理由としては、フロントのHTMLのデータを暗号的な画面をコピペして取り込む。

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

・GETはデータをとりにいく。POSTはデータを送信する。

・GETはブラウザのURLに表示される。
ex. http://localhost:3000/task/?p=1
なのでパスワードなどをGETで送るのはNGです。
POSTはURLには表示されず、裏側でデータを送信する。
サーバーに送信したデータを開発ツールでみることができる。

・user_idなど他者に知られてもいい情報や知り合いと共有したいこと(例えば、店の名前)はURLに仕込んでGETを使う。
 一方、フォームに入力した情報やsessionなどの重要な情報をサーバーに送りたいときにPOSTを使う。

44 HTTPステータス(404, 503など) 知っているHTTPステータスコードと内容をざっくり教えてください

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

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

503 今のような状態。

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

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

302 リダイレクト。転送。

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

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

先輩と覚える HTTP ステータスコード · GitHub

45 トランザクションとは?なぜ使うのか?

transactionってどのようなケースで使いますか?

<< トランザクションとは? >>《T》

データに矛盾が生じないようにするために、処理を1つの単位として捉えて、コミットもしくはロールバックを行う。
1処理内で問題が生じなければコミットを実行して、データの変更(保存・更新・削除)を行う。
逆に問題が生じたら、ロールバックを実行して、データの変更はなかったことにする。
<< どのようなケースで使うか >>《T》

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

最もよく語られる例
・銀行の振り込み
いくつかの処理を一まとめとして扱い、うち一つでも処理が失敗した場合に全ての処理をなかったことにする。
途中で中断されてしまった場合に不具合が生じるような作業に使用する。
(例:銀行の振り込みで、「1.A口座から減額 → 2.B口座を増額」という処理がある場合、
1は正常に行われたがBは失敗、しかしそのまま作業が完了、となると整合性が取れなくなる)