2011-11-26
OS X Lion 64bitでRailsからRMagickを使えるようにImageMagickをインストールする
以前いろいろ試行錯誤したんだけど上手くいかなくて、
MacのRailsでなぜかImagemagickが動かないので開発に支障が出ている。Railsのバージョンがもうちょい古い時は動いてたのになあ。RailsなしでRMagick使うと動くというのがよくわからん
とかつぶやいていたところ、
@hedachi 1.9系のrmagickでsegmentaion faultなら--disable-openmp付けて再コンパイルですが、それとは違う感じですか?
という助言を頂いて試してみたら、ありがたいことにうまくいったので、後々主に自分が読むためにメモ。
./configure --disable-openmp
make
make install
これでImageMagickのコンパイルはうまくいったんだけど、rmagickのインストールが以下のとおり失敗。
hedachiMac:wand hedachi$ sudo gem install rmagick
Building native extensions. This could take a while...
ERROR: Error installing rmagick:
ERROR: Failed to build gem native extension.
/opt/local/bin/ruby1.9 extconf.rb
checking for Ruby version >= 1.8.5... yes
checking for /usr/bin/gcc-4.2... yes
checking for Magick-config... yes
checking for ImageMagick version >= 6.4.9... yes
checking for HDRI disabled version of ImageMagick... yes
Package MagickCore was not found in the pkg-config search path.
Perhaps you should add the directory containing `MagickCore.pc'
to the PKG_CONFIG_PATH environment variable
No package 'MagickCore' found
Package MagickCore was not found in the pkg-config search path.
Perhaps you should add the directory containing `MagickCore.pc'
to the PKG_CONFIG_PATH environment variable
No package 'MagickCore' found
Package MagickCore was not found in the pkg-config search path.
Perhaps you should add the directory containing `MagickCore.pc'
to the PKG_CONFIG_PATH environment variable
No package 'MagickCore' found
Package MagickCore was not found in the pkg-config search path.
Perhaps you should add the directory containing `MagickCore.pc'
to the PKG_CONFIG_PATH environment variable
No package 'MagickCore' found
checking for stdint.h... yes
checking for sys/types.h... yes
checking for wand/MagickWand.h... no
Can't install RMagick 2.13.1. Can't find MagickWand.h.
エラーメッセージにある通り、PKG_CONFIG_PATHが設定されてないのがよくないらしい。
~/.bash_profileでPKG_CONFIG_PATHをexport - きれいさっぱり、逝くぜ
ということで設定してみた。
export PKG_CONFIG_PATH=/Users/hedachi/ImageMagick-6.7.3-8/magick/
んだけどうまくいかない。
で、困った末に環境変数を読んでるユーザが違うのかなと思い、
sudo export PKG_CONFIG_PATH=/Users/hedachi/ImageMagick-6.7.3-8/magick/
だとなぜかエラーになるので、
sudo su
でrootになって、再度、
export PKG_CONFIG_PATH=/Users/hedachi/ImageMagick-6.7.3-8/magick/
で、そのまま gem install rmagick でうまくいった。
2009-09-25 Perl学習メモ
クロージャ(closure)について
ジーニアス英和辞典:closure
閉めること、閉鎖、締め切り、閉じた状態、終結、容器のふた
プログラミング言語において、クロージャ (クロージャー、Closure) は関数の一種である。引数以外の変数を実行時の環境ではなく、自身が定義された環境(静的スコープ)において解決する。関数とそれを評価する環境のペアであるともいえる。この概念は少なくとも1960年代のSECDマシンまで遡ることができる。まれに、関数ではなくとも、環境に紐付けられたデータ構造のことをクロージャと呼ぶ場合もある。
典型的には、クロージャはある関数全体が他の関数(以下、エンクロージャ)の内部で宣言されたときに発生し、内部の関数はエンクロージャのローカル変数(レキシカル変数)を参照する。実行時に外部の関数が実行された際、クロージャが形成される。クロージャは内部の関数のコードとエンクロージャのスコープ内の必要なすべての変数への参照からなる。
クロージャはプログラム内で環境を共有するための仕組みである。レキシカル変数はグローバルな名前空間を占有しないという点でグローバル変数とは異なっている。またオブジェクトのインスタンス変数とは、オブジェクトのインスタンスではなく関数の呼び出しに束縛されているという点で異なる。
昔から何度か理解しようと思いつつ未だによくわからないクロージャについて再度理解を試みてみる。
ひとことで言うとこういうことらしい。
ラクダ本を参考にサンプルコードを書いてみた。
コード
sub make_saying{
my $gobi = shift;
my $saying_func = sub{
my $name = shift;
print "私は${name}${gobi}。\n";
};
return $saying_func;
}
$dagya = make_saying("だぎゃ");
$yans = make_saying("でやんす");
$gozaru = make_saying("でござる");
$desu = make_saying("です");
$dagya->("石川");
$yans->("石川");
$gozaru->("石川");
$desu->("石川");
$dagya->("ヤマダ");
$yans->("ヤマダ");
$gozaru->("ヤマダ");
$desu->("ヤマダ");
結果
私は石川だぎゃ。
私は石川でやんす。
私は石川でござる。
私は石川です。
私はヤマダだぎゃ。
私はヤマダでやんす。
私はヤマダでござる。
私はヤマダです。
書き途中。
Perlのmy、our、localについて
以下、ラクダ本を引用しつつ適当に改編。
my、our、localをスコープ付き宣言という。my、ourはレキシカルスコープ宣言、localはダイナミックスコープ宣言である。
myとlocalでは変数の値はundefまたは()に初期化されるのに対して、ourの場合には、その時点でのグローバル変数の値そのものになっている。
my ($foo) = <STDIN>;
my @array = <STDIN>;
上の場合はいずれも右辺はリストコンテキストで評価される。対して、
my $foo = <STDIN>;
修飾子はコンマよりも強く結合する。そのため、
my $foo, $bar = 1;
これは次のコードと同じ意味になる。
my $foo;
$bar = 1;
書き途中。
Perlのグローバル宣言について
以下ラクダ本より引用(一部改編)。
サブルーチン宣言とフォーマット宣言はグローバル宣言である。これらをどこに置いたとしても、宣言されるものはグローバルになる(より正確にいうと、パッケージ内に置かれるのだが、パッケージはプログラムに対してグローバルなので、パッケージ内のすべてのものはどこからでも見えるのである)。
宣言はコンパイル時に効力を発揮する。つまり、ifのように実行時に評価される条件文の中に宣言を置いてコンパイラから隠すことによって、条件に応じてサブルーチンやフォーマットを宣言する、ということはできない。
なぜなら、このような条件文を認識するのは、(コンパイラではなく)インタプリタだけだからだ。サブルーチン宣言やフォーマット宣言(それにグローバルではないがuse宣言やno宣言)は、どこに置かれていても、コンパイラから見えてしまうのである。
p148 4.7 グローバル宣言
MovableTypeのプラグイン読み込み時に、useではなく組み込み関数のrequireを使っている理由は、useが宣言であるため条件式によってプラグインの使用・未使用をコントロールできないから、ということになる。
Perlにおける多重定義
パッケージを多重定義した場合、先に定義されたものに後に定義されたものが追加される。最初のパッケージ定義で関数abcを定義し、次にもう一度同じパッケージ名で関数defを定義した場合、そのパッケージはabc、defの二つの関数を持つ。
サブルーチンを多重定義した場合、後のものが優先され、先に定義されたものは上書きされる。また、Perlインタプリタは「サブルーチンが再定義されています」的な警告を表示する。
ソース
package Duplicated;
sub abc{
return "abc 1st \n";
}
package Duplicated;
sub abc{
return "abc 2nd \n";
}
sub def{
return "def \n";
}
package main;
print Duplicated::abc;
print Duplicated::def;
結果
abc 2nd
def
Subroutine abc redefined at C:/workspace/Test/duplicated.pl line 9.
2009-09-12
Ruby/Perl/Javascriptの真偽判定
自分のついったーのつぶやきから引用。
Rubyは"false"、"nil"、""(空文字)のいずれもがtrue扱いになるということを実験して確認した。文字列であれば内容に関係なくtrueらしい
Perlでは「if ( ) 文の中などの真偽判断では、空文字列("")、ゼロ(0)、ゼロを示す文字列("0")、未定義値は偽として、それ以外は真として扱われます。」ということらしい
JavascriptはNumber型の0、String型の""(空文字)、undefined、null、NaNがfalseになるらしい。Stringの"0"はfalseにならないのがややこしい
2009-07-23
固定IPは10とかより後ろを使ったほうが良いらしい
VMWareServer上で動かしているMovableTypeがクソ重くて困っていた。
サーバ管理者の方に聞いてみるとIPが悪いんじゃないかという話だったので
192.168.xxx.2としていたのを192.168.xxx.6にしたら軽快に動くようになった。
調べてみたら、VMWareの仮想ネットワークのゲートウェイも192.168.xxx.2だったので
これが原因だったらしい。ゲートウェイは192.168.xxx.1だと勘違いしていた。
通信はなんとかできてしまうものらしい。
いっそ動かなければ異常に気づくんだろうけど、重いだけで動かないことはないので
非常に気づきにくいミスだと思った。
その後、サーバ管理者の方に解決しましたーってお礼を言いに行ったら、
「固定IPの最初と最後のほうの番号はデフォルトで使用されることがあるので
10とかより後ろを使うようにしたほうがいいよ」
というようなアドバイスを頂いた。
2009-07-22
CentOS5.3にFastCGIを入れる時に詰まった箇所
MovableType4.2.6をFastCGIで動かすために、CentOS5.3にFastCGIをインストールした。
mod_fastcgiのインストールで詰まったのでメモしておく。
http://www.fastcgi.com/dist/mod_fastcgi-2.4.6.tar.gz
wget http://www.fastcgi.com/dist/mod_fastcgi-2.4.6.tar.gz
tar xvfz mod_fastcgi-2.4.6.tar.gz
cd mod_fastcgi-2.4.6
make
ここで以下のようなエラー発生。
Makefile:12: /usr/local/apache2/build/special.mk: そのようなファイルやディレクトリはありません
make: *** ターゲット `/usr/local/apache2/build/special.mk' を make するルールがありません. 中止.
special.mkはデフォルトでは入っていなかった。
Apacheの開発ツールの中に入っているようなので、
yum search httpd-devel
↓
httpd-devel.i386 : Apache HTTP サーバー用の開発ツール。
↓
yum install httpd-devel
成功したら、インストールされた場所を探してみる。
find / -name *special.mk*
↓
/usr/lib/httpd/build/special.mk
Makefileの以下の箇所を修正。
top_dir = /usr/local/apache2
↓
top_dir = /usr/lib/httpd/build
これで上のエラーは解決するはずなので、再度makeをやり直してみる。
make
make install
以上でインストールに成功。