前回書いたPL/R修正の件、Scientific Linux 7.1の仮想マシンでビルドしたら、確かに問題のクエリでもPostgreSQLが落ちなくなりました^o^ ビルドとサーバ起動時の環境変数の設定が、意外に情報が少なく苦労。R、PostgreSQLと合わせて手順をまとめておきます。本当はMinGW-w64Windows向けにもしたいところ、まだRのビルドができず足踏み中なので、こちらを先に。
Contents



ベースはstackletScientific Linux 7.1(VMDK)

下記にあるScientifc Linux 7.1GUIなし軽量版VMイメージ(VMDK形式)。ちょうど昨年の夏に前バージョン7.0を使いました。

» stacklet - Scientific 7.1 Lightweight x86_64
 (scientific.7-1.x86-64.20150417.vmdk.tar.bz2)


他の主要ディストリは概ね有償だけど、これは今のところ無償。230MBと軽く(展開しても1GB程度)、最初からOpenSSHが有効で、すぐ親機から操作できます。今日はこれを
Portable VirtualBoxで起動し、いつものWin + ConEmuで接続しました。

↓ インストール済みパッケージ一覧。この他コンパイラなど若干追加が必要でした(詳細は次項)。Scientific Linuxをゼロベースで使う時に備えてメモ。

» yum_list_installed_init.txt
$ yum list installed
acl.x86_64                           2.2.51-12.el7                  @sl
acpid.x86_64                         2.0.19-5.el7                   @sl
at.x86_64                            3.1.13-17.el7_0.1              @sl
attr.x86_64                          2.4.46-12.el7                  @sl
audit.x86_64                         2.4.1-5.el7                    @sl
audit-libs.x86_64                    2.4.1-5.el7                    installed
authconfig.x86_64                    6.2.8-9.el7                    @sl
avahi-libs.x86_64                    0.6.31-14.el7                  @sl
basesystem.noarch                    10.0-7.el7                     installed
bash.x86_64                          4.2.46-12.el7                  installed
bc.x86_64                            1.06.95-13.el7                 @sl
bind-libs-lite.x86_64                32:9.9.4-18.el7_1.1            @sl-security
bind-license.noarch                  32:9.9.4-18.el7_1.1            @sl-security
binutils.x86_64                      2.23.52.0.1-30.el7_1.1         @sl-fastbugs 
...



ビルドの全コマンドまとめ

普通はアップデートから始めると思いますが、今回は最速でPL/Rの動作確認することにしぼりました。↓ 実行した全コマンド。バージョンはPostgreSQL 9.5.3、R 3.3.0。それぞれのビルド前に必要なパッケージを追加してます。
# useradd postgres
$ su - postgres

-- get sources and extract them.
~$ wget https://ftp.postgresql.org/pub/source/v9.5.3/postgresql-9.5.3.tar.bz2
~$ wget https://cran.r-project.org/src/base/R-3/R-3.3.0.tar.gz
~$ wget https://github.com/jconway/plr/archive/master.zip
~$ tar -xf R-3.3.0.tar.gz
~$ tar -xf postgresql-9.5.3.tar.bz2
~$ unzip master.zip

-- build postgres
$ sudo yum -y install gcc-c++ readline-devel zlib-devel libxml2 libxml2-devel
$ cd postgresql-9.5.3
$ ./configure --enable-nls --with-libxml
$ make -j2
$ sudo make install

-- build R
$ sudo yum -y install gcc-gfortran bzip2-devel pcre-devel libcurl-devel
$ cd ~/R-3.3.0
$ ./configure --enable-R-shlib --with-x=no
configure: WARNING: you cannot build info or HTML versions of the R manuals
configure: WARNING: you cannot build PDF versions of the R manuals
configure: WARNING: you cannot build PDF versions of vignettes and help pages
$ make -j2
'pdflatex' is needed to make vignettes but is missing on your system.
$ sudo yum -y install perl
$ sudo make install

