ここでは、Perlを手もとのWindows PCで実行できるローカル接続環境を構築、利用可能にしてみることにします。
Perlスクリプトを覚えるだけなら別ですが、CGIの学習や練習ならローカルで実行できる環境を用意するのがベストであり、レンタルサーバがあるにしても専用サーバなら別ですが、共有サーバをレンタルしている場合は、これから作る、または、作成中のCGIをいきなりサーバで動作確認するのは、サーバに負荷をかける可能性からして他のユーザーに迷惑ですし、無謀なのでローカル環境を用意するのが妥当です。
尚、学習用や練習用なら各ソフトウェアは安定版の最新版を選べばまず問題はないでしょうが、サーバアップ前のテスト環境としての利用の場合、各ソフトウェアのバージョンが近いものでも異なると単体及び相性もあるのかプログラム内容によってはかなり挙動が異なったり、すんなり通ったように見えたところが実はエラーだったりということも起き得、実行できるようになるまででも結構ハマることもありますから、難しいこともあるでしょうが、できることならバージョンは合わせた方がよいですし、異なる場合は、注意が必要です。
perlスクリプトをローカルで実行するにはActive PerlやCygwin Perlを、CGIとしてブラウザを利用するなら加えてAn httpdやApache等のWebサーバを、RDBを利用するなら更にPostgreSQLやMySQLをインストールします。
ちなみにActive Perl、WebサーバにApache、RDBにMySQLがセットとなったLinux用パッケージにはLAMPP、Windows/Mac含むクロス環境用パッケージにはXAMPPといったものもあり、パッケージをインストールしたらすぐにローカル実行環境として利用できるようなのでAn httpd、Postgresqlへのこだわりが特になければ、これらを利用するのが手軽で便利でしょう。
これらのパッケージ名は、Linux、Apache、MySQL、Perl(、PHP、Python)の頭文字をとったものでXAMPPは、LinuxのLが、Win/Mac/Linux...で使えるということからクロス環境を意味するXとなったものです。
尚、更にFTP転送可能な簡易軽量DBであるSQLiteがワンセットになっているパッケージが一般的のようです。
【想定ローカル環境】
An httpd
PostgreSQL
Perl (Cygwin版)
でも、ここでは、あえてCygwinをインストール済みのWindows上でCygwin版PostgreSQLもあるのにこれを使わず、Cygwinとは別に新たにGUI用にPostgreSQLをダウンロード&インストール。。。する一方でPerlは、Active Perlをインストールするわけじゃなく、CygwinにあるPerlを使い、WebサーバはAn httpdというこんがらがりそうな状況を想定する必要があるのかないのかさえわからないけど想定してみてローカルに実行環境を準備してみようと思います。
なんだか超面倒くさそうにしか見えないけど実は全然そんなことないかも。
そもそもCygwin版でOKで且つWebサーバはApacheでOKあれば、CygwinのPerlとPostgreSQLとhttpdコマンド(実体はApache)/apachectlコマンドを使ってもよいでしょうし、WindowsユーザーでPC UNIX/Linuxでやってみたいという場合には、往々にしてWindowsほど高スペックを要求しないので旧式または中古でロースペックなマシンを調達してUNIX/Linux専用マシンにしたり、新規または既存マシンでパーティションを仕切り直して、または、仮想ドライブ作成ソフトを使ってパーティションを意識せずにデュアルブート(やマルチブート)にしたり、WindowsマシンでCD/DVD、USBや仮想マシンを使ってLive CDやisoイメージからLinuxをインストールまたは起動したり、Windows上でアプリケーションとして動作するcoLinuxを利用するなどの方法があります。
An httpdの圧縮ファイルやexeファイル、ダウンロードも解凍展開もあっけないほど、あっという間に完了するはずです。
[オプション] -> [一般]
展開したらhttpd.exeファイルをダブルクリックして実行すると一瞬表示された後、非表示になり、終了停止するまではタスクバーに常駐してるのでタスクバーのhttpdアイコンを右クリックで[オプション 一般]、または、ダブルクリックしてメニューから[オプション]、続いて[一般]を選択します。
[一般]タブ
更に出てきた画面の[一般]タブを選択します。
CGIを実行する
デフォルトインデックス:
ドキュメントルート\
ここではCGIを利用したいので中ほどの[CGIを実行する]のチェックボックスをチェック、[ドキュメントルート¥]欄にローカルホスト接続時のパス(http://localhost/、http://127.0.0.1/ ...etc.)として利用するローカルディレクトリ(フォルダ)パスを設定、この後の説明の為に[デフォルトインデックス¥]欄にはindex.htmlを設定します。
これだけでドキュメントルートに指定したパスにindex.htmlを置いてブラウザでアドレス指定(http://localhost/、http://127.0.0.1/ ...etc.)すればファイル内容がブラウザに表示され、.cgiファイルをパス付きで指定、またはコールすれば、実行できるようになるはずです。
尚、ここではCygwin版Perlを想定している為、サンプルのPerlインタプリタ指定(1行め)はこのようになっていますが、Active Perlなどを使う場合は(Cドライブならc:で始まるPerl.exeがあるパスへ)変更が必要でしょう。
PostgreSQLのダウンロードはそれ相応の時間、インストールはいくつか設定項目も聞かれますが比較的短時間で完了するはずでインストール後はすぐに使用可能ですが、ネットワーク経由、またはローカル接続でCGIからアクセス、利用する為には追加でほんの少しだけ作業が必要です。
Windows Vista/7/8...等でPostgreSQLをインストールする場合には、exeファイルを右クリックしてメニューから『管理者として実行』とする必要があります。
インストール時の設定で『Advanced Options』では、デフォルトで[Default locale]となっているところは(日本語版Windowsではcp932/shift_jisになることで後に弊害が出るのを避ける為に)プルダウンメニューから"C"を選んだ方が無難なようです。
WindowsでPostgreSQLをインストールした場合にはWindows用のユーザーアカウント[postgres]が必要となるようです。
尚、インストーラでインストールするとWindows用の"postgres"ユーザーがグループに所属していないものとして自動的に作成されるものの、[コントロールパネル] > [ユーザーアカウント] > [(別の)アカウントの管理]では、グループに属するユーザーを表示する為、どこのグループにも属さない[postgres]というユーザーアカウントは表示されないのが正解のようです。
そのままでも構いませんが、管理目的など何らかの理由でグループに所属(Windowsのアカウント管理画面上に表示)させたい場合には、Vista/7では[管理者として実行]したコマンドプロンプトで以下のようにして既にあるpostgresアカウントをグループに追加するとよいようです。
プロンプト > net localgroup users postgres /add
ちなみにコマンドプロンプト上での既存ユーザー確認は以下のように行います。
プロンプト > net user
または、
プロンプト > net localgroup users
仮にここに[postgres]というユーザーアカウントを表示させたい(追加したい)場合には、以下のようにしますが、この操作で追加されるユーザーは、既定でローカルコンピュータ上のUsersグループに属します。
プロンプト > net user postgres /add
尚、もし、PostgreSQLをアンインストールすることがあった場合でも[postgres]というユーザーアカウントはアンインストールされないので残したくない場合には、以下のようにします。
プロンプト > net user postgres /delete
*インストーラで作成出来なかった場合、コマンドプロンプトの話を知らずに慌てて[コントロールパネル] > [ユーザーアカウント] > [(別の)アカウントの管理]から作成してしまった場合には、アカウント管理画面にも(、起動時ログオン設定をしている場合には、そこにも)列挙されてしまい、プロファイルを作成やアカウントの詳細設定をしないと表示されるだけで意味をなしませんが、取り敢えずPostgreSQL自体は利用できます。
*うまくいかない場合、バージョンを必要に応じて置き換えればhttp://lets.postgresql.jp/documents/tutorial/windows/が参考になるでしょう。
PostgreSQLをインストールしたフォルダ以下のbinフォルダ内にpgAdmin3.exeというファイルがあるのでショートカットを作ってデスクトップなどにおいておくと便利です。
pgAdmin3.exe、または、ショートカットをダブルクリックして起動、サーバを選択して右クリックしてメニューから[接続]、取り敢えずユーザーpostgresとしてインストール時に設定したパスワードでログイン、必要に応じてユーザーやデータベース、テーブルなどをGUI(グラフィカルユーザーインタフェース)環境で作ることができます。
追加の作業とは、PostgreSQLをインストールしたフォルダとは別にインストール時に作業用フォルダとして指定したフォルダがある場合、そのフォルダ以下のdataフォルダ内にpg_hba.conf、postgresql.confという2つの設定ファイルがあるはずで必要に応じてこれを一部(1~2個所)編集することです。
WindowsでもCygwin版やLinuxにあるPostgreSQLでは、dataディレクトリの場所はインストールした(rootやその他)アカウントによって異なるようですが、[/usr/local/pgsql/data/]や[/var/lib/pgsql/data/]あたりと思われます。
そんなことはないかもしれませんが、もし、それらのファイルがない場合には、インストールしたPostgreSQLフォルダ以下のshareフォルダ内、CygwinやLinuxなら[/usr/share/postgresql/]などにpg_hba.conf.sample、postgresql.conf.sampleといったファイルがあると思いますのでそれを先のdataフォルダ内にコピー、.sampleをとって利用するとよいでしょう。
まず、pg_hba.conf ではファイルの後ろ10数行に着目、そこにはタイプ、DB所有者、ユーザー、アドレス、メソッドが指定されています(先頭にシャープ(#)がある行はコメント行)。
# TYPE DATABASE USER ADDRESS METHOD # IPv4 local connections: #host all all 127.0.0.1/32 md5 host all all 127.0.0.1/32 trust #host all all 127.0.0.1 255.255.255.255 trust # IPv6 local connections: #host all all ::1/128 md5 host all all ::1/128 trust # Allow replication connections from localhost, by a user with the # replication privilege. #host replication postgres 127.0.0.1/32 md5 #host replication postgres ::1/128 md5
レプリケーション権限の設定もありますが、ここではローカルでCGIを実行できればよいのでIPv4とIPv6の2種類の設定に着目、IPv4のアドレスの書き方には2種類ありますが、2つの内何れかの行、IPv6は1種類なのでその行、メソッドにも種類がありますが、ここではtrust(セキュリティを強化したい場合には暗号化方式md5)の行のコメントを外します(先頭のシャープを削除します)。
よって当該行に絞れば、ここでは以下の2行のコメントを外し(なければ追加し)、設定を有効としたことになります。
... # IPv4 local connections: host all all 127.0.0.1/32 trust # IPv6 local connections: host all all ::1/128 trust ...
次にpostgresql.confの編集個所ですが、ここでは、ローカル専用にするのでページ中段(おそらく60行め前後)にあるlisten_addressesのアスタリスク(*)をlocalhostに(ここでは元を#でコメントアウトしてコピーしたものを変更)します。
... #listen_addresses = '*' # what IP address(es) to listen on; listen_addresses = 'localhost' # コピーしてlocalhostに変更、元の行はコメントアウト #tcpip_socket = true # 場合によっては要追加(有効にする場合シャープ削除) # comma-separated list of addresses; # defaults to 'localhost'; use '*' for all # (change requires restart) port = 5432 # (change requires restart) max_connections = 100 # (change requires restart) ...
portはインストール時に聞かれますが、デフォルトでは5432、よって変更していなければport=5432となっているはずでmax_connectionsもそのままで良いでしょう、tcpip_socketは念のため追記したものの今回の構築では結果的に不要でしたが、場合によっては必要になることもあるようです。
[編集] -> [プロパティ]
pgAdmin3.exe、または、ショートカットをダブルクリックして起動、使用するサーバを選択、右クリックまたは、[編集]メニューから[プロパティ]を開きます。
サーバ | |
プロパティ|SSL|先進的 | |
名前 | |
ホスト | |
Port | |
サービス | |
DBメンテナンス | |
ユーザ名 | |
パスワード | |
パスワード保存 | |
色づけ | |
グループ |
[名前]欄には、適当な名称を、[ホスト]にはlocalhost、[Port]には先のポート番号(デフォルト5432)を設定、あとは適宜ユーザ名、グループ欄を埋めます。
これでCGIからデータベースに接続が可能になるはずです。
CGIからPostgreSQLへのアクセスには、DBI.pmを利用するとよいでしょう。
# 接続サンプル ... use DBI; $dbh=DBI->connect("dbi:Pg:dbname=xxxdb_namexxx","",""); # $dbh=DBI->connect("dbi:Pg:dbname=xxxdb_namexxx","xxxuserxxx","xxxpasswordxxx"); # $dbh=DBI->connect("dbi:Pg:dbname=xxxdb_namexxx","xxxuserxxx","xxxpasswordxxx",{AutoCommit=>0}); # $dbh=DBI->connect("dbi:Pg:dbname=xxxdb_namexxx;host=xxxhost_namexxx","xxxuserxxx","xxxpasswordxxx"); # $dbh=DBI->connect("dbi:Pg:dbname=xxxdb_namexxx;host=xxxhost_namexxx","xxxuserxxx","xxxpasswordxxx",{AutoCommit=>0}); ...
上記設定の何れかでログインし、利用可能になるはずで{AutoCommit=>0}は、自動コミットをOFFにする指定、AutoCommit指定を省略した場合は、デフォルトの1(ON)でINSERT/UPDATEなど当該SQL命令が成功すれば自動的にコミットされます(本来不要なSELECTでもコミットが必要な場合も)。
終了・切断は、disconnectを使用します。
# 切断サンプル ... $dbh=DBI->disconnect; ...
CygwinやLinuxでPostgreSQLを利用する場合には、以下の環境変数を設定しておくとよいでしょう。
export POSTGRES_HOME=/usr/local/pgsql
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$POSTGRES_HOME/lib
export PGLIB=$POSTGRES_HOME/lib
export PGDATA=$POSTGRES_HOME/data
export PATH=$PATH:$POSTGRES_HOME/bin
export PGPORT=5432
CygwinやLinuxでPostgreSQLを利用する場合には、initdbとpostmaster、もしくは、これを操作可能なpg_ctlを実行します。
initdbは、1つのサーバインスタンスで管理されるデータベースの集合であるPostgreSQLデータベースクラスタを作成し、利用可能なように初期化(pgAdminから見ると各データベース配下で階層になっている各種情報を作成・設定)してくれます。
PostgreSQLのマルチユーザデータベースサーバであるpostmasterまたは、これを操作可能なpg_ctlは、ネットワーク接続またはローカル接続を可能にし、逆に言うとこれらの接続をする場合には、必要になりますから、何れかを利用してPostgreSQLを待機させます。
postmasterは、デフォルトではフォアグラウンドで実行されるのでboot時などにバックグラウンドで起動させる必要がありますが、こうしたことを含め、デフォルトでバックグラウンド起動するpg_ctlを利用するのが便利です。
pg_ctlではPostgreSQLのstart/stop/restart/reloadやstatusによる状態確認などが可能で動的にアクセスできるように待機させるには、startを設定します。
$ pg_ctl start
クライアントアプリケーションがデータベースに接続するためには、稼働しているpostmasterに(ネットワークを介して、またはローカルで)接続する必要があります。
Cygwinでc:\といったスタイルやProgram Filesのような空白を含むパス(エスケープした[Program\ Files]でも)、また、Desktop/desktop/デスクトップなどディレクトリ名が多バイト文字(日本語)として表わされる可能性がある場合などにエラーが出る場合があります。
これを無効にし回避するには、環境変数「CYGWIN」に「nodosfilewarning」を設定すると良いようです。
環境変数CYGWINには、この他、ntsec/ntsec tty/serverなどの設定値もあり、どうしても変更できない場合の対処法は未調査です。
ローカル環境と実運用するサーバ環境でWebサーバやPerl、PostgreSQLといったサーバやアプリケーションがバージョン含め異なる場合、ローカルで動作したとしても実運用環境で動作するとは限りませんので、そういう場合には、その状況に合わせて修正や調整する必要があります。