コマンドラインとエディターのみでWeb開発する方法を説明。今回は慶弔金などの集金とそのための名簿管理に使用するデータベースをPowerShellで作成する。
powered by Insider.NET
本連載では、部門コンピューティング(=Excel+VBAで簡単な業務アプリを開発するようなこと)レベルの開発手法として、ASP.NETを利用した軽量Webアプリ開発を説明する。タブレットを利用した業務アプリのプロタトタイプ実装や、Excel+VBAの業務アプリのWebアプリへの移行などの参考にしていただきたい。
なお本連載では、最小限のセットアップでWindowsを活用できるよう、可能な限りGUIツールを利用することなくコマンドラインとエディターのみで開発する方法を説明している。また、本連載では個別のファイルの拡張子には小文字の「.aspx」を利用するが、ASP.NETの埋め込みHTMLファイルを示す場合は「ASPX」(ASPXファイル)と大文字で記述する。
今回は、前回までに説明した埋め込みHTMLでのASPXの利用から一歩進めた開発手法について説明する。
ここでの主眼は、アプリケーションを構成するモジュールの分離と、分離されたモジュール間のインターフェースのベストプラクティスを説明することにある。このため、これまでの記事と同様に、Webアプリとしての機能はともかくとして、見た目については全く考慮しない。
結論を先に書くと、リクエストにはURLエンコードしたフォーム形式(具体的には、キーと値を「=」で結合し、各ペアを「&」で分離する)がよく、レスポンスにはJSONがよい。この方法が最も楽に記述でき、かつ汎用性がある。
今回は、作成するWebアプリの背景説明から実行環境の設定までを扱う。
サンプルとして取り上げるWebアプリは、以下のストーリーを持つ。
A社のB部では、慶弔の都度、以下の手順で慶弔金の処理を行っている。
この処理をWebアプリ化することを考える。
この場合、重要なことは、現状の処理手順にとらわれずに必要なものだけを残すことだ。ほとんどの場合、現状の手続きは、要件として必要なものではなく、機能を実現するために必要なものにすぎない。
例えば、現状のルールとして以下にリストするようなものがある。これらはルールであるが、その一方で問題点でもある。これらのルールが必要とされているのは、それらが現状において要件を実現するために必要だからだ。つまり、過去に発生した問題を解決するために自然と上記の手順に落ち着いたのであって、手順を構成している個々のルールが要件を構成しているわけではない。従って、Webアプリ化するに当たって、これらのルールは必要に応じて取捨すべき対象であり、要件としては考慮する必要はない。
処理上のルール
結局、上記のルールは、メールとExcelブックを利用していることから生じるのであり、必須な要件だけを取り出せば、以下の3点である。
すると、求められるWebアプリの機能は以下のユースケースとして規定できる。
上で求めたユースケースに従って、データモデルを決定する。
まず、メンバーのテーブルが必要である。
メンバーのテーブルには、氏名と住所を登録する。個々の募集に対してメンバーが登録すれば、住所はメンバーのテーブルから取得できるため、募集に対して住所の記入を不要とできる。
なお、住所の更新や募集への賛同は各メンバー自らが行うことを前提とするため、ログイン処理も必要となる。ここでは、ログイン処理用に簡易であり安易なパスワード管理を行うことにする。
次に、募集を登録するためのテーブルが必要となる。このテーブルは募集要項(目的、幹事、対象者、一口あたりの金額、最大口数、掲載期限など)を持つ。
最後に、各募集とメンバーの口数を持つテーブルが必要となる。このテーブルによって、各募集と賛同したメンバーと設定した口数が保持される。
上記をまとめたものが下図である。
テーブルとWebアプリのためのディレクトリなどを用意する。
前回までは、ディレクトリの作成についてはExplorerなどを利用したが、ここでは全てPowerShellで行う方法を示す。
$domoPath = "c:\inetpub\wwwroot\domo" (1)
mkdir $domoPath
$domo = Get-Acl $domoPath (2)
$ruleDeveloper = New-Object System.Security.AccessControl.FileSystemAccessRule "ユーザー名",FullControl,"objectInherit,containerInherit",non,allow (3)
$ruleIIS = New-Object System.Security.AccessControl.FileSystemAccessRule "BUILTIN\IIS_IUSRS",ReadAndExecute,"objectInherit,containerInherit",non,allow (4)
$domo.SetAccessRule($ruleDeveloper) (5)
$domo.SetAccessRule($ruleIIS) (5)
$domo | Set-Acl $domoPath (6)
$appDataPath = $domoPath + "\App_Data"
mkdir $appDataPath
$conn = New-Object System.Data.SqlClient.SqlConnection("Data Source=.\SQLEXPRESS;Integrated Security=SSPI;User Instance=true")
$conn.Open()
$cmd = $conn.CreateCommand()
$cmd.CommandText = "create database domodb on (name=domodb,filename='c:\inetpub\wwwroot\domo\App_Data\domodb.mdf')" (7)
$cmd.ExecuteNonQuery()
$cmd.CommandText = @"
use domodb
create table members (8)
(
id int identity primary key
,name varchar(128) not null
,zip varchar(7)
,address varchar(128)
,password varchar(128)
,administrator tinyint
)
insert into members values ('管理者', null, null, null, 1) (9)
insert into members values ('鈴木一郎', '1000999', '東京都千代田区', null, 0)
insert into members values ('鈴木二郎', '2000999', '東京都中央区', null, 0)
insert into members values ('鈴木三郎', '3000999', '東京都港区', null, 0)
insert into members values ('鈴木四郎', '3000999', '東京都港区', null, 0)
"@
$cmd.ExecuteNonQuery()
$cmd.CommandText = @"
create table rosters (10)
(
id int identity primary key
,subject varchar(128) not null
,creator int not null
,owner int
,amount_per_unit int
,maxunit int
,location varchar(128)
,expire_date smalldatetime
,create_date datetime
)
"@
$cmd.ExecuteNonQuery()
$cmd.CommandText = @"
create table entries (11)
(
roster_id int
,member_id int
,unit int not null
,create_date datetime
,primary key (roster_id, member_id)
)
"@
$cmd.ExecuteNonQuery()
$cmd.CommandText = "use master"
$cmd.ExecuteNonQuery()
$cmd.CommandText = "sp_detach_db domodb"
$cmd.ExecuteNonQuery()
$cmd.Dispose()
$conn.Close()
$ruleIIS = New-Object System.Security.AccessControl.FileSystemAccessRule "BUILTIN\IIS_IUSRS",Modify,allow (12)
Get-ChildItem -path $appDataPath | % {
$db = Get-Acl $_.FullName
$db.SetAccessRule($ruleIIS)
$db | Set-Acl $_.FullName
}
C:\Windows\System32\inetsrv\appcmd add app /site.name:"Default Web Site" /path:/domo /physicalPath:$domoPath
*1 管理者ユーザーはadministraotrというカラムに「1」を設定することでログイン後に管理ページの表示などの処理を可能としているが、本記事ではこれらの処理は含まない。
*2 外部キーの設定はしていない。プログラム的に制約をチェックできるため特に用意する必要がないことが理由だが、カスケード削除をするのであれば設定してもよい。ただ、筆者の実感として、カスケード削除や外部キーは論理的には意味があるが、実運用、特にソフトウェアで管理する場合は実装に対する無駄な制約となるため避けた方が無難である。
なお、署名無しのPowerShellスクリプト(拡張子「.ps1」)をPowerShell内から実行するには、以下のコマンドを実行して、実行制限を解除する必要がある。
Set-ExecutionPolicy RemoteSigned (1)
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned (2)
以上で、集金名簿用データベースの作成は終了だ。次回は、このデータベースを利用するWebアプリの作成について見ていくことにしよう。
Copyright© Digital Advantage Corp. All Rights Reserved.