SSブログ

node.jsやってなかったのでやる。2 [プログラミング]

前回、node.jsのいい説明があったので、そっちに乗り換えてみる。

http://www.nodebeginner.org/index-jp.html

翻訳らしいが、翻訳っぽくない。まぁ技術書なんて大抵どう翻訳しても比較的同じになる気はしますが。
気になるところをつっこんでいく+引用コピペでいきます。なかなか本文が長いので、抽出しがいがあるんじゃないかと。

全体的には下記の物と一緒ですが、説明の量が違いますね。
http://dl.dropbox.com/u/219436/node.js/handson/build/html/webapp/http_server.html
これだと作っている本人達には分かるけど、本来のnode.jsの良さが伝わってない気がします。って、どっちも斜め読みしかしてないので、精読するにはそれなりの時間はかかるけど…。


 
require('http')はそうなってるかどうか正確には分からないけど、他のファイルに自分の作った変数を晒せることはexportsでできるようだ。結局、それはモジュール化と同じ事で、ここでexportするしないで、オブジェクト指向のカプセル化も出来るのかな。クラスの設定でpublic, privateみたいなのはあるのかな?後で調べておく。

http://www.nodebeginner.org/index-jp.html#finding-a-place-for-our-server-module

具体的には、下のようなserver.jsがあるとすると、
function start() {
 なんとか
}
exports.start = start;

同じディレクトリの他のファイルで
var server = require("./server");
server.start();

とすると、使えるってことが書いてある。

古いJavaScriptのリファレンスにexportという命令文(JavaScript1.2と書いてあるの)があるんですが、exportsとは違うよね。それも調べておきたいところ。というか、最近のJavaScriptの本を買ってきた方がいい気がしてきた。持ってるのサーバサイドとか考えられてなくて、普通にブラウザのマクロ言語的な事しかやってないしね。まぁ元々の成り立ちがブラウザで動くスクリプト言語だったから仕方ないとは思うけど。




前にも言ったんだけど、CommonJSあたりが噛んでいるんじゃないかと思う。大幅に拡張されていることは間違いなくて、昔のJavaScriptの教科書のような本で、索引を見てみるとexportsとか、include()とか、require()がほとんど書かれていないようだった。時間がなくて立ち読みできてないのだけど、多分、node.jsを使う本では使われているのではないか、と思う。そもそも、クラスにしても簡易的で初歩的なJavaScriptの教科書で古めのものはつっこんで書いているものは多くはないだろう。

HTML5・JavaScript・CSS3アプリケーション開発入門 (日経BPパソコンベストムック)

HTML5・JavaScript・CSS3アプリケーション開発入門 (日経BPパソコンベストムック)

  • 作者:
  • 出版社/メーカー: 日経BP社
  • 発売日: 2011/07/29
  • メディア: ムック


この本ではクラスの説明がないかなぁと思ってたら、後半の部分にクライアント側でのクラスの言及がありました。でも、正直これでは情報が少ない。普通のオブジェクト指向ならいいにしても、プロトタイプベースのクラスとかになると全然ダメなので他の本を読んでザックリと理解した。正直、自分でクラスを作るってことはあまりなくて、ライブラリやパッケージを利用するほうが多いと思うので、そういう作り方があるんだなくらいしかわかっていない。読んだのは下の雑誌。

日経ソフトウエア 2012年 09月号 [雑誌]

日経ソフトウエア 2012年 09月号 [雑誌]

  • 作者:
  • 出版社/メーカー: 日経BP社
  • 発売日: 2012/07/24
  • メディア: 雑誌


上の本の特集は、山田祥寛って人が書いているので、これあたりがいいのかな。でも2年強前の本ですし、直接JavaScriptを学ぶようになっているかどうかはわかりません。この人は基本Webアプリの人みたいなので、実戦向きではあるのかもしれない。

JavaScript本格入門 ~モダンスタイルによる基礎からAjax・jQueryまで

