[javascript] Chrome の JavaScript 処理系 v8 を OSX に入れてみた

ふいに Chrome の JS 処理系をコマンドラインから実行したくなったので入れてみることにした。
(Chrome のコンソールがあるからいらないといえばいらないのだけど…。)

v8 のビルドには SCons というビルドツールが必要らしいのでそれを入れる必要がある。
また、SCons のインストールには Python が必要。

まず Python から

たぶん OSX 10.7.4 にはデフォルトで python が入っているので、新たに入れ直す必要はない。

$ python --version
Python 2.7.1

次に SCons

SCons のソースは以下から取ってくる。
scons-2.1.0.tar.gz

作業ディレクトリ(ここでは ~/src)に持ってきてセットアップする。

$ mv ~/Downloads/scons-2.1.0.tar.gz ~/src
$ cd ~/src
$ tar zxvf scons-2.1.0.tar.gz
$ cd scons-2.1.0
$ sudo python setup.py install

最後に v8

git から v8 をクローンする。

$ cd ~/src
$ git clone https://github.com/v8/v8.git

SCons でビルド。

$ cd v8
$ scons sample=shell

ビルドが終わると ~/src/v8 以下に shell という実行ファイルが出来ている。これが v8 の処理系。
このままだと使いづらいので、シンボリックリンク /usr/bin/v8 を作っておく。

sudo ln -s ~/src/v8/shell /usr/bin/v8

これでどこからでも v8 と叩けば呼べるようになる。

こんな感じで動くよ

$ v8
V8 version 3.12.15 (candidate) [sample shell]
> print('hello, world!');
hello, world!
> ^C

抜けたいときは ^C で抜けられる。

ファイルを指定して実行することも可能。

$ echo 'print("from test.js");' > test.js
$ v8 test.js
from test.js

[vim][web+db] Vi(m) コマンドの覚書

「WEB+DB PRESS 62」の特集「Linux の基礎知識」を読んで、
ボールペンでチェックしておいた覚えておきたいことをブログにも書いておく。

覚えておきたいコマンドの一覧

コマンド 解説
ZZ 保存して終了
w 次の単語に移動
b 前の単語に移動
^ 行頭に移動
$ 行末に移動
Ctrl+f 1ページ進む
Ctrl+b 1ページ戻る
gg ファイルの先頭に移動(1G でもいい?)
% 対応する括弧に移動
p 前の検索結果に移動(N でもいい?)
o 1つ下に新しい行を追加してテキスト入力(o は何の略?Over?)
O 1つ上に新しい行を追加してテキスト入力
dw カーソル位置から1単語削除
(似たようなコマンドとして d^ や d$ がある。d はきっと Delete の略だな。)
cw カーソル位置から1単語変更
(c は Change だな。)
yw カーソル位置から1単語コピー
(y は Yank で Emacs といっしょ。現在行を丸々コピーするには yy。)
p コピーしたのが行単位でない場合は、カーソル位置の1つ後ろにペースト。
コピーしたのが行単位の場合は、カーソル行の下にペースト。
P コピーしたのが行単位でない場合は、カーソル位置にペースト。
コピーしたのが行単位の場合は、カーソル行の上にペースト。

dw, cw, yw は似たもの同士

cw, yw も dw 同様に後ろの w を ^ や $ に変えると挙動が変わる。みんな似たような動作をする。

ペースト(p, P)の違い

  • コピーしたのが行単位の場合は、p, P は a, i に対応している。
  • コピーしたのが行単位の場合は、p, P は o, O に対応している。

そういえば、a は After の頭文字なんだろうか?
i が Insert だからカーソル位置に挿入で、a が After だから後ろに挿入と考えると覚えやすいな。

文字の置換

文字列の置換は s コマンドで行う。
フォーマットは「:範囲s/from/to/[gc]」
「範囲」は全行を表す % か、n 行目から m 行目を表す n,m が使える。
オプション c は confirm の略で、置換を1つ1つ確認したいときに使う。

アンドゥ

純粋な vi ではアンドゥは1回しか実行できませんが、Vim では複数回アンドゥを実行できるようになっています。

vi で複数回アンドゥしたいときはどうしたらいいんだろう?
回数を指定して u を呼んだりはできないのだろうか。

[css] デザインを微修正

フォントのサイズと大きく、レイアウトの幅を広く取るようにした。
これで少し見やすくなるかな?

before

.day {
  font-size: 80%;
}

#simple-header {
  max-width: 910px;
}
h1 {
  max-width: 910px;
}
.hatena-body {
  max-width: 910px;
}