-- build PL/R
$ cd ~/plr-master
$ export PATH="${PATH}:/usr/local/pgsql/bin"
$ export R_HOME=~/R-3.3.0
$ USE_PGXS=1 make
$ sudo USE_PGXS=1 make install


Rのビルド中、赤い部分はマニュアル等のHTML、PDFが省かれた旨。動作には特に関係ないです。またX-Window関連も不要なので(このゲスト側でプロット表示とかしない)configureで外しました。最後のPL/Rビルド~インストールが終わると ↓ こんな感じ。sudoは、この時はsurootになって実行。


振り返ると、PostgreSQLのビルドはいつも通り。Rも、PL/Rを使うため--enable-R-shlibconfigureする点以外は普通です。ただPL/Rが、
ドキュメントでは「Windowsでは環境変数PATHR_HOMEを設定してmake」となっているけど、今回のScientific Linuxでも同様でした。PostgreSQLRのインストール時に、想定されてるパスが入らなかった模様。



PostgreSQLのデータベース作成と起動、PL/Rテスト

最初にDBの初期化。いつもと同様initdbで行います。↓
$ initdb -D ~/pgdata953 -E utf8 --no-locale -U postgres
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

The database cluster will be initialized with locale "C".
The default text search configuration will be set to "english".

Data page checksums are disabled.

creating directory /home/postgres/pgdata953 ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting dynamic shared memory implementation ... posix
creating configuration files ... ok
creating template1 database in /home/postgres/pgdata953/base/1 ... ok
initializing pg_authid ... ok
initializing dependencies ... ok
creating system views ... ok
loading system objects' descriptions ... ok
creating collations ... ok
creating conversions ... ok
creating dictionaries ... ok
setting privileges on built-in objects ... ok
creating information schema ... ok
loading PL/pgSQL server-side language ... ok
vacuuming database template1 ... ok
copying template1 to template0 ... ok
copying template1 to postgres ... ok
syncing data to disk ... ok

WARNING: enabling "trust" authentication for local connections
You can change this by editing pg_hba.conf or using the option -A, or
--auth-local and --auth-host, the next time you run initdb.

Success. You can now start the database server using:

    pg_ctl -D /home/postgres/pgdata953 -l logfile start


次にDBサーバ起動。サービスへの登録は省き、Windowsで普段やっているのと同様にアドホックに立ち上げます。

この時、PL/Rを使うための環境変数が必要で、結構つまづきました。要はplr.soからlibR.soを認識させること。メーリングリストでも何度か質問されてて、いろいろ試した結果有効だったのは ↓ こちらの1・2行目。
$ export PATH="${PATH}:${R_HOME}"
$ export LD_LIBRARY_PATH="/usr/local/pgsql/lib:${R_HOME}/lib"
$ pg_ctl -D ~/pgdata953 start


LinuxPL/Rをパッケージインストールする際は環境変数が自動的に設定されるし、Windows上でもLD_LIBRARY_PATHが必要だったことはなく、この設定に行き着くまで長かった…。


ともかく以上で準備できました。PL/R用の適当なDBを作り、CREATE EXTENSIONを実行します(これが通らない場合、たいてい環境変数がおかしい)。
$ psql
# create database test_plr;
# \c test_plr
# create extension plr;


EXTENSIONのバージョン表示は従前の最新版8.3.0.16のままですが、
前回書いたとおり3月末に一部修正あり。その結果を確認するクエリが ↓ こちら。引数をas.integerなど数値型にそのまま突っ込むストアドを作り、NULLを渡します。今まではこれでサーバがクラッシュしてました。
create or replace function public.rint2(i smallint)
returns smallint
language plr as
$$
return (as.integer(i))
$$;

select rint2(NULL);  -- Postgres crashes on previous PL/R. 


↓ 今回の最新版では、ちゃんと直ってました^o^NULLを渡してもクラッシュせず、そのままNULLが返ります。


これで一応、LinuxについてはパッケージによらずソースからPL/Rを使える目途が付きました。問題はWindows、というかMinGWRPythonをクロスコンパイルすること自体できてない現状。困ったものです。