け〜くんこと K.Ktouth のだらだらした日常と突発的に作るプログラムや読み物とかの雑多サイト
相変わらず風邪気味。調子悪い。
つーか、仕事中ずっと両膝が痛くて力が入れにくかった。これって風邪の初期症状よね……長引きそうだったので明日あるらしい会社の花見の席は断ってみた
こういうときに……俺ってタイミング悪い orz
で、現在写真投稿まわりの実装を進めているわけですが、ImageScienceというRubyライブラリが最近話題になっていたので、サムネイル作成にこれを使ってみようとインストールをしてみました。
ローカルでは特に問題なく動作したのですが……問題はさくらサーバの方。
まず、前提ライブラリである「FreeImage」ですが、root権限でのインストールしか考慮してないため、コンパイル成功後のインストールに失敗します。
まぁ、必要ファイル自体は多くないので、手作業でホームディレクトリ以下の各ディレクトリ($HOME/lib $HOME/include)にコピーして完了。
もう一つの前提ライブラリ「RubyInline」と「ImageScience」はgem形式なので素直に「gem install -r image_science」と入力すればOK。
もちろん、事前にrubygemのセットアップと、ホームフォルダ以下へのインストールはすんでるし、GEM_HOME環境変数も設定済み。
で、これで使用可能になるか……と思ったら失敗多数。
telnetで「ruby -rubygems 'require "image_science"; p :OK!'」が成功しない。
ここからが結構時間かかりました。
現時点でのImageScience(1.1.1)にはちょっとしたバグがあって、環境によってはそのためコンパイルが通りません。
これがエラーメッセージ
# ここ以下の$HOME $GEM_HOMEなどは適時読み替えてください
%ruby -rubygems -I$HOME/include -e 'require "image_science"; p :OK!'
$GEM_HOME/gems/image_science-1.1.1/lib/image_science.rb: In function `resize':
$GEM_HOME/gems/image_science-1.1.1/lib/image_science.rb:189: syntax error before `*'
$GEM_HOME/gems/image_science-1.1.1/lib/image_science.rb:190: `image' undeclared (first use in this function)
$GEM_HOME/gems/image_science-1.1.1/lib/image_science.rb:190: (Each undeclared identifier is reported only once
$GEM_HOME/gems/image_science-1.1.1/lib/image_science.rb:190: for each function it appears in.)
$GEM_HOME/gems/image_science-1.1.1/lib/image_science.rb: In function `save':
$GEM_HOME/gems/image_science-1.1.1/lib/image_science.rb:200: syntax error before `int'
$GEM_HOME/gems/image_science-1.1.1/lib/image_science.rb:201: `flags' undeclared (first use in this function)
$GEM_HOME/gems/RubyInline-3.6.2/./inline.rb:408:in `build': error executing cc -shared -O -pipe -D_THREAD_SAFE -fPIC -I /usr/local/lib/ruby/1.8/i386-freebsd4 -o "$HOME/.ruby_inline/Inline_ImageScience_aa58.so" "$HOME/.ruby_inline/Inline_ImageScience_aa58.c" -lfreeimage -lstdc++: 256 (CompilationError)
Renamed $HOME/.ruby_inline/Inline_ImageScience_aa58.c to $HOME/.ruby_inline/Inline_ImageScience_aa58.c.bad from $GEM_HOME/gems/RubyInline-3.6.2/./inline.rb:628:in `inline'
from $GEM_HOME/gems/image_science-1.1.1/lib/image_science.rb:84
from $HOME/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:33:in `gem_original_require'
from $HOME/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:33:in `require'
from -e:1
まず気になったのが、キャッシュをチェックして必要ならコンパイルするというRubyInlineの仕様。ということは、CGI動作する際にもコンパイラ用のパラメータを渡す必要があるわけです。
もちろん今回のバグの修正もしなくてはなりません。
ということで、image_science.rbの修正を。
ヘッダとライブラリに関しては単純にパスを追加したらいいわけですから……
inline do |builder|
if test ?d, "/opt/local" then
builder.add_compile_flags "-I/opt/local/include"
builder.add_link_flags "-L/opt/local/lib"
end
builder.add_compile_flags "-I$HOME/include"
builder.add_link_flags "-L$HOME/lib"
builder.add_link_flags "-lfreeimage"
builder.add_link_flags "-lstdc++" # only needed on PPC for some reason. lame
builder.include '"FreeImage.h"'
……と、オプション追加。
コンパイルエラーも、よくよくチェックしてみれば単純。
VALUE resize(int w, int h) {
FIBITMAP *image;
GET_BITMAP(bitmap);
image = FreeImage_Rescale(bitmap, w, h, FILTER_CATMULLROM);
VALUE save(char * output) {
FREE_IMAGE_FORMAT fif = FreeImage_GetFIFFromFilename(output);
if (fif == FIF_UNKNOWN) fif = FIX2INT(rb_iv_get(self, "@file_type"));
if ((fif != FIF_UNKNOWN) && FreeImage_FIFSupportsWriting(fif)) {
int flags;
GET_BITMAP(bitmap);
flags = fif == FIF_JPEG ? JPEG_QUALITYSUPERB : 0;
……つまり、C言語なのに変数宣言がブロック先頭になってなかったというだけでした。単純な文法ミスなのですぐにでも修正されるでしょう。
これでコンパイルが通り、利用が可能になるはずです。
これで使用準備は整ったと言うことで、CGIの方での使い方。
スクリプトはいきなりrubyコードを書くのではなく、ファイルの先頭で環境変数をきちんと設定する必要があります。
具体的にはこんな感じです
#!/bin/sh
HOME=/home/xxxxxx # ホームディレクトリを指定する
VER=1.8
ARCH=i386-freebsd4 # ここら辺はさくらサーバの設定XLIB=$HOME/lib/ruby # rubyライブラリのベースディレクトリ
XSLIB=$XLIB/site_ruby # rubyライブラリのsiteディレクトリ# 以下の4つが動作に必要な環境変数
export RUBYLIB=$XSLIB/$VER:$XSLIB/$VER/$ARCH:$XSLIB:$XLIB/$VER:$XLIB/$VER/$ARCH
export LD_LIBRARY_PATH=$HOME/lib:/usr/local/lib:/usr/lib:/lib
export GEM_HOME=$HOME/rubygems
export INLINEDIR=$HOMEexec ruby -S -Ku -x $0 "$@" # ここで改めてrubyスクリプトを呼び出す。-xオプションで、次の行まで読み飛ばし
#!/usr/local/bin/ruby
これで正しくライブラリをロードすることができることを確認しました。
適当に画像ファイルを読み込もうとすると「Unknown File Format」エラーが出て例外終了してしまいました。
……どーやら、肝心のFreeImageライブラリが正しく動作してない模様
こっちはコードが多くて、解析するより別の方法を探ったほうが早そうな予感……
……って、ここまでの処理が無駄!?(ぉ
# まぁ、動く人はこれで動くでしょ、って事で^^;
OVA『バカとテストと召喚獣 〜祭〜』上巻 [Blu-ray]
(メディアファクトリー)
新品 ¥ 4,409
中古 ¥ 3,680
OVA『バカとテストと召喚獣 〜祭〜』下巻 [Blu-ray]
(メディアファクトリー)
新品 ¥ 4,438
中古 ¥ 2,980
生徒会役員共DJCD「アニメ生徒会役員共が全部わかるラジオ、略して全ラ!...
(キングレコード)
新品 ¥ 2,238
中古 ¥ 1,850
WORKING!! 9 初回限定特装版 (SEコミックスプレミアム)
(高津 カリノ)
新品 ¥ 2,896
中古 ¥ 2,835
「声優グランプリ」公認!声優界<雀王>決定戦! <J-1グランプリ> V...
(オムニバス)
新品 ¥ 3,159
中古 ¥ 3,099
デッドライジング 2【CEROレーティング「Z」】
(カプコン)
新品 ¥ 2,740
中古 ¥ 1,014
スプリンターセル コンヴィクション
(ユービーアイ ソフト)
新品 ¥ 2,979
中古 ¥ 1,397
Xbox 360 250GB
(マイクロソフト)
新品 ¥ 34,980
中古 ¥ 25,400
学園黙示録 HIGHSCHOOL OF THE DEAD 7 オリジナル...
(佐藤 大輔)
新品 ¥ 9,800
中古 ¥ 4,797
学園黙示録 HIGHSCHOOL OF THE DEAD SECRET ...
(佐藤 大輔)
中古 ¥ 2,500
ソードアート・オンライン〈5〉ファントム・バレット (電撃文庫)
(川原 礫)
中古 ¥ 692
RPG W(・∀・)RLD6 ―ろーぷれ・わーるど― (富士見ファンタ...
(吉村 夜)
新品 ¥ 651
中古 ¥ 1
魔法少女リリカルなのはViVid (3)限定版 (角川コミックス・エース...
(藤真 拓哉)
新品 ¥ 1,680
中古 ¥ 1,338
魔法戦記リリカルなのはForce (3)限定版 (角川コミックス・エース...
(緋賀 ゆかり)
新品 ¥ 1,680
中古 ¥ 418
ダンジョンズ&ドラゴンズ第4版スターター・セット
(ジェームズ ワイアット)
新品 ¥ 4,980
中古 ¥ 4,311
アリアンロッド・サガ・リプレイ(5) 激闘のピースメイカー (富士見ド...
(菊池 たけし/F.E.A.R.)
新品 ¥ 693
中古 ¥ 190
アリアンロッド・サガ・コンチェルト 1 (電撃コミックス)
(佐々木 あかね)
新品 ¥ 599
中古 ¥ 90
堀さんと宮村くん(7)(ガンガンコミックスONLINE)
(HERO)
新品 ¥ 1,000
中古 ¥ 747
浅尾さんと倉田くん(3)(ガンガンコミックスONLINE)
(HERO)
新品 ¥ 690
中古 ¥ 370
7と嘘吐きオンライン―HERO個人作品集―(ガンガンコミックスONLIN...
(HERO)
新品 ¥ 710
中古 ¥ 158
ONE PIECE 65 (ジャンプコミックス)
(尾田 栄一郎)
NARUTO―ナルト― 59 (ジャンプコミックス)
(岸本 斉史)
ワンピース 海賊無双(通常版)(初回特典:オリジナルカスタムテーマ9種DLコード、ソーシャルゲーム専用レアフィギュア用コード同梱)
(バンダイナムコゲームス)
ドラゴンズドグマ(数量限定特典『バイオハザード6』体験版用DLコード同梱)
(カプコン)