after

.day {
  font-size: 100%;
}

#simple-header {
  max-width: 1100px;
}
h1 {
  max-width: 1100px;
}
.hatena-body {
  max-width: 1100px;
}

max-width は none にするとちょっと広すぎる印象だったので、1100px にしておいた。

[unix] 文字コードを変換するコマンド

Unix の改行コード '\n' を、Windows の改行コードに '\r\n' 変換するには以下を実行すればよい。

$ tr '\n' '\r\n' < unix.txt > win.txt


以下でも同じ結果が得られるけど、上述の方法の方が応用が利く。

$ tr -d '\r' < unix.txt > win.txt

Mac Book Air に postgresql をインストール

homebrew で入れた。

$ brew install postgresql


9.1.3 が入った。

$ brew list postgresql
/usr/local/Cellar/postgresql/9.1.3/bin/vacuumlo
/usr/local/Cellar/postgresql/9.1.3/bin/vacuumdb
/usr/local/Cellar/postgresql/9.1.3/bin/reindexdb
/usr/local/Cellar/postgresql/9.1.3/bin/psql
... 長いので 以下省略 ...


でも psql を叩いてみると、homebrew で入れたのではなくデフォルトで入っている psql を見に行っているようだ。

$ psql --version
psql (PostgreSQL) 9.0.5
contains support for command-line editing


この問題に対処するためのスクリプトがあるのでそれをもらってきて実行。

curl http://nextmarvel.net/blog/downloads/fixBrewLionPostgres.sh | sh

やってることとしては、デフォルトで入っていた psql と postgres があるディレクトリにarchive ディレクトリを作り、
オリジナルのファイル群をそこに移動させ、代わりに homebrew で入れたものをコピーしているようだ。
(psql がクライアントで postgres がサーバらしい。)


これで homebrew で入れたのを見に行ってくれるようになった。

$ psql --version
psql (PostgreSQL) 9.1.3
contains support for command-line editing


DB サーバの初期化。

$ initdb /usr/local/var/postgres


サーバの起動。

$ postgres start -D /usr/local/var/postgres


クライアントからアクセスできるか確認。

$ psql -l


毎回サーバを起動させるのは面倒なので、ログイン時に自動起動するように設定する。
まずは plist を ~/Library/LaunchAgents へコピー。

$ cp /usr/local/Cellar/postgresql/9.1.3/homebrew.mxcl.postgresql.plist ~/Library/LaunchAgents/

plist はアプリケーションの設定ファイルで、
LaunchAgents はログインしたユーザの権限で起動時にプログラムを実行するための機能のことらしい。
(Daemon とは違って個別のユーザごとに動かすサーバプログラムのことを Agent っていうみたい。)


launchctl でコピーした plist を読みこませる。

$ launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist


これで自動起動されるようになった…ら万事 OK だったのだけど、なんかダメみたい。
「launchctl list」してみると PID が「-」になってるので動いてないようだ。
plist の内容が間違ってるのかな?おかしいな…コピーしただけなんだけどな。。

$ cat ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>KeepAlive</key>
  <true/>
  <key>Label</key>
  <string>homebrew.mxcl.postgresql</string>
  <key>ProgramArguments</key>
  <array>
    <string>/usr/local/bin/postgres</string>
    <string>-D</string>
    <string>/usr/local/var/postgres</string>
    <string>-r</string>
    <string>/usr/local/var/postgres/server.log</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
  <key>UserName</key>
  <string>gan2</string>
  <key>WorkingDirectory</key>
  <string>/usr/local</string>
  <key>StandardErrorPath</key>
  <string>/usr/local/var/postgres/server.log</string>
</dict>
</plist>

おお…なんか array のあたりがあやしい…。
array の中は postgres のパスと引数が並べられているようだけど、
/usr/local/var/postgres なんてディレクトリはないぞ。
postgresql ならあるからこっちじゃないかな?ということで -D と -r のすぐ下にある postgres を postgresql に修正。
でもって再読み込みさせてみた。

$ launchctl unload -w ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
$ launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

やった!これで動くようになった。めでたしめでたし。

[emacs][ruby] Emacs から rbenv で入れた ruby を呼び出せない

  • Terminal で「which ruby」すると「/Users/gan2/.rbenv/shims/ruby」と表示される。
  • Emacs で「M-! which ruby」すると「/usr/bin/ruby」と表示される。

前からこの違いを何とかしたいと思っていた。お願いだから Emacs でも rbenv の方を見に行って下さい。


