ふにょい日記

ふにょ・い 2 (形)[文]ク ふにょ・し 思い通りにならない為力が入らなくなる様。[派生] ――げ(形動)――さ(名)

CentOS で /usr/local/lib を認識させる設定方法

2010-11-28 07:03:29 | プログラミング・コンピューター
CentOS (5.4) では、 /usr/local/lib がデフォルトでは認識されないようなので、その設定方法をメモしました。
yum でインストールすると /usr/lib にインストールされるのですが、
自分でビルドしてインストールすると、デフォルトでは /usr/local/lib に入ったりしますので
その場合に設定が必要になります。


実行時にライブラリを認識させるには、
/etc/ld.so.conf.d ディレクトリに usr-local-lib.conf 等のファイル名(*.conf の必要がある)で
/usr/local/lib
という内容(参照させたいディレクトリを一行ずつ列挙)のファイルを作って、 ldconfig コマンドを実行します。

# echo /usr/local/lib > /etc/ld.so.conf.d/usr-local-lib.conf
# ldconfig

もし、 /etc/ld.so.conf.d が無いなら、 *.conf のファイルを新たに作る代わりに /etc/ld.so.conf に追記します。


また、 ./configure は、 pkg-config でライブラリの確認とコンパイルとリンクに必要なパラメータの取得を行う為、
pkg-config にも認識させる必要があります。
pkg-config に認識させるためには、

# export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig

とします。
ただ、再起動しても有効であるようにする為に、 /etc/profile.d/ に pkg-config.sh 等のファイル名(*.sh の必要がある)で

PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH

という内容(実行させたいシェルスクリプト)のファイルを作ります。
Cシェル系のシェルを使っている場合は、 *.csh のファイル名で、Cシェル系のスクリプトファイルを作るのでしょう。

node-canvas をインストールしてみました

2010-11-28 07:01:04 | プログラミング・コンピューター
ServersMan@VPS (CentOS 5.4) に node-canvas をインストールした時、結構引っかかってしまいました。
ただ、引っかかったのは、自分が Linux についての初歩的であろう知識が足りなかった為です。

Node.js は安定版(0.2.5)をインストールしてあります。
npm も既にインストールしてあります。

以前、 ImageMagick をインストールしてたので、その時に色々入りました。
また、以前、 node-image をインストールしたときに yum で giflib* をインストールかアップデートしました。

node-canvas のインストールは、
# npm install canvas
とするだけですが、その前に cairo がインストールされていなければなりません。
yum で cairo をインストールして、あるいは、既に yum によって cairo がインストールされていた状態で、上のコマンドを実行しても

cairo_format_stride_for_width was not declared in this scope

というようなコンパイルエラーが出て npm install canvas が失敗しました。
どうも、 yum でインストールされる cairo のバージョンが 1.2.4-5.el5 と古い為のようです。(ググって見つけたどこかの ML のアーカイブを読むと、このエラーの解決には、 cairo 1.6 以降が必要と読めました。)
なので、自分で cairo をビルドしました。

cairo には、 pixman が必要なようなのでそれもビルドします。
pixman は cairo と同じプロジェクトで作業されているようで、同じサイトで配布されています。

# wget http://cairographics.org/releases/pixman-0.21.2.tar.gz
# tar xvfz pixman-0.21.2.tar.gz
# cd pixman-0.21.2
# ./configure
# make
# install

これで、 pixman が /usr/local/lib にインストールされました。
次に cairo をビルドするが、これまで一度も /usr/local/lib にインストールした事が無かった場合(手動でビルド~インストールした事がない場合)、
設定をしないとライブラリが認識されません(これが分かりませんでした)。

/usr/local/lib を認識させる為の設定は、長くなった上に今回の作業に特有の物ではない為、
別記事に分離しましたので、そちらをご参照ください

/usr/local/lib を認識させる為の設定の後、下記のようにして cairo をビルド、インストールしました。

# wget http://cairographics.org/releases/cairo-1.10.0.tar.gz
# tar xvfz cairo-1.10.0.tar.gz
# cd cairo-1.10.0
# ./configure --enable-gobject=no
# make
# install

./configure の引数に --enable-gobject=no を指定したのは、下記のエラーを解決できず、
面倒になった為に、エラーを回避する事にした為です。

Making all in cairo-gobject
make[4]: Entering directory `/root/cairo-1.10.0/util/cairo-gobject'
CC libcairo_gobject_la-cairo-gobject-enums.lo
cairo-gobject-enums.c: In function 'cairo_gobject_status_get_type':
cairo-gobject-enums.c:14: error: implicit declaration of function 'g_once_init_enter'
cairo-gobject-enums.c:14: warning: nested extern declaration of 'g_once_init_enter'
cairo-gobject-enums.c:57: error: implicit declaration of function 'g_once_init_leave'
cairo-gobject-enums.c:57: warning: nested extern declaration of 'g_once_init_leave'
make[4]: *** [libcairo_gobject_la-cairo-gobject-enums.lo] Error 1
make[4]: Leaving directory `/root/cairo-1.10.0/util/cairo-gobject'

これで、 cairo がインストールできましたので

# npm install canvas

として、 node-canvas がインストールできました。
テスト用のスクリプトを実行してみると

node: symbol lookup error: /usr/local/lib/libcairo.so.2: undefined symbol: pixman_image_create_bits

と出ました。
どうやら、古い方の pixman (/usr/lib/ の方)がロードされてしまっているようなので、
先ほど自分でビルドしてインストールした方を( /usr/local/lib/libpixman-1.so )を読み込ませる為に、

# export LD_PRELOAD=/usr/local/lib/libpixman-1.so

とした後、再度実行すると成功しました。
本当は古い pixman をアンインストールするべきなのでしょうが、そうすると釣られて、
色んな物がアンインストールされてしまうでしょうから、とりあえず、再起動しても有効なように
上のスクリプトを /etc/profile.d/libpixman-1.sh に保存しました。

他にもっといい方法があるのでしょうが…。

node-image を使ってみました

2010-11-28 06:44:18 | プログラミング・コンピューター
Node.js から画像ファイルを作りたいと思ったので良い方法がないか探してみました。
node-imagemagick は、 ImageMagick のコマンドを起動するラッパーのようだったので
止めて、 node-image なる物をインストールしてみました。

node-image のインストールのコマンドは

# npm install image

ですが、事前に gif, png, jpeg のライブラリがインストールされている必要があるようです。

下記のような感じで、黒の背景に×が描画された PNG ファイルが生成されます。

var fs = require('fs');
var Image = require('image');

var img_w = 100;
var img_h = 100;
var img_ch = 3;
var img_size = img_w * img_h * img_ch;
var img_buf = new Buffer(img_size);

var i, j;
for (i = 0; i < img_size; ++ i) {
    img_buf[i] = 0;
}

for (i = 0; i < img_w; ++ i) {
    img_buf[img_w * img_ch * i + img_ch * i ] = 255;
    img_buf[img_w * img_ch * i + img_ch * i + 1] = 196;
    img_buf[img_w * img_ch * i + img_ch * i + 2] = 100;

    j = img_w - i;
    img_buf[img_w * img_ch * i + img_ch * j ] = 255;
    img_buf[img_w * img_ch * i + img_ch * j + 1] = 196;
    img_buf[img_w * img_ch * i + img_ch * j + 2] = 100;
}

var png_img = new Image('png', 'rgb').encodeSync(img_buf, img_w, img_h);

fs.writeFileSync('test.png', png_img.toString('binary'), 'binary');

線などは自分で描画しなければいけないようなので、面倒そうです。