mac OSX 10.8にPIL、matplotlibをpipでインストール

忘れないようにメモ。

まず、xcodeのcommand line toolをいれる。

まずは、PILをインストール。

で、libpng、libjpeg、freetypeをインストール。

これは、個別にもインストールできると思うけど、homebrewを使うのが簡単。

pipでインストール。

ちなみに、libjpegはなくてもpipでインスールできるが、インストール後PILでjpegをconvertする際にエラーがでる。
もし、libjpegなしでインストールしちゃった場合は、pipでPILを消す→libjepegインストールする。

次に、matplotlibをインストール。

pkg-configをインストール。
これも、homebrew使うのが簡単。

jQueryのeachのreturnがうまくいかなかった

jQueryのプラグイン作ってて、以下のコードが思った通り動かなかった。
(CoffeeScript使ってます。)

$.fn.XXXX(settings) = (settings) ->
    this.each () ->
        self = $(this)
        switch settings.action
            when 'init'
                 # Do something
            when 'get'
                return self.data 'data_key'

上のコードで、

$('selector').XXXX
    action: 'get'

ってしたら、selectorで選択した最初のエレメントのデータが帰ってきてほしいけど、$('select')自体が返ってくる。

マニュアル見たら、eachでreturnしたら処理を中断するみたいな事が書いてたけどな。

結局以下に書き直した。

$.fn.XXXX(settings) = (settings) ->
    if settings.action == 'get'
        return this.data 'data_key'
    this.each () ->
        self = $(this)
        switch settings.action
            when 'init'
                 # Do something

勘違いが合ったら誰か教えて下さい。

PHPのrequire_onceがおかしいと思う

PHPの通販サイトのオープンソース EC-Cube を使ってて、

[17-May-2010 19:19:31] PHP Fatal error: Cannot redeclare class Net_URL in ...

のエラーが。。。
昨日まではバッチリ動いてたのに。。。
何もプログラムいじってないのに。。。

debug_backtrace関数と、get_decleared_classesの関数を使ってプログラムをデバッグしてみると、

// data/class/helper/SC_Helper_Mobile.phpの25行目
require_once(CLASS_PATH . '../module/Net/URL.php');

// data/class/pages/LC_Page.phpの25行目
require_once(DATA_PATH . 'module/Net/URL.php');

の2箇所でURL.phpが読み込まれてる。。。
onceだろ!!

googleで検索したら、
EC-Cubeに限らず他のオープンソースを使っててても
この現象が生じるみたい。
EC-Cubeのサポートフォーラムにも、(URL.phpじゃないけど) 同様のエラーが報告されてた。
http://xoops.ec-cube.net/modules/newbb/viewtopic.php?topic_id=4077&forum=2&start=10
の下の方。
get_include_path使って、他のライブラリとの競合とかも調べたけど、問題なさそう。

結局、PCを再起動したらエラーが起きなくなった。。。
PHPのバージョンは、現時点で最新の5.3.2です。
たちが悪いイタズラです。。。2時間返して。。。

PHPの関数・クラス定義のスコープについて

PHPのクラス定義のスコープに付いてのメモ。

PHPでは、トップレベルに記述されたクラス・関数定義は、
スクリプトファイルの実行前に定義が読み込まれます。
例えば、以下のコードで、a.phpを実行した場合、正常に動作します。

/* a.php */
require 'b.php';
class A {
}

/* b.php */
class B extends A {
}

クラスAの定義の前に、クラスAを継承したクラスBの定義を含むb.phpを読み込んでいます。
Aの定義が、requireの前に読み込まれてるから、エラーが起きないようです。

一方、同じトップレベルでも、ifやtry等で括ったなかに定義を書くと先読みされません。
例えば、以下のコードはclass undefinedのエラーが発生します。

/* a.php */
require 'b.php';
if (true) {
class A {
}
}

/* b.php */
class B extends A {
}

if文の中に記述しても、関数・クラス定義はグローバルのスコープで定義されるのですが、
定義の先読みの有無に関しては、動作が異なるって事でしょうか。
以下のコードは、動作します。

/* a.php */
if (true) {
class A {
}
}
require 'b.php';

/* b.php */
class B extends A {
}

クラス定義の代わりに、関数を定義しても同様のようです。

ちなみに、以下のようにgoto文を使ってクラス定義をスキップしても、
トップレベルに記述した場合は、クラスが定義されます。

goto jump;
class A {
}
jump: