プログラミング: 2017年3月アーカイブ


Node.js は「サーバーサイド JavaScript 環境」である。
node コマンドにより、CommonJS 仕様に則って書かれた JavaScript を UNIX サーバのシェル上で実行したりできる。
CommonJS 仕様に拡張された JavaScript なので、標準入出力も扱うことができる。
つまり、CGI としても実行できる。

CGI というのは、どんな言語でも I/O インタフェースが合っていれば(例えば標準入出力を使って I/O していれば)実行できるものだから当然だけど。

例えば、Node.jp には console という「標準出力と標準エラー出力に対するブラウザライクなオブジェクト」というのが用意されているので、

$ cat > cgi-bin/node_test.cgi
#!/usr/bin/node

console.log('Content-type: text/plain');
console.log('');
console.log('Hello World');
^D
$ chmod 755 cgi-bin/node_test.cgi

という具合に CGI としてファイルを作成し、ブラウザから http://127.0.0.1/cgi-bin/node_test.cgi へアクセスすれば、ブラウザ画面に Hello World と表示される。console.log というのは、改行付きで標準出力(STDOUT)に文字列を出力するメソッドである。

ただ、Node.js を CGI として使うのはナンセンスというのが識者の方々の共通認識のようだ。

Node.js 日本ユーザグループのサイト上の「NodeをApache上でCGIとして動かすというのはナンセンスなんでしょうか?」という質問に対してのやり取りがそのあたりの参考になるかな。

たしかに Node.js の機能であるとか、作成動機となった思想であるとか、そういう面から見れば「わざわざ CGI で実行する意味は?」とか「だったら Node.js でなくてもいい」とか、そういう話になるのはわかる。

でも、もっと泥臭い部分で「Node.js で CGI を組ませる」という判断は有り得ると思う。

新人プログラマに、「とりあえず JavaScript と Node.js を覚えてくれ。あとはそれでサーバサイドで実行するプログラムも、クライアントサイドで実行するプログラムも作れるから、Web アプリの開発はそれだけでいけるから。他に Perl や PHP や、Ruby や Java を覚えてもらう必要はないから」と指示する・・・みたいなケースのニーズはあると思うけどねえ。

まあ、CGI で組まなくても、Apache の Proxy 機能を使って、Node.js をアプリケーションサーバ的に使ったりというのもあるだろうけど、既存の CGI 実行形式のアプリケーションに機能追加をしていくというケースもうちの仕事じゃ多々あるので、その際に JavaScript しか知らないプログラマに Node.js を取得してもらって CGI として開発させる・・・というのはありそうなんだよなあ。

まあ、Node.js がそういう用途でまったくパフォーマンスを出せないのであれば仕方ないんだけど。

ということで、少しこのあたりを掘り下げて調べてみようてぇ。
ちょっと最近 JavaScript をきちんと勉強してみようと思っているので、その一環として「サーバーサイド JavaScript 環境」である Node.js をインストールしてみた。
まあ、Node.js で実行するプログラムはピュアな JavaScript ではないようだが(require で外部モジュールの読み込みが出来たり)。

インストール対象のサーバは CentOS 6.5 なので、インストールは、Qiita の「centos + node.js + npm + nvm インストール」というページを参照して行った。
追記されている「とりあえずサクッとnodejsをインストールの場合」のとおり、手っ取り早く yum にて

$ sudo yum -y install epel-release
$ sudo yum -y install nodejs
$ sudo yum -y install npm --enablerepo=epel

と行った。

早速、動作確認をしてみる。

上記ページに載っている参考プログラムをそのまま使わせてもらい、

$ cat > helloworld.js
var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');
^D
$ node helloworld.js
Server running at http://127.0.0.1:1337/

と作成したサーバプログラムを実行し、1337番ポートで http リクエストを待つ。

で、別の shell から wget でアクセスしてみる。

$ wget http://127.0.0.1:1337/
--2017-03-30 13:54:19--  http://127.0.0.1:1337/
Connecting to 127.0.0.1:1337... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/plain]
Saving to: "index.html"

    [ <=>                                                                                                      ] 12          --.-K/s   in 0s

