「DIVE INTO CODE」学習記録 22日目
こんにちは。
22日目。非同期通信について理解する。そもそも「同期する」とは。
学習内容
【クエリの使い方】
- pluckメソッドで任意のカラムデータを配列で取得
- テストケースの考え方
- limitメソッドで特定のレコード件数を取得
- ある年に、もっとも勝利したピッチャーのplayer_idを配列で取得するメソッド
- ある年に勝利した順に、10人ピッチャーのplayer_idを配列で取得するメソッド
- ある年に、あるチームの中でもっとも勝利したピッチャーのplayer_idを配列で取得するメソッド
- 指定された期間の中でもっとも勝利したピッチャーのplayer_idを配列で取得するメソッド
- ある年で最も費用対効果が高かった投手のplayer_idを配列で取得するメソッド
- N+1問題とは
- includeメソッドで関連するテーブルをまとめて取得
【テーブル設計概要】
- テーブルとは
- なぜDBが必要か
- なぜDBMSが必要か
- 主キーと外部キー
- NOT NULL制約、一意制約、CHECK制約
- 正規化とは
- テーブルの正規化手順(第一、第二、第三正規化)
【Active Job】
- 非同期処理について
- Active Jobについて
- Delayed JobでActive Job実装
- JobとJob管理テーブルとエンキューとワーカー
- perform_laterメソッドでエンキュー
- setメソッドでJob実行のタイミングをコントロール
- have_enqueued_jobマッチャ
- letter_openerを使った非同期メール送信機能実装
- 本番環境設定方法
感想
今回は、クエリの使い方としてテスト駆動開発の実践と、テーブル設計概要、最後にActive Jobと非同期処理について勉強しました。
テスト駆動開発はRSpecフレームワークを使い、csvファイルで投入した野球選手のデータから特定のデータを取り出すメソッドを書き、それが正常に機能しているかをテストするものです。
テストがあると確かにどこでうまく行ってないのかが分かりやすいので、
あーなるほど、
ってなることは多かったです。
ただアプリ開発する前にテストの話聞いてもあまり必要性がわかんないというか。
テストを必要とするところまで達してない今の状況で勉強するのは早いんだろうなと。
こういうのもあるんだ程度に学習しました。
テーブル設計概要は、今後アプリケーション開発するにあたって必要なテーブルの設計手順や正規化、
テーブルについて曖昧だった箇所を再度教えてくれました。
テーブル設計するときはもう一度このテキストみよう。
今回メインでやったのはActive Job。というより同期処理と非同期処理について。
前々回あたりでAjaxを勉強してた時に、
「JSでHTML変えるとき、非同期通信なのにいつDBと通信しているんだろう」
ってなんかしっくりきてなかった箇所がありました。
そもそも同期通信てなんだ。
「同期」という言葉の意味から曖昧だったわ。
まず「同期」とは。
「同期」は割と多義語です。
- 二つの箱の中身を同じにすること。
- 何かと何かを同じになるよう調整すること。
- 相手の反応をちゃんと待って行動すること。
- 同じ時期のこと。
IT分野に絞っても「同期」という言葉は色々な意味を持ってました。
僕はまずここが曖昧でした。
同期について意味を確認した上で、「同期通信」を確認。
『情報通信の分野で使う場合は、「タイミングを合わせる」といった意味。通信機器同士でデータを送受信するとき、一定のテンポを決めて、どんどんデータを送る方式と、データの前後に始まりと終わりの印を付けて送る方式がある。
で、一定のテンポで送る方を「同期通信」と呼ぶ。一方、始まりと終わりの印を付けて送る方は「非同期通信」という。同期通信の方が、送受信するデータ量が少ないので効率がいい。』
同期処理における「同期」の意味は、
「相手の反応をちゃんと待って行動する、タイミングを合わせること」
だな。
ここでもう一度振り返る。
「同期処理とは、定義したタスクをコーディングされた上から順に行うこと。あるタスクが実行されている間、他のタスクの処理は中断される」
「非同期処理とは、同期通信でないもの。モデルやコントローラで何らかの処理を実行しながら、バックグラウンドで他の処理も実行すること。あるタスク実行中に別の処理を行うことが可能。」
やっと少ししっくりきました。
僕は同期処理のことを、ブラウザ画面上部に現れる青い棒のケージがMAXになり、矢印がぐるぐる回ったのち画面遷移が行われることだけだと思ってました。
非同期処理はそれがなく、JSで画面が変化することだと。
もっと全然広義の意味があるみたいです。
とにかく非同期処理は、融通きかせてマルチタスクしているようなイメージ。
通信を全くしてないというイメージではなく、デフォルトの順番通りにタスク処理してないだけ。
とりあえず今回の非同期通信についての理解はこのような着地点です。
非同期通信はAjax以外にもたくさんあり、railsでgem使えば実装できるみたいです。
というよりgem使えば非同期に限らず、際限なく色々できるイメージになってきました。
Active Jobみたいな奥深そうな奴がさらっと出てくるあたりPHASE4は怖いです。
仕組みもかなり面白いです。
「Job」というrailsの機能を「Job管理テーブル」に登録(エンキュー)し、
「ワーカー」なるものが定期的にレコードを監視巡回、
処理すべきレコードがあれば処理実行。
ターミナルも2つ開き、1つはrailsサーバ用、もう1つはワーカー用。
ターミナル2つ使うとか、カッコよ。
って思うようになってしまったのは、
ITの世界にみられる、なんとも言えないユニークな雰囲気に染まってる証拠かもしれないです。
最近はテキスト見てる時間と同じくらいIT用語に関して調べ物してる時間が多いです。
あと英単語。
プログラミング言語が日本語だったらどんだけ楽か。
コーディングの見た目はカッコ悪そうですけど。
誰か開発してください。
以上ありがとうございました。