群馬大学 | 医学部 | サイトトップ | Software Tips
Windows環境でウェブアプリを使ってデータを管理する方法
最終更新:
2006年 6月 29日 (木曜日) 12時02分
(書きかけ)
このページは,win32ローカル(実際に試している環境はWindows XP Professional SP2とWindows 2000 Professional SP4)で,ウェブアプリを使ってデータを管理する方法をまとめたものである。
最初はWindows環境でhttpdとPerlを動作させ,Perlで書いたcgiによってデータ入力をする方法を示す。最終的には,バックエンドとなるDBMSにpostgreSQL,フロントエンドとなるデータ入出力にはApache HTTPDとphp4を使って大規模データ管理をした上で,RODBCを使ってRからそれを使う方法をまとめることを目指して作成中である。
もちろん,常道としてはすべてwin32環境でやってしまうより,LAN環境またはインターネットを介し,バックエンドはサーバで動作させ,ブラウザでアクセスしたり,Rからサーバにアクセスして呼び出す方が安全だし確実である。しかし,ぼくのように新幹線通勤をしていると,通勤中にオフラインの状態でデータ入力をしたい(しなければならない)ことも珍しくないので,すべてwin32ローカルで済む環境にも意味はある。このままプレゼンだってできるのは利点だと思う。
特殊な用途としては,ヒトを対象としたフィールド調査でのデータ入力に便利だという点が挙げられる。個人情報保護のために,データベースは連結可能匿名化しなくてはならない場合が多いが,Excelのような表計算ソフトでの入力ではそれは難しいし,MS Accessでフォームを作って管理するのでは現地のコンピュータにインストールしてあげてくることができない。入力フォームをhtmlで書いて,postされたデータをPerlのcgiかphp+postgreSQL経由で個人情報ファイルとデータファイルに分離して保存することは簡便だし,FPDFを使ってpdfファイルを作ってCanonのBJ M40のようなポータブルプリンタで出力すれば,見やすい結果をその場で調査対象者に差し上げてくることまで可能になる。
用意するソフトウェア
まず,以下のソフトをダウンロードしてインストールする必要がある。
- Apache HTTPD: webサーバソフト。サーバモードで実行して,ブラウザでhttp://localhost/にアクセスして使う。日本ユーザ会サイト経由でミラーサーバを探して最新版をダウンロードする。1.3系列,2.0系列,2.2系列があるが,2.2系列はwin32環境ではPHPと組み合わせて動かせない(必要なdllをロードできないというか,適切なdllがまだできていない模様)ので,2.0系列から重大なバグフィックスをしただけなので移行を強く勧めると言われているけれども,2006年6月7日現在において2.0系列の最新版2.0.58を使うことにする。
- 群大のNearest Mirrorである明星大学のApacheのwin32バイナリが入っているディレクトリからapache_2.0.58-win32-x86-no_ssl.msiをダウンロードする。
- 管理者権限で,ダウンロードしたmsiファイルのアイコンをダブルクリックする。ライセンスに同意すると,Network domainとServer NameとAdministrator's E-mail Addressを尋ねられるが,今回はlocalhostで使うのが目的なので,そこはどうでもいい(Server Nameはlocalhostとする。後でhttpd.confを編集してもよい)。同じウィンドウの下の方は大事で,All Userに向けてサービスとして稼動させるか,現在のユーザのみ手動起動させるかということなので,All Userに向けてサービスとして稼動させることにする。
- 次にsetup typeを尋ねるウィンドウが開く。通常はTypicalでよい。
- Installを開始すると,通常はWindows XPならばセキュリティ警告がでる。ネットワーク経由のアクセスの可能性があるということなのだが,今回の目的はローカルでのデータ管理なので,ブロックするを選ぶ。
- 次に,httpd.confを編集する。スタートメニューのプログラムのApache HTTP Server 2.0.58のConfigureのEditを選ぶ。ここでせねばならないことは,DocumentRootの設定と,そこでcgiが動く設定と,PHPを動作させるために必要な設定である。具体的には,
DocumentRoot "C:/Program Files/Apache Software Foundation/Apache2.0/htdocs"
↓
DocumentRoot "C:/work/db/"
としてhttp://localhost/をブラウザで開いたときに開くディレクトリを決め,
<Directory "C:/Program Files/Apache Software Foundation/Apache2.0/htdocs">
↓
<Directory "C:/work/db">
として,さらにその何行か後をOptions Indexes FollowSymLinks
↓
Options Indexes FollowSymLinks ExecCGI
とし,さらに何行か下を,DirectoryIndex index.html index.html.var
↓
DirectoryIndex index.html index.php
と変え,ScriptAliasも/cgi-bin/はそのままにして,ScriptAlias /php/ "C:/php/"
<Directory "C:/php/">
Allowoverride None
Options None
Order allow,deny
Allow from all
</Directory>
を追加し,# AddHandler cgi-script .cgi
の行頭の#を除去する。最後にモジュール組み込みが終わったところへ(つまり,</IfModule>の後に),LoadModule php4_module "c:/php/php4apache2.dll"
AddType application/x-httpd-php .php
PHPIniDir "C:/php"
を追加する。
- PHP: 簡易言語。3, 4, 5系列があるが,ここでは4系最新の4.4.2を使う。公式サイトからリンクを辿り,近いミラーから,php-4.4.2-Win32.zipと,そのマルチバイト文字対応キットであるphp-4.4.2-Win32-mb-1.0.lzhをダウンロードする。まずzipを展開してc:\phpにすべて(php.ini-distとphp.ini-recommendedやphp.exeがある階層を,ディレクトリも含めて)を移動し,lzhも展開して同じディレクトリにコピーする(同名のファイルが多々あるのですべて上書きする)。さらに,c:\php\sapiとc:\php\dllsの中身は,すべてc:\php直下に移動してから,c:\phpへのパスを通す(マイコンピュータアイコンの上で右クリックしてプロパティから詳細を選んで環境変数でシステム環境変数のPathの先頭にc:\php;を追加する)。そうしておいて,php.ini-recommendedをphp.iniにコピーして編集する。動作の仕組みとしては,ブラウザからphpスクリプトが呼び出されると,httpd.confの設定で.phpはapplicationだと判定されc:\php\php4apache2.dllに制御が渡される。phpスクリプトの中でpostgreSQLとの接続を要求する命令が動作するためには,phpがpostgreSQLをサポートするモジュールを読み込んでいなくてはならないので,php.iniには,postgreSQLをサポートするモジュールを読み込むことと,postgreSQLが存在する場所を書いてやらねばならない。具体的には,
doc_root = c:\work\db
extension_dir = "c:/php/extensions/"
extension = php_pgsql.dll
とする(最後の行は先頭の;を消せばいい。多くの拡張モジュールがc:\php\extensionsに存在するため,extension_dirはそこに設定する。そのデータ入力だけで使う拡張モジュールはドキュメントルートにおけばいい)。さらに,メモリを食う作業をする可能性があることを考え,php.iniの先頭付近でmax_execution_time = 360
max_input_time = 360
memory_limit = 128M
程度に増やしておく(ただし,一度のデータ入力のサイズを制限するpost_max_sizeが8Mになっているのは,さすがにそのままで良いだろう)。ここではデータ入力をすることがターゲットなので,win32ローカルか,せいぜいLAN内のはずで,ここを小さい値に設定して負荷を軽くする必要はない。ついでに書いておくと,phpではpdfを作るための拡張クラスがあり,PDF関連情報でも紹介されているFPDFは大変有用である。ちなみにFPDFのインストール方法の紹介を読むと,php.iniのinclude_pathにFPDFのモジュールがあるディレクトリも;で区切って指定するように書かれているが,そこを変えずにドキュメントルートに置いても動作する。
- PostgreSQL: データベースマネージメントソフト。独自のフロントエンドも持つが,PHPから呼び出すこともできる。2006年6月6日現在の最新版は8.1.4。以前はcygwin環境でないと使えないなど,インストールも含めて制約がきつかったが,今ではインストーラを起動して指示に従うだけなので楽だ。日本postgreSQLユーザ会からpgFoundry経由でpostgresql-8.1.4-1-ja.zipをダウンロードする。これを展開すると,postgresql-8.1-ja.msiというインストーラができるので,それを管理者権限でダブルクリックして実行する。基本的に問い合わせに答えていくとインストールできるが(ハードディスク容量に問題がなければ,インストールオプションは「全体の機能はローカルなハードディスクドライブにインストールされます」を選んでおけばいいだろう),postgresというアカウントをWindowsに作るので(サーバソフトを起動する際の実行権限は,このアカウントのものになるので,管理者権限でない専用のアカウントを作った方がいいため),インストールに途中で失敗した場合などは,いったんコマンドプロンプトで
net user postgres /delete
と打つ必要がある。Windows上のアカウントのパスワードは自動生成にして差し支えないし,知る必要もない。一方,その次の「データベースクラスタの初期化」で求められる管理アカウント(デフォルトで作られるpostgresという名前のデータベースのスーパーユーザ名)は,同じくデフォルトはpostgresだが,パスワードをちゃんと決めて覚えておかねばならない。文字コードは,Linuxなどでも同じコードやデータを使いたい場合があることを考えると,EUC-JPのままでいいだろう。ロケールもCのままで問題ないと思う。その次の「手続き言語を可能にする」はデフォルトのまま(PL/pgsqlだけにチェックが入っている)でいいだろう。「貢献モジュールを可能にする」「template1でpostGISを可能にする」ダイアログもデフォルトのまま「次へ」をクリックすればいい。
- Active Perl: ActiveState/ActivePerlからダウンロードできる,win32環境用の代表的なPerlインタープリタ。本稿は,最終的にはphpとPostgreSQLを使って大規模データ管理をすることが目的だが,その前に通常のcgiを使ってローカルでフォームからデータ入力をする方法を示すため,perlもインストールしておく。インストール後にperl.exeが存在するディレクトリにパスを通しておけば,httpd.confの方では,ドキュメントルートの設定にExecCGIを指定していれば,フォームもcgiもすべてドキュメントルートに置くだけで動作するため,httpd.confには追加設定は必要ない。いつの間にか64bit版がβテスト中だが,ここでは通常の32bit版の5.8系最新のものを使う。
以上で,実行環境としてのソフトウェアのインストールは完了である。作業ディレクトリを変えるときは,httpd.confのDocumentRootとそのアクセス設定をする部分,さらにphp.iniのdoc_rootを新しい作業ディレクトリに書き換えてapacheをrestartさせれば,それだけで切り替えられる。パスの区切りが\であったり/であったりするので間違えないように注意されたい。
テスト
インストールがうまく行ったかどうかテストするには,以下のようにする。
- Apache HTTPDの動作確認
- c:\work\dbにindex.htmlというファイルを作り,ブラウザでhttp://localhost/を開くと,そのファイルが表示されるはずである。index.htmlの中身は,webで表示可能な内容なら何でもいいが,最小限で済ませるなら,
<html><head>
<title>test</title>
<meta http-equiv="Content-Type" content="text/html; charset=SHIFT_JIS">
</head><body>
<h1>test</h1>
<p>これはテストです</p>
</body></html>
とでもしておけば良かろう。言うまでもないが,文字コードの表示指定と,実際のそのファイルの日本語エンコーディングが一致していないと文字化けする。Windows 2000/XPのメモ帳では文字コードANSIにするとSHIFT_JISで保存される。
- PHPの動作確認
- c:\work\dbにindex.phpというファイルを作り,ブラウザでhttp://localhost/index.phpを開く。PHPの動作状況一覧が表示されれば,無事にhttpdからphpを呼び出せる状態になっている。index.phpの中身は,
<?php phpinfo(); ?>
とする。(注:*.plや*.cgiはFreeBSD上では実行属性をつけておかないとブラウザから実行されないが*.phpは属性によらず実行されてしまうので,このサーバ上には敢えて置かないことにする)
- PostgreSQLの動作確認
- まずは上記PHPの動作確認で,pgsqlという項目が表示されていることを確認する。そうでないと,PostgreSQL自体が動作可能であってもwebからphp経由で呼び出すのに支障がある。
- 次に,PostgreSQL自体が動作するかどうかを試す。インストールしただけで,サーバプログラムは動作している筈で,その確認は,「マイコンピュータ」の上で右クリックして「管理」を選び,「サービスとアプリケーション」の「サービス」を見ると,PostgreSQL Database Server 8.1が.\postgresというユーザで自動的に開始されていることが確認できる。次に,「スタートメニュー」→「プログラム」→「PostgreSQL 8.1」→「コマンドプロンプト」と選ぶと"C:\Program Files\PostgreSQL\8.1\bin"をカレントとしてコマンドプロンプトが開くので,そこでpsql --versionと打ってみると,psql (PostgreSQL) 8.1.4と表示されてプロンプトに戻るので,psqlが使用可能なこととそのバージョンが確認できる(アップデートしたときなど,サーバとコマンドのバージョンが違ったりするとまずいので,同じことを確認する)。次にpsql -U postgres(ユーザ名はコマンドラインで与えねばならない。省略すると現在のWindowsのログインユーザが仮定される)。パスワード入力を要求されるので,インストール時に決めたパスワードを入力すると,psqlの会話型ターミナルのプロンプトpostgres=#が表示されて入力待ちになる(このとき接続されているデータベースはインストール時に作ったpostgresという名前のものである)。ここまでくればインストールは成功しているといえる。ここでwebdbという名前のデータベースを作るには,
CREATE DATABASE webdb;
とする。これもオーナーはpostgresになる。新しく作ったwebdbに接続するには,\c webdb
とすればよい。プロンプトがwebdb=#と変わる。psqlを抜けるにはプロンプトに対して\qと打てばよい。
- もっとも,createdbとかinitdbとかcreateuserはexeファイルとして提供されているので,psqlを起動する前に,createdb -U postgres webdbなどとして新しいデータベースを作っておくのでもいい(psql内で作ってしまった場合は,先にdropdb -U postgres webdbとして消しておく)。データベースを作る前に,データベースは作れるがスーパーユーザでなくユーザ追加できない新しいユーザminatoを作っておくには,createuser -U postgres -d -S -R -P minatoとしておけばいい。ここでまず「新規ロールのパスワードを入力してください:」とパスワード入力を求められるので,ユーザminatoのパスワードを決めて入力する(2回)。次にただ「パスワード:」と表示されて入力待ちになるが,今度はこのコマンドを発行してサーバに接続しているユーザpostgresのパスワードを入力する。この新しいユーザminatoでデータベースwebdbを作るには,createdb -U minato webdbとする。パスワード入力を求められるので,minatoのパスワードを入力する。ここまで来れば,ユーザminatoでデータベースwebdbに接続するには,psql webdb minatoとすればよくなる(データベース名の後なら,-Uなしでもユーザ名と認識される。もちろんパスワード認証は必要である)。
- もっとも,データベースを作ったり編集したりするのは,「スタートメニュー」→「プログラム」→「PostgreSQL 8.1」→「pgAdmin III」で起動する管理ソフトを使うと楽である。
- あとはSQLコマンドが使えるので,COPY * FROM ""などで,直接データ登録や削除,編集ができる。pgAdmin IIIからだとGUIっぽいインターフェースでデータ構造とか変数一覧とかデータビューまでできる。PostgreSQLでデータを持っておくと,パスワード保護されているので,仮にマシンを盗まれてもデータを見られないと考えられる。HDDがクラッシュしたらと考えるとちょっと怖いが,見やすい形のデータをPostgreSQLに読ませたら,その見やすいデータは消してしまって,解析の都度引き出してくる方が盗難対策には安全である。
- Perlの動作確認
- Perlが使えるかどうかは,普通にコマンドプロンプトで,perl -vと打って,著作権情報とビルド情報が表示されれば使えると考えてよい(より詳しいビルド情報はperl -Vで得られる)。
- 普通にActivePerlがインストールされれば*.plに関連付けされるので,作業ディレクトリにtest.plという名前で,
print "Hello, world\n";
と1行だけの内容のファイルを作り,コマンドプロンプトでtest.plと打てば,それが実行されて,Hello, worldと表示されるはずである。
- cgiとしての動作チェックは,作業ディレクトリに以下の内容のファイルをtest.cgiという名前で作り,ブラウザでhttp://localhost/test.cgiを開いて環境変数一覧が表示されればOKである(ブラウザでの表示にはいろいろ決まりごとを満足させなくてはいけないので,省力化のためにCGI.pmを利用する)。
#!C:/Perl/bin/perl
use CGI ':standard';
print header;
print start_html('test'),h1('List of environmental variables');
print '<pre>';
forearch (keys %ENV) { print "$_ = $ENV{$_}\n"; }
print('</pre>');
print end_html;
簡単な入力フォームの設計例
(追記予定)
phpとPostgreSQLを使って入出力フォームを作る
(追記予定)
できたデータベースからR+RODBCライブラリでデータを引き出して分析・作図する
(追記予定)
リンクと引用について