昨日、WindowsでもPL/Rで日本語を普通に使う方法が分かったので、改めてRとPostgreSQLともにポータブルでPL/Rを使えるようにしました。実行環境はWindows 7 32bit + PostgreSQL Portable 9.3.5 + R Portable 3.1.2 + PL/R 8.3.0.15。PostgreSQLが9.4でないのは、現時点でPL/Rの公式サイトでWindows 32bit + PostgreSQL 9.4用のコンパイル済ライブラリが配布されていないため(64bit版はあり)。
PostgreSQLを起動する際、環境変数にRのパスを入れます。そこで最初にポータブル版Rを準備しますが、前のブログで書いた時(2015/03/31)と同内容なので今日は省略。実際のところPL/Rに使う上では、任意の場所にポータブル版Rが解凍されているだけで済みます。
Contents
ポータブル版PostgreSQL 9.3の準備
まずポータブル版PostgreSQLプロジェクトの公式サイト> 9.3のページからPostgreSQLPortable-9.3.5.paf.exe(23.2 MB)をダウンロードし実行。指定した場所にファイル一式が解凍されるだけで、サービスやレジストリなどWindowsシステムに変化を与えないため、通常版(EnterpriseDB社のインストーラで入れたもの)との併存もできます。
↓ 終了画面。ここで起動しても後で再起動が必要になるので、今回は起動しません。
データベースクラスタ初期化
ちょうどブログをこちらに引っ越してから実質最初の記事で、ポータブル版PostgreSQLについてデータベースクラスタ初期化と起動・終了を別々のバッチファイルで実行する例を書きました。デフォルトでは両者が一つのバッチに入っていますが、初期化は最初以外めったに必要ない一方、起動は、今回のように組み込み言語を追加したり拡張機能を入れると設定変更がよく生じます。
初期化で行う内容は上の記事と同じで、initdbコマンドの実行のみ。ポータブル版PostgreSQLの一番上のフォルダでコマンドプロンプトを開く場合、下のような感じになります。ここでロケールをCにすることが、昨日書いたとおりPL/Rで普通に日本語を使うためのカギ。画像の二つ目(エクスプローラの次)が、実行時の様子です。
"App/PgSQL/bin/initdb" -U postgres -D "Data/data" -E utf8 --locale=C
PL/Rの準備
PostgreSQLを起動する前に、PL/Rのファイル一式をそろえて必要な準備を済ませます。公式サイトからWin32 plr.dll for Postgres 9.3.x (plr-8.3.0.15)のリンクをクリックすると ↓ のZIPがダウンロードされるので、README.txtの内容を適宜ポータブル版PostgreSQLとRに読み変えます。
README.txtにある指示は(1)ファイルを必要な場所にコピー、(2)環境変数の設定、の二つ。後者はPostgreSQLの起動用バッチファイルを作る時に参照し、ここでは前者だけ行います。
基本的に他の拡張機能と同じで、PostgreSQLのlibフォルダにライブラリを、share/extensionフォルダにEXTENSIONインストール用ファイルをコピー。libとshareの両フォルダは、下のようにポータブル版PostgreSQLのインストール直下 →App→PgSQLの中です。
ファイルとコピー先の対応は次のとおりで、ライブラリが一つ、他はEXTENSIONファイル。~はポータブル版PostgreSQLインストール直下の意味です。
ファイル | コピー先
|
---|
plr.dll | ~/App/PgSQL/lib
|
plr.control | ~/App/PgSQL/share/extension
|
plr--8.3.0.15.sql
|
plr--unpackaged--8.3.0.15.sql
|
plr.sql
|
PostgreSQL起動・終了用バッチファイルの作成
数日前にPL/Pythonを準備した時(2015/05/19)と基本同じで、PostgreSQLフォルダにコピーしたライブラリからR(Python)本体をきちんと使えるよう環境変数を追加します。ここで、最初に準備したポータブル版Rのインストール先からbinなど主要フォルダのある位置 ↓ を確認。次でR_HOMEという環境変数に入れるので。
↓ 作成したバッチファイルの場所と中身。基本は「ポータブル版PostgreSQL:起動・終了・再起動を一つのコンソールで」(2015/05/03)と同じで、これにPL/RのREADME.txtの指示どおり環境変数R_HOMEとPATHを追加しました。あと確認用にRのバージョン情報を出すコマンドも追加。
@echo off
set pgdir=App/PgSQL
set ctl=%pgdir%/bin/pg_ctl
set dir=Data/data
set pid=%dir%/postmaster.pid
:: set environmental variables for PL/R
set r_home=%~d0/AppsPortable/R-Portable/App/R-Portable
set path=%pgdir%/bin;%pgdir%/lib;%r_home%/bin/i386
:: indicate R and its version
echo.
R --version
echo.
if exist "%pid%" (
echo postmaster.pid exists and PostgreSQL have been started possibly.
goto ask
) else (
"%ctl%" -D "%dir%" -w start
)
:ask
set /p inp="press [R] to restart PostgreSQL, [Q] to quit : "
if "%inp%"=="R" (
"%ctl%" -D "%dir%" -w restart
goto ask
) else if "%inp%"=="Q" (
"%ctl%" -D "%dir%" -w stop
goto :eof
)
goto ask
↓ 起動した様子。R本体へのパスが通っていれば、先頭にRのバージョン表示とメッセージが出ます。ただしPL/Pythonの記事の最後に書いたように、これだけでは、まだ組み込み言語としてきちんと機能するか分かりません。実際にデータベースにPL/Rを入れ、何かストアド関数を作成・実行して確認します。
データベースへのPL/Rインストール&動作確認
EnterpriseDB社のインストーラと違って、ポータブル版PostgreSQLはpgAdminへのサーバ追加を手動で行う必要があります。下のように、オブジェクトブラウザからサーバ追加ダイアログを開き、適当な名前を設定して追加。ポート番号がデフォルトの5432でないのは、既存のサーバと被らないよう変えたためです(別途postgresql.confを修正して保存)。
次にPL/Rテスト用データベース ↓ を作成。この時点ではpublicスキーマに何もありません。
↓PL/Pythonや他の拡張機能と同様にCREATE EXTENSION一文でインストールし、無事通れば、ひとまずデータベース上でPL/Rを使える状態。publicスキーマの中を見ると、PL/Rが主に内部で使う関数・型が追加されています(二つ目の画像)。
publicスキーマに自分のストアド関数を作ると、元からある内部用の関数と混在してしまうので、別のスキーマを作って昨日と同じテスト用の関数 ↓ を作成・実行した様子。Rにshowtextパッケージをインストールするなど若干の準備がいりますが(詳細は昨日の記事を参照)、ともかく日本語と好きなフォントを使って、SQLから直接PDF出力ができました。