ラベル JavaScript の投稿を表示しています。 すべての投稿を表示
ラベル JavaScript の投稿を表示しています。 すべての投稿を表示

2011年11月16日水曜日

CentOSにNode.jsインストール時にエラー


CentOSにNode.jsインストール時にエラーが出たので忘備録として残します。

wget http://nodejs.org/dist/node-v0.6.1.tar.gz
tar zxvf node-v0.4.12.tar.gz
./configure
make    # ここでエラー発生


エラー内容
ImportError: No module named bz2:
 File "/usr/local/src/node-v0.6.1/deps/v8/SConstruct", line 37:
  import js2c, utils
 File "/usr/local/src/node-v0.6.1/deps/v8/tools/js2c.py", line 36:
  import bz2


別のマシンに入れたときはこのような問題は発生せず。
python絡みで問題が出ているようなので、そのあたりの違いを確認すると
問題が発生したマシンには、python2.7がソースからインストール済み。
問題が発生しなかったマシンには、CentOSのデフォルトであるpython2.4系がインストールされている。

とりあえず、pythonを更新して再度インストールを試みる。
同時に、import bz2で問題が発生しているということで、bzip2-develをサクっと更新。

yum install bzip2-devel
wget http://www.python.org/ftp/python/2.7.2/Python-2.7.2.tgz
tar xzvf Python-2.7.2.tgz 
cd Python-2.7.2
./configure 
make
make install

そして、再度Node.jsをインストールしなおすと、問題なく完了。
いままで幾つかの環境にNode.jsをインストールしていて、初めてのエラーでちょっと焦った。


(追記)
githubのREADMEにpythonのバージョン指定があったことに気がついた。
Unix/Macintosh (requires python >= 2.5.2):
python2.4系でも入ってたのはいつのバージョンだ?ともかく、READMEはちゃんと読もう(自戒)

2011年11月11日金曜日

JavaScriptでオープンクラス


最近もっぱら、JavaScriptの勉強を行なっています。
今日は、JavaScriptにもオープンクラスが存在したことに対する備忘録です。

Rubyistにとっては当たり前の機能として存在する「オープンクラス」

PHPerやJavaプログラマーには聞きなれない概念ですが、
ひとことで言うと、「既存のクラス定義を任意のタイミングで変更可能」な機能です。
今更確認することでもないのですが、Rubyの場合は単純に
以下のように既存クラスの定義を変更できるかとおもいます。

class Array

  def tail
    last(length-1)
  end

end

scalaのListに存在する[tail]メソッド(先頭以外の要素からなるListを返す)
をrubyの組み込みクラスである[Array]クラスに追加して見ました。

このような仕組みがJavaScriptでも実現できます。

var arr = [1, 2, 3];

// last()を実行(そんな関数は存在しない)
arr.last();  // TypeError: Object 1,2,3 has no method 'last'

// Arrayクラスに変更を加える
Array.prototype.last = function() { return this[this.length-1]; }

// メソッドが追加された
arr.last();  // 実行結果 [3]


JavaScriptはブラウザ間の挙動の差に泣かされ、いままで避けれるだけ避けてきましたが、
Node.jsやTituniumなどのブラウザの世界を超えてJavaScriptが活躍し始めた所で逃げるのをやめることにしました。
勉強をすすめるうちに、なかなかどうして楽しい言語だと気付かされます。
とりあえず、JavaScriptはprototypeをきちんと学ぶと、色々できることが最近分かって来ました。
ん~、かなり面白いです。


=================================

おまけとして、少し話題に出てきたScalaでオープンクラスを実現する方法

Scalaは静的型付け言語のため、オープンクラスというものは機能として存在しません。
しかし、暗黙的型変換を利用することによって、同等のことが実現可能です。

ScalaのListクラスの[head]メソッドと同等のメソッド[h]を作成してみます。

class List2[T](xs : List[T]){ 
  def h: T = xs.head
}

implicit def list2List2(xs: List[Any]) = new List2(xs)

val l = List(1, 2, 3, 4, 5)
l.h // res1: Any = 1

ListクラスがList2に暗黙的な型変換が行われ、メソッド[h]がエラーなく実行されているのが
わかるかと思います。

2011年11月10日木曜日

JavaScriptのthis参照について


JavaScriptに限らず、JavaやPHPなどにも出てくる[this参照]。
JavaScriptでも多言語と同じ感覚で使っていてまた問題も特になかったのですが、
きちんと勉強すると、関数内のthis参照は関数の呼び出し方で変化するということを知りました。

// Objectを定義
var obj = {
    x : 3,
    func : function() { console.log('x : ' + this.x); }
}

// obj.funcをトップレベルの変数にコピー
var f = obj.func;


// f(); を実行する
f();   // 実行結果 => x : undefined

// トップレベルに変数xを定義
var x = 5;

// 再度f();を実行
f();   // 実行結果 => x : 5


感覚的には、12行目の関数の結果にて、
[x : 3]と表示してもらいところですが、結果は[x : undefined] となってしまいました。

これは、関数の実行がトップレベルにて行われているため、
thisはトップレベルを表すことになってしまった為です。

そのため、15行目に変数xを定義してf();を実行すると、実行結果に影響が出るという結果に。

恐らく素直なコーディングを行なっていればこのような動きには気付かないかと思いますが、一つ勉強になりました。