【ASP.NET Core】EFを用いたModelクラス内のプロパティへのインデックスの付与方法
Modelクラス内のプロパティへインデックスを付ける方法
最近、ASP.NET Coreを勉強していてModelクラス内のプロパティへインデックスを付ける方法で躓いたため学習メモ用として残します。
ASP.NET Frameworkではプロパティに対して直接IndexアノテーションをつけることができたがASP.NET CoreのEntity Frameworkではクラスに対してIndexアノテーションをつけることでインデックスを貼ることができます。
以下、実装となります。
これでCategoryNameプロパティに対してインデックスが貼られました。
参考URL:
https://learn.microsoft.com/ja-jp/ef/core/modeling/indexes?tabs=data-annotations
リバーシで学ぶアプリケーション設計入門を受講して~ RDRA
概要
Udemyにて、しま (大嶋勇樹)さんが講義している「リバーシで学ぶアプリケーション設計入門」を受講しました。
リバーシで学ぶアプリケーション設計入門〜仕様の整理からTypeScriptでの実装まで〜 | Udemy
受講した理由
現在の業務では、保守業務や既存のアプリの拡張開発などある程度仕様・実装手法が固められることが多く、アプリケーションを設計する機会がなかなか得られないと感じております。本講義では、リバーシを題材としてアプリケーション設計~実装までを一通り学ぶことができるため、段階アプリケーションエンジニアとしてステップアップできるのではと思い受講しました。
RDRA
今回設計では、RDRAと呼ばれる設計手法を用います。
下記の2つの記事が分かりやすくてよかったです。
モダンな要件定義手法「RDRA」をRPGゲーム風にカスタマイズして説明してみた - Goodpatch Tech Blog
コンテキスト図
開発する対象のシステムとかかわる人や他のシステムを整理した図です。
初めてコンテキスト図なるものを描きました。
今回はシンプルなアプリケーションであるため、描くことの効果が薄いように感じますが、大規模なアプリケーションではアプリの全体像が見やすいため、チームや顧客間でのアプリに対する認識を共有するのに便利だと思います。
ユースケース図
登場人物がシステムで何をするかを整理した図です。
プレイヤーのユースケースを描きました。こちらは「ゲームを起動する」⇒「自分の番になる」⇒「石を打つ」など細かく描くのではなく「対戦する」といった割と大雑把な粒度で言いそうです。
概念モデル
各ワード間の関係性を示した図です。
この図が後のDB設計、クラス設計の元となるそうです。
【AWS】EC2インスタンスを立てる
1.EC2インスタンスを選択する
今回は無料枠のAmazon Linux 2 AMIのt2.microを使用します。
2.VPCとキーペアを指定する
VPCでは、前回作成したVPCを指定します。すると指定したVPC内にインスタンスが作成されます。
また、キーペアを作成します。
後に作成したEC2インスタンスへSSHなどで接続してソフトをインストールしますが、その際にSSHで接続するための認証情報がキーペアとなります。
3.インスタンスを起動する
インスタンスを起動させると、画面上に「実行中」となったインスタンスが立ち上がります。
4.SSHで接続する
TeraTermを起動して、作成したEC2インスタンスにSSHで接続します。
ホストには、パブリックIPアドレスを指定します。
5.キーペアを利用する
SSH認証の際に認証方式を指定されます。ここで、秘密鍵として先ほど作成したキーペアを利用します。
【SQL Server】N+1問題とは何ですか?
N+1問題とは
下記の記事を参考にしました。
ループ処理の中でSQLが大量に実行されて、処理が遅くなることをN+1問題という。
例)
書籍テーブルと利用者テーブルがあり、各書籍に対する利用者情報を取得する場合
1.SELECT 借用者ID FROM 書籍テーブルで各借用者IDを取得する
2.1で取得した利用者IDをforeach文でループさせる
foreach(var item in 1で取得した利用者ID)のようなイメージ
3.SELECT * FROM 利用者テーブル WHERE 利用者ID = itemで取得した利用者IDに対するSQL文を実行する
のようなステップを踏みます。
3のループ内で1で取得した利用者IDの数分だけSQLが実行されてしまいます。
そうするとSQLの応答が返ってこないことがあります。
N+1問題への回避方法
N+1問題を回避する方法は主に2つです。
・JOINをする
・Eager Loadする
JOINをする
JOINを使って先ほどのSQLを以下のように書き換えます。
SELECT * FROM 利用者テーブル INNER JOIN 書籍テーブル ON 借用者ID = 利用者ID
こうすることで先ほどの1~3のステップを表現できます。
EagerLoadする
事前に取得したデータをIN句を使って一括で取得する方法です。
1.SELECT 借用者ID FROM 書籍テーブルで各借用者IDを取得する
2.SELECT * FROM 利用者テーブル WHERE 利用者ID in (1で取得した借用者ID)で取得した利用者IDに対するSQL文を実行する
こうすることでfor文を使わずに各利用者IDを取得することができます。
CSRF(クロスサイトリクエストフォージェリ)について解説します!
CSRFとは
CSRF(Cross-Site Request Forgery)とは直訳するとクロスサイトによるリクエスト攻撃を意味します。
ログイン中のユーザーを攻撃者が用意した攻撃用Webサイトへ誘導し強制的にリクエストを送りサーバーを攻撃させます。
例えば、オンラインバンキングを利用しているユーザーに対してキャンペーンなどと偽って攻撃用サイトへ誘導させます。
攻撃用サイトにはクリックしただけで不正なリクエストを送信させるスクリプトを用意しておき、サーバーを攻撃します。
これによりDBなどの情報を書き換えたり、サーバーの情報を盗んだり悪質なリクエストを送らせます。
CSRF対策
サイトとサーバーにトークンを持たせます。
具体的にはユーザーが正規サイトへアクセスした際に正規サイトとサーバーのみが知るトークンを持たせます。
サーバーは送信されたリクエストのトークンが一致しているか判断し、正規サイトからのリクエストか判断します。
【IIS】ワーカープロセスって何ですか?
ワーカープロセスとは
業務でIISサーバーを使ってWebアプリケーションを公開しています。
その中でワーカープロセスと呼ばれるものが出てきましたので、調べました。
ワーカープロセスとは、IIS上でWebアプリケーションを動かすためのプロセスでありw3wp.exeと呼ばれるプロセス名で起動されます。
このプロセスはIIS本体のプロセス(svchost.exe)とは分けて起動されます。
なぜIIS本体のプロセスとは分けて起動されるのか
Webアプリケーションの影響からIIS本体のプロセスから守るためです。
IIS本体のプロセスでWebアプリケーションを起動すると、どうなるでしょう。
Webアプリケーションがシステムエラーなどで強制終了するとIIS本体のプロセスも終了してしまいます。
IISで一つのWebアプリケーションを動かしているなら影響は少ないですが、他のアプリケーションを動かしていると、そのアプリケーションも強制終了されてしまいます。
これらを避けるためにIIS本体のプロセスとWebアプリケーションを動かすプロセス(ワーカープロセス)を分離する必要があるのです。
【AWS】VPCを作成する
VPCを作成する
「VPCを作成」をクリックします。
VPCの名前タグとCIDRブロックを設定します。
CIDRブロックとは、IPアドレス/数字で構成されるブロックであり数字部分がネットワーク部のビット数を表します。今回は先頭から16ビットがネットワーク部となります。
※IPv4 CIDRはプライベートIPアドレスであるためマスク化してません。
次に、作成したVPCからパブリックサブネットを作成します。
インターネットへの接続設定をする
パブリックサブネットを作成しましたら、インターネットへ接続するために以下の手順を踏みます。
1.インターネットゲートウェイとルートテーブルを作成する
2.ルートテーブルとパブリックサブネットを紐づける
3.デフォルトゲートウェイを設定する
1.インターネットゲートウェイとルートテーブルを作成する
インターネットゲートウェイの作成を実行します。後はタグをつけて作成ボタンを押下します。(簡単!)
ルートテーブルを作成します。
こちらは作成したVPCに紐づけさせます。
2.ルートテーブルとパブリックサブネットを紐づける
ルートテーブルとパブリックサブネットを紐づけていきます。
こちらでは、先ほど作成したルートテーブルのルートを編集をクリックします。
次にルートを追加ボタンをクリックして、送信先「0.0.0.0/0]、ターゲットを作成したインターネットゲートウェイにします。これにより送信先が特に指定されていなければインターネットゲートウェイへデータを送信しろ!という意味になります。
※0.0.0.0/0はすべてのパケットを示します。
最後に関連付けしたいパブリックサブネットを選択して終了です!