【ASP.NET Core】EFを用いたModelクラス内のプロパティへのインデックスの付与方法

Modelクラス内のプロパティへインデックスを付ける方法

最近、ASP.NET Coreを勉強していてModelクラス内のプロパティへインデックスを付ける方法で躓いたため学習メモ用として残します。

 

ASP.NET Frameworkではプロパティに対して直接IndexアノテーションをつけることができたがASP.NET CoreのEntity Frameworkではクラスに対してIndexアノテーションをつけることでインデックスを貼ることができます。

 

以下、実装となります。

これでCategoryNameプロパティに対してインデックスが貼られました。

Indexアノテーション

参考URL:

https://learn.microsoft.com/ja-jp/ef/core/modeling/indexes?tabs=data-annotations

リバーシで学ぶアプリケーション設計入門を受講して~ RDRA

概要

Udemyにて、しま (大嶋勇樹)さんが講義している「リバーシで学ぶアプリケーション設計入門」を受講しました。

リバーシで学ぶアプリケーション設計入門〜仕様の整理からTypeScriptでの実装まで〜 | Udemy

受講した理由

現在の業務では、保守業務や既存のアプリの拡張開発などある程度仕様・実装手法が固められることが多く、アプリケーションを設計する機会がなかなか得られないと感じております。本講義では、リバーシを題材としてアプリケーション設計~実装までを一通り学ぶことができるため、段階アプリケーションエンジニアとしてステップアップできるのではと思い受講しました。

 

RDRA

今回設計では、RDRAと呼ばれる設計手法を用います。

下記の2つの記事が分かりやすくてよかったです。

リレーションシップ駆動要件分析(RDRA) - Qiita

モダンな要件定義手法「RDRA」をRPGゲーム風にカスタマイズして説明してみた - Goodpatch Tech Blog

 

コンテキスト図

開発する対象のシステムとかかわる人や他のシステムを整理した図です。

初めてコンテキスト図なるものを描きました。

今回はシンプルなアプリケーションであるため、描くことの効果が薄いように感じますが、大規模なアプリケーションではアプリの全体像が見やすいため、チームや顧客間でのアプリに対する認識を共有するのに便利だと思います。

コンテキスト図

 

ユースケース

登場人物がシステムで何をするかを整理した図です。

プレイヤーのユースケースを描きました。こちらは「ゲームを起動する」⇒「自分の番になる」⇒「石を打つ」など細かく描くのではなく「対戦する」といった割と大雑把な粒度で言いそうです。

ユースケース

概念モデル

各ワード間の関係性を示した図です。

この図が後のDB設計、クラス設計の元となるそうです。

概念モデル

 

 

【AWS】EC2インスタンスを立てる

VPCを構築したら次にEC2インスタンスを立てます。

 

1.EC2インスタンスを選択する

今回は無料枠のAmazon Linux 2 AMIのt2.microを使用します。

Amazon Linux 2 AMI

2.VPCとキーペアを指定する

VPCでは、前回作成したVPCを指定します。すると指定したVPC内にインスタンスが作成されます。

また、キーペアを作成します。

後に作成したEC2インスタンスSSHなどで接続してソフトをインストールしますが、その際にSSHで接続するための認証情報がキーペアとなります。

VPCとキーペア

3.インスタンスを起動する

インスタンスを起動させると、画面上に「実行中」となったインスタンスが立ち上がります。

実行中のインスタンス

4.SSHで接続する

TeraTermを起動して、作成したEC2インスタンスSSHで接続します。

ホストには、パブリックIPアドレスを指定します。

SSH接続

5.キーペアを利用する

SSH認証の際に認証方式を指定されます。ここで、秘密鍵として先ほど作成したキーペアを利用します。

キーペア

 

 

【SQL Server】N+1問題とは何ですか?

N+1問題とは

下記の記事を参考にしました。

qiita.com

ループ処理の中で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サイトへ誘導し強制的にリクエストを送りサーバーを攻撃させます。

例えば、オンラインバンキングを利用しているユーザーに対してキャンペーンなどと偽って攻撃用サイトへ誘導させます。

CSRF


攻撃用サイトにはクリックしただけで不正なリクエストを送信させるスクリプトを用意しておき、サーバーを攻撃します。

これによりDBなどの情報を書き換えたり、サーバーの情報を盗んだり悪質なリクエストを送らせます。

 

CSRF対策

CSRFへ対策するには一般的にトークンを用います。

サイトとサーバーにトークンを持たせます。

具体的にはユーザーが正規サイトへアクセスした際に正規サイトとサーバーのみが知るトークンを持たせます。

サーバーは送信されたリクエストのトークンが一致しているか判断し、正規サイトからのリクエストか判断します。

トークンによる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を作成する

VPCの名前タグとCIDRブロックを設定します。

CIDRブロックとは、IPアドレス/数字で構成されるブロックであり数字部分がネットワーク部のビット数を表します。今回は先頭から16ビットがネットワーク部となります。

IPv4 CIDRはプライベートIPアドレスであるためマスク化してません。

タグとCIDRブロックを設定する

次に、作成したVPCからパブリックサブネットを作成します。

パブリックサブネット

 

インターネットへの接続設定をする

パブリックサブネットを作成しましたら、インターネットへ接続するために以下の手順を踏みます。

1.インターネットゲートウェイとルートテーブルを作成する

2.ルートテーブルとパブリックサブネットを紐づける

3.デフォルトゲートウェイを設定する

 

1.インターネットゲートウェイとルートテーブルを作成する

インターネットゲートウェイの作成を実行します。後はタグをつけて作成ボタンを押下します。(簡単!)

インターネットゲートウェイの作成1

インターネットゲートウェイの作成2

ルートテーブルを作成します。

こちらは作成したVPCに紐づけさせます。

ルートテーブルの作成

2.ルートテーブルとパブリックサブネットを紐づける

ルートテーブルとパブリックサブネットを紐づけていきます。

こちらでは、先ほど作成したルートテーブルのルートを編集をクリックします。

ルートテーブルの紐づけ

次にルートを追加ボタンをクリックして、送信先「0.0.0.0/0]、ターゲットを作成したインターネットゲートウェイにします。これにより送信先が特に指定されていなければインターネットゲートウェイへデータを送信しろ!という意味になります。

※0.0.0.0/0はすべてのパケットを示します。

ルートテーブルの設定

最後に関連付けしたいパブリックサブネットを選択して終了です!

パブリックサブネット