Hatena::ブログ(Diary)

へだちのエンジニアリングメモ

2011-11-26

OS X Lion 64bitでRailsからRMagickを使えるようにImageMagickをインストールする

以前いろいろ試行錯誤したんだけど上手くいかなくて、

MacRailsでなぜかImagemagickが動かないので開発に支障が出ている。Railsのバージョンがもうちょい古い時は動いてたのになあ。RailsなしでRMagick使うと動くというのがよくわからん

http://twitter.com/#!/hedachi/status/140402365831446528

とかつぶやいていたところ、

@hedachi 1.9系のrmagickでsegmentaion faultなら--disable-openmp付けて再コンパイルですが、それとは違う感じですか?

http://twitter.com/#!/hichiriki/status/140410202645204992

という助言を頂いて試してみたら、ありがたいことにうまくいったので、後々主に自分が読むためにメモ。

./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 - きれいさっぱり、逝くぜ

http://d.hatena.ne.jp/tksmashiw/20081021

ということで設定してみた。

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

閉めること、閉鎖、締め切り、閉じた状態、終結、容器のふた

Wikipedia「クロージャ」

プログラミング言語において、クロージャ (クロージャー、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")、未定義値は偽として、それ以外は真として扱われます。」ということらしい

http://www.tohoho-web.com/wwwperl1.htm

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ゲートウェイとかぶっていても

通信はなんとかできてしまうものらしい。

いっそ動かなければ異常に気づくんだろうけど、重いだけで動かないことはないので

非常に気づきにくいミスだと思った。


その後、サーバ管理者の方に解決しましたーってお礼を言いに行ったら、

固定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などで取得して解凍

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で探してみると見つかったのでインストール

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

以上でインストールに成功。