PATH があやしいので確かめてみる。

  • Terminal で「echo $PATH」すると「/Users/gan2/.rbenv/shims」が「/usr/bin」よりも先にある。よしよし。
  • Emacs で「M-! echo $PATH」すると「/usr/bin」の方が先にある。これだ。これがいけないんだ。

「/Users/gan2/.rbenv/shims」が「/usr/bin」より前にくるようになれば解決するはずだ。


ぐぐってみると、この辺りの問題は exec-path と PATH の設定で対処できるらしいことが分かった。
でも真似して幾つか試してみたのに問題が解決しない。

(setq exec-path (cons (expand-file-name "~/.rbenv/shims") exec-path)) ; => ("/Users/gan2/.rbenv/shims" "/usr/bin" "/bin" "/usr/sbin" "/sbin" "/Applications/Emacs_Carbon.app/Contents/MacOS/libexec" "/Applications/Emacs_Carbon.app/Contents/MacOS/bin" "~/bin" "/usr/local/bin" "/usr/X11R6/bin")
(setenv "PATH" (concat (expand-file-name "~/.rbenv/shims:") (getenv "PATH"))) ; => "/Users/gan2/.rbenv/shims:/usr/bin:/bin:/usr/sbin:/sbin:~/bin:/usr/local/bin:/usr/X11R6/bin"


上記の設定で、exec-path、PATH ともに "/Users/gan2/.rbenv/shims" が先頭にきている。
でも「M-! echo $PATH」では先頭に来ない。
どうも M-! が参照している PATH は、Terminal の PATH とも getenv で見れる PATH とも違うもののようだ。


ちなみに、以下を C-x C-e すると「/Users/gan2/.rbenv/shims/ruby」が出力される。

(apply 'call-process "which" nil t nil '("ruby"))


うーん。わっかんないなー。

[js] JsTestDriver が動かない…

「テスト駆動 JavaScript」を買ったので読んでいるのだけど、この本を通して使う JsTestDriver が動かなくて困っている。


セットアップは問題なく終わっていて、テストファイルを必要としない状態では問題なく動作する。

$ java -jar ~/bin/JsTestDriver-1.2.1.jar --port 4224


でも肝心のテストファイルを必要とする場合は動かない!
「java.net.ConnectionException: Connection refused」って例外が出る。
これじゃテストにはまるっきり使えないじゃないか…。

$ java -jar ~/bin/JsTestDriver-1.2.1.jar --tests all
java.net.ConnectException: Connection refused
java.lang.RuntimeException: java.net.ConnectException: Connection refused
        at com.google.jstestdriver.HttpServer.fetch(Unknown Source)
        at com.google.jstestdriver.JsTestDriverClientImpl.listBrowsers(Unknown Source)
        at com.google.jstestdriver.ThreadedActionsRunner.run(Unknown Source)
        at com.google.jstestdriver.ActionRunner.runActions(Unknown Source)
        at com.google.jstestdriver.JsTestDriverServer.main(Unknown Source)
Caused by: java.net.ConnectException: Connection refused
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)
        at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)
        at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:432)
        at java.net.Socket.connect(Socket.java:529)
        at java.net.Socket.connect(Socket.java:478)
        at sun.net.NetworkClient.doConnect(NetworkClient.java:163)
        at sun.net.www.http.HttpClient.openServer(HttpClient.java:395)
        at sun.net.www.http.HttpClient.openServer(HttpClient.java:530)
        at sun.net.www.http.HttpClient.<init>(HttpClient.java:234)
        at sun.net.www.http.HttpClient.New(HttpClient.java:307)
        at sun.net.www.http.HttpClient.New(HttpClient.java:324)
        at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:970)
        at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:911)
        at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:836)
        at com.google.jstestdriver.HttpServer.fetch(Unknown Source)
        ... 4 more


公式の GettingStartedを見てみると、同じようにハマっている人がいた。
でもこれといった解決策が出てきていないみたい。
この本の原著が出たのは2009年で、当時の JsTestDriver のバージョンが 1.2.1。
2012年5月現在の最新バージョンは 1.3.4 で2年以上経っているので、こんなバグがずっと残っているとは考えづらい。
なにか見落としていると思うのだけど…。

追記

解決した!使い方を勘違いしていたみたい。
「--tests」がつくのとつかないのはどちらも実行させる必要がある。
「--tests」つかないのはブラウザをキャプチャできるかどうかの確認用だと思っていたけど違っていた。
どっちも動かさないといけない。ついてないのがサーバ起動用で、ついてる方がテストの実行用という役割みたい。