2017-03-30 13:54:19 (1.18 MB/s) - "index.html" saved [12]

$ cat index.html
Hello World

ちゃんと、「Hello World」というコンテンツが取得できているね。

正しくインストールは出来たようだ。
ありり?FightCode って log っていうコンソールにログ出力するためのメソッドはあるのに、肝心のコンソールが実装されてないん?

FightCode のユーザフォーラムの中の、

the lack of a console to log to also pretty much makes the log command completely useless

という発言はそういうわけかな?
「コンソールがないから、log コマンドがあっても何にもならんわ!」と言うてるんよね?

2015年1月の発言だけど、Web 画面を見る限り、未だにコンソールは実装されてないようやなあ・・・

なんだかなあ・・・

コンソールがないと、デバッグが非常に面倒ですなあ・・・(^^;
自ロボットも敵ロボットも動き回るから、思ってた方向に弾を発射しなかった時、どの時点で取得した値なのか、結果から推測するのって難しいと思うんだけど・・・。取るタイミングの問題なのか、正しい値を取ってるけど、プログラムにバグがあるためなのか、そういう判断が難しいよね。「取った値」を見れないと。

う~ん・・・

子供に JavaScript 教える時の教材にならないかなあと思ったけど、コンソールないと難しいよねえ~
これからプログラミングを始める時に、どの言語を勉強すればいいか・・・という話はよく出てくる。

色々な候補があると思うが、やっぱ簡単に始められ、それなりにお仕事へつながることを期待出来るのは JavaScript かねえ。

今の Web サイトで JavaScript をまったく使ってないところなんてほとんど無いやろう。

そう。JavaScript はブラウザ上で実行出来る。
新たに何もダウンロード等しなくても、メモ帳で JavaScript のプログラムを書いて、Chrome や Firefox 上で実行出来る。さあ、このエントリーを読み終わったらすぐにやってみたらどうだい?(笑)

ただ、Web ページと組み合わせないと実行もできないのよね(Node.js などの話は置いといて、一般的な話)。なので、結果を表示するだけでも初心者は悩んじゃうだろう。それがちょっと敷居の高さになってるかなぁ・・・

例えば、2 + 3 という足し算をした結果を表示するために、

<html>
<head><title>TEST</title></head>
<body>
<script type="text/javascript">
    document.write("2+3の答えは" + (2 + 3) + "です");
</script>
</body>
</html>

とかね。
このソースをメモ帳とかを使って test.html とかいう名前で(文字コードは UTF-8 で)保存してブラウザで開けば画面に結果が表示される。

でも、JavaScript の部分より、HTML の部分が多いという(笑)

まあ、ちゅうても、Web アプリケーション作るには HTML 言語の習得は必須なので、これはこれでいいんじゃないかなとも思うわけだけど(笑)
この、<script type="text/javascript"></script>の部分にソースを書いていけば、作成したプログラムの動作確認はできるよね。

しかし、まあ、これだけで自習というのも退屈だよねえ。

というわけで、JavaScript でロボット(本物じゃなく、画面上のね)を動かすプログラムを書いて、他人が作ったロボットと戦わせることが出来る「Fightcode」という JavaScript の勉強をするサイトがあるんで、そこで遊びながら JavaScript の勉強しようかな・・・と(笑)

ここね。


GitHub のアカウントで無事ログイン出来たし、では、楽しんでみるとするかな。

実は俺も、JavaScript が初めて NetscapeNavigator 2.0 に実装されて世に出てからしばらくの、セキュリティ的に問題があった時代を知ってるもんで、どうも JavaScript を信用できなくてちゃんと勉強してなかったのよね(^^;

このアーカイブについて

このページには、2017年3月以降に書かれたブログ記事のうちプログラミングカテゴリに属しているものが含まれています。

前のアーカイブはプログラミング: 2017年2月です。

次のアーカイブはプログラミング: 2017年4月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。


月別 アーカイブ

電気ウナギ的○○ mobile ver.

携帯版「電気ウナギ的○○」はこちら