JSON String のマルチバイトの仕様
ES5 の仕様書
http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf
JSON.stringify(”ほげほげ") は "ほげほげ" となるのが正しい模様。
一方で、RFC
http://www.ietf.org/rfc/rfc4627.txt
によると、"ほげほげ" は "\\u307b\\u3052\\u307b\\u3052" になってもよいよ、とある。
で、CouchDB は後者のエスケープバージョンのJSONしか受け付けないので、node.js 0.2.30.3 以降, あるいはES5をちゃんと実装しているモダンな(笑 ブラウザだと連携できなくなる.... なんだってー
[追記]
id:t_43z さんから 0.3 以降じゃね ? という指摘をいただいて、改めてソース確認。
macbook:tmp yssk22$ diff node-v0.2.4/deps/v8/src/json.js node-v0.2.2/deps/v8/src/json.js macbook:tmp yssk22$ diff node-v0.3.0/deps/v8/src/json.js node-v0.2.2/deps/v8/src/json.js 71,75d70 < '\b': '\\b', // ASCII 8, Backspace < '\t': '\\t', // ASCII 9, Tab < '\n': '\\n', // ASCII 10, Newline < '\f': '\\f', // ASCII 12, Formfeed < '\r': '\\r', // ASCII 13, Carriage Return 77c72,79 < '\\': '\\\\' --- > '\\': '\\\\', > '/': '\\/', > '\b': '\\b', > '\f': '\\f', > '\n': '\\n', > '\r': '\\r', > '\t': '\\t', > '\x0B': '\\u000b' 96c98 < var quotable = /[\\\"\x00-\x1f]/g; --- > var quotable = /[\\\"\x00-\x1f\x80-\uffff]/g;
0.3 以降、ですね。失礼しました。
全然関係ないけど npm のサイトはCouchDBで動いています.
npm publish が失敗するのでいろいろデバッグしていたら、npm の登録サイト registry.npmjs.org が CouchDB で動いていることを見つけました。
ということでどれぐらい開発者いるんだろう?と思って /_users/ をたたくわけです。
http://registry.npmjs.org/_users/
350人ぐらいいました。
ちなみに /_users/_all_docs?include_docs=true するとメールアドレス大公開です。。。
いやまぁ、こういうのに登録するのは連絡先だからいいんでしょうが。
vows でテスト.
テストの方も、3割ぐらいしかかけてませんが、 vows という BDDのテストフレームワークで書いてみました。
https://github.com/yssk22/node-twbot/blob/master/spec/spec_twitter.js
書きやすいっちゃ書きやすいけど、a -> b -> c というイベントの流れでどこまでがINでどこからがOUTか、というのがが仕様として定義しにくい感じになるので、考え物です。
設計が悪いのか、それともこういうもんなのか。
サンプル - 英語のリスニング
ちょうどやっている最中に Twitter / cakephper: 英語のTweetを定期的に取得して、Sayに突っ込め ... というのを聴いて、実装してみた。何人か海外の人のtweetみているんだけれど、聴けばいいんじゃね?ってことで。
https://github.com/yssk22/node-twbot/blob/master/lib/plugins/say.js
受け取ったツイートを何も考えずにsayコマンドの入力に与えているだけです。
他にすべてのイベントを CouchDB に放り込むプラグインとか URL があったらそれをダウンロードしてCouchDBに放り込むプラグインとか、とにかくCouchDBに放り込むプラグインをいろいろ作っていこうと思います。
node-twbot 0.0.1 / Hackathon 用の資料
WebSocket やらない、という選択肢はなさそうなので、家で使っているtwitterボットをパッケージ化しました。
EventEmitter のサブクラスとして再定義しなおして、いろいろできるように。
$ npm install twbot
で入ります。
WebSocket のサンプル作るときに使おうと思います。
Hackathon 用の資料
Python Hackathon で空気を読まずにnode.jsをやるのですが、例によってHackathonの資料はSphinxで書きつつDropboxでいつでも読めるようにして、bitbucket でバージョン管理、というコンボをしています。
http://dl.dropbox.com/u/219436/node.js/handson/build/html/index.html
で、書きながらいろいろ動作を試してソースを長めながら、、、とりあえずわかったのは、「node.js は単一スレッドで動く」というとても基本的なことがら。一つ前のエントリ、非同期→マルチスレッドとかいう先入観にとらわれていてなんか本質見抜けてなかった気がします。
割り込みなんて発生しない! イベントループをぐるぐるまわるのみだ!
誤字脱字間違い指摘については bitbucket にください。
実行コンテキストのスイッチ単位
のコードが常に正常に動くのが node.js クオリティ。
- c = c + 1; が常に保証されている (ref: http://www.gnegg.ch/2010/09/why-node-js-excites-me/)
- さらに ev.emit('end') の発火とイベントリスナーの実行完了までが常に保証されている (ここがびっくり)
どの単位でコンテキストスイッチをしているのか、調べる必要がありそうです。