JavaScript本格入門 ~モダンスタイルによる基礎からAjax・jQueryまで

  • 作者: 山田 祥寛
  • 出版社/メーカー: 技術評論社
  • 発売日: 2010/11/27
  • メディア: 大型本





本はこれくらいにして、元のページに戻ります。

http://www.nodebeginner.org/index-jp.html#whats-needed-to-route-requests

今までだと、単に文字列を返すだけだったので、URLのGETやPOSTも扱いましょうって話があって、結局、GETすらも使ってないですね。querystring()で取れるって書いてあるけど、ここではルーティングしかしてないですね。

その後に、考え方の変革をするように促してる。

>サーバは何かする必要はありません。
>何かをやらせて、それをやらせるために、 最終的に何か必要なものがあるわけではなく、
>とにかくアクションを必要とします。必要なのは名詞ではなく、動詞なのです。

要するにイベントドリブンってことかな? 動詞ってことは、データじゃなくて関数をコールバックする事を言いたいんだろうか。リンク先は読んでいないですが、そんな感じがする。

その後はJavaScriptの表現の仕方で、

>handle[パス名]();として、 あたかも”このパス名をhandleして下さい” と言っているように表現

というところに重点が置かれています。読みやすさに重点を置くというのは、方向性としてはいいと思う。ハードコーディングしないで、意図的に粗結合にしましょうとか、そういうことが書かれている。そこいらは、JavaScriptの文法で書くための方法論みたいな感じですかね。


問題はここからですね。それまでの書き方も絡むわけですが。

 http://www.nodebeginner.org/index-jp.html#how-to-not-do-it

きちんと動くコードを見せておいて、

>OK、これで何か問題でも?

と、くるわけです。

>端的に言うと、もしリクエストハンドラのどれかが、
>後述のノンブロッキング操作を行いたいとなった場合に問題となってしまうのです。

そのノンブロッキングという端的な言葉が具体的に何を示すかが、大体の説明文には書いていない。一応書いてあるのだが、正直、「通信処理の完了を待つことによって他の処理の進行を妨げないこと」とか言われても、実装をどうするかというところまで頭が回らない。

オブジェクト指向の説明と同じで、現世界のモノで例えられても、逆に分かりづらい事もある。
http://itpro.nikkeibp.co.jp/article/COLUMN/20120725/411441/
スタバとか言われてもなぁ。


ブロッキングを見せて、ノンブロッキングをしようとしてあえて失敗して、成功例を見せるという感じ。成功例だけを見せるのは普通だけど、これはあえてつまずく。つまずかないと分からない事だからでしょう。一応できればいいという単純なブロッキングの動作と違うからですが、回り道に見えて最短で理解できると思いました。

具体的には

var exec = require("child_process").exec;

でノンブロッキングが導入できるらしいのですが、大元が同期して動いているので、結果が出るまで待ってくれないという事です。

名前が子プロセスなんだけど、実際にプロセスを作るわけじゃない(?)。node.jsは基本的にシングルスレッドだって話だし。でも、先で出てくるUNIXのコマンドとかは別途コマンドを発行してプロセスを実行しているわけだし。本体の核心部分(nodeコマンドで実行されるJavaScriptのコード)がシングルスレッドってことなんだろう。実行のプロセスは別で、それを待つJavaScriptのコード自体はシングルスレッドで動いているのかな。

JavaScriptから実行されるプロセスとガッツリつながってるのがブロッキングのやり方だと思うし、それを切り離して待ちの状態を解消しようとしているのだろう。もうちょっと先をきちんと読まないとわからないな。うう、サンプルコード実行できても、ここに書く時間がない…。


ちょっと長くなってきたので切ります。node.jsはノンブロッキングがキモらしいので、回を変えてじっくり納得のいくように。

コメント(0) 
共通テーマ:パソコン・インターネット

コメント 0