JSの設定

2012年1月3日火曜日

Coffee Script など

javascriptを使っていて、文字列変数strがあるときに "<p>" + str + "</p>"と書かないといけないのは耐え難い、rubyのように"<p>#{str}</p>"と書きたい、ヒアドキュメントも使いたいと思ったのが発端で CoffeeScript を調べ始めた。
rails3.1で採用されているので名前は知ってたが、よそ者と思って軽視していた。いや実際、よそ者ではあるのだが。

- CoffeeScriptとは:
今日から始めるCoffeeScript から抜粋。

・JavaScriptにコンパイルできる小さな言語
・コンパイル後はJavaScriptとして動作するため実行速度面ではほぼ変わらない
・構文がRubyやPythonライク
・ブラウザ用の開発にもサーバサイドの開発にも使える

変数の文字列埋め込みとヒアドキュメントという当初の目的はズバリ達せられるほか、コンパイルが挟まるのはメリットがありそうだ。コンパイルによって生成されたjsはエラーがないだろうから。なんならWebサイトのjsは全てコーヒーで書いておき、コンパイル→ファイル結合→minify→キャッシュ制御用パラメータの更新をするデプロイの仕組みを用意するといい感じかも。このへんは動的システムであればフレームワークに吸収される流れっぽいが。

コンパイルされたjsの実行には node.jsを使うようなので、用意したばかりのcolinuxにインストールしてやる。
rubyで言うところのrvmのようなバージョン選択ツールがないか探してみたらあった。
naveというらしい。しかし何だかうまくインストールできない。
バージョン選択をする切実性もないので普通にインストールすることに。
node -v → v0.6.6

rvmの話が出たのでrails3.1もインストールしておこう。あとでrails with coffeeの味を見るために。
rvm install 1.9.3 とし、ここにrails3.1のgemsetを作る。
rvm use 1.9.3 → rvm gemset create rails31 → gem list --remote rails(ふむふむ、このままインストールした場合のバージョンは3.1か)→ gem install rails

※ruby1.9.3をインストールするときにunable to convert "\xC3" to UTF-8 in conversion from ASCII-8BIT to UTF-8みたいなエラーがでる(このへん参照)、rdoc関係みたいなのでどうせ不要ということであれば --no-ri --no-rdoc オプションをつけてインストールするとよい。

さて、とりあえずサーバサイドjsに慣れるため node.js を使ってみよう。node.jsとMySQLで割と普通のデータベースウェブアプリを作ってみるチュートリアルを参考に進める。
「express フレームワークを使う」のところまで何ら問題なし。ejsテンプレートのところ、app.use(express.bodyDecoder());
とあるがここで初めてエラーが発生。本家サイトを見ると正解はapp.use(express.bodyParser()); のようだ。

「MySQLとの連動」のソース、長いのでそのままでは動かないだろうなと思ってたが案の定いくつかエラーでた。
以下、修正点。
var sys = require('util'), // ← sysからutilに変更。追加モジュール必要なし
    express = require('express'),
    ejs = require('ejs'),
    //Client = require('mysql').Client, // ←コメントアウト
    base62 = require('./base62');

var client = require('mysql').createClient({user: 'xxx', password: 'xxx', host:'127.0.0.1'}); // ←追加
client.query('use データベース名'); // ←追加

//mysql(function(client) { // ←2ヶ所あるこの記述をコメントアウト(もちろん、対応する閉じカッコも)
※そのままだとエラーになり、client.connect は自動的に行われますよと言われる

if (err && err.number != client.ERROR_DUP_ENTRY) { // ←Clientの先頭を小文字に変更

あと、Error: connect ECONNREFUSED と怒られたので my.cnf の skip-networking をコメントアウトした。
これでとりあえず動く。次はちゃんとコーヒースクリプトを。

参考サイト:
http://www.dbonline.jp/mysql/
node-inspector
node.jsでmysqlを使う
CoffeeScriptでNode.jsアプリを書いてみる
無料で見られるプログラミング書籍一覧
Ruby 1.9 で Web アプリを想定したベンチマークをとってみた