https://kaworu.jpn.org/javascript/index.php?title=%E7%89%B9%E5%88%A5:%E6%96%B0%E3%81%97%E3%81%84%E3%83%9A%E3%83%BC%E3%82%B8&feed=atom&hidebots=1&hideredirs=1&limit=50&offset=&namespace=0&username=&tagfilter=
Node.js/JavaScript入門 - 新しいページ [ja]
2024-03-29T06:54:57Z
提供: Node.js/JavaScript入門
MediaWiki 1.24.1
https://kaworu.jpn.org/javascript/node.js%E3%81%A8%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%81%A7%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E5%85%B1%E6%9C%89%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95
node.jsとブラウザでコードを共有する方法
2018-04-12T15:32:12Z
<p>Daemon: ページの作成:「サーバサイド(node.js)とクライアントサイド(ブラウザ)で JavaScript のコードを共有する方法を紹介します。 '''読み方''' ;node....」</p>
<hr />
<div>サーバサイド([[node.js]])とクライアントサイド(ブラウザ)で JavaScript のコードを共有する方法を紹介します。<br />
<br />
'''読み方'''<br />
;[[node.js]]:のーど じぇい えす<br />
__TOC__<br />
<br />
== 概要 ==<br />
サーバサイド([[node.js]])とクライアントサイド(ブラウザ)のソースコードを共有する方法について説明します。<br />
node 用のコードをそのままブラウザで使おうとするとき、<br />
exports is not defined<br />
といったエラーに遭遇した方もいらっしゃると思います。<br />
<br />
これは、ブラウザで動かすときと、サーバ側で動かす場合で、デフォルトで用意されているオブジェクトが異なるのが原因です。<br />
<br />
そこで exports が undefined であるか確認し、 exports があれば、それに関数など exports したいものを入れていき、exports がなければブラウザ用のコードということで、自分が使いたい名前空間を定義します。<br />
<br />
ここでは、3つのソースコードを定義します。<br />
;共有するコード:share.js<br />
;サーバサイド(node.js)で実行するコード:server-share.js<br />
;クライアントサイド(ブラウザ)で実行するコード:client-share.html<br />
== ソースコード share.js ==<br />
これは、サーバとブラウザの両方で共有するためのコードです。<br />
<syntaxhighlight lang="javascript"><br />
/*<br />
* share.js<br />
* Copyright (C) 2018 kaoru <kaoru@localhost><br />
*/<br />
(function(exports){<br />
'use strict';<br />
<br />
exports.foo = function(){<br />
return "foo";<br />
}<br />
})(typeof exports === 'undefined' ? this.share = {} : exports);<br />
</syntaxhighlight><br />
== ソースコード server-share.js ==<br />
サーバサイドの [[node.js]] のコートです。<br />
<syntaxhighlight lang="javascript"><br />
/*<br />
* client-share.js<br />
* Copyright (C) 2018 kaoru <kaoru@localhost><br />
*/<br />
(function(){<br />
'use strict';<br />
<br />
var share = require('./share.js');<br />
console.log(share.foo());<br />
})();<br />
</syntaxhighlight><br />
<br />
実行方法は以下の通りです。<br />
<syntaxhighlight lang="bash"><br />
$ node server-share.js<br />
</syntaxhighlight><br />
== ソースコード server-share.html ==<br />
これは、クライアント(ブラウザ)側で実行するコードです。<br />
都合により、コードの<>は、全角になっているため、半角になおしてご利用下さい。<br />
<syntaxhighlight lang="html5"><br />
<html><br />
<head><br />
<meta charset="utf-8" /><br />
<title>Server-Share</title><br />
</head><br />
<body><br />
<br />
</body><br />
<script language="javascript" src="./share.js"></script><br />
<script language="javascript"><br />
document.write(share.foo());<br />
</script><br />
</html><br />
</syntaxhighlight><br />
== まとめ ==<br />
ちょっと工夫して、コードを書くことで、サーバサイドでもクライアントサイドでも利用できるコードになります。<br />
== 関連項目 ==<br />
* [[node.jsでオブジェクトをexportする方法]]<br />
* [[node.jsで関数をexportする方法]]<br />
* [[メインページ]]<br />
<!-- vim: filetype=mediawiki<br />
--></div>
Daemon
https://kaworu.jpn.org/javascript/%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%82%92%E4%BD%BF%E3%82%8F%E3%81%9A%E3%81%ABJavaScript%E3%81%A7HTTP_cookie%E3%82%92%E3%83%91%E3%83%BC%E3%82%B9%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95
ライブラリを使わずにJavaScriptでHTTP cookieをパースする方法
2018-04-04T15:15:20Z
<p>Daemon: ページの作成:「jQueryなどのライブラリを使わずに、JavaScriptでHTTP cookieをパースする方法をまとめました。 '''読み方''' ;HTTP cookie:えいちてぃー...」</p>
<hr />
<div>jQueryなどのライブラリを使わずに、JavaScriptでHTTP cookieをパースする方法をまとめました。<br />
<br />
'''読み方'''<br />
;HTTP cookie:えいちてぃーてぃーぴー くっきー<br />
__TOC__<br />
<br />
== 概要 ==<br />
JavaScriptで HTTP cookie の値を取得するには<br />
document.cookie<br />
にアクセスします。<br />
<br />
ブラウザのコンソールで<br />
<syntaxhighlight lang="javascript"><br />
document.cookie<br />
</syntaxhighlight><br />
とか<br />
<syntaxhighlight lang="javascript"><br />
console.log(document.cookie);<br />
</syntaxhighlight><br />
と入力すると、設定されいる cookie が表示されます。<br />
<br />
JavaScriptのライブラリを使わずに、簡単に cookie の値を取得するサンプルを用意してみましたので、参考にしてパースしてみてください。<br />
== 想定しているcookieのフォーマット ==<br />
A=123; C=v=1&x=3;<br />
== ソースコード ==<br />
cookie名前を指定して、値を取得する。<br />
<syntaxhighlight lang="javascript"><br />
function get_cookie(cookies, name){<br />
var c = new RegExp(name + "=[^;]+").exec(cookies);<br />
return c ? c[0].replace(name + '=', ''): null;<br />
}<br />
</syntaxhighlight><br />
使い方としては、<br />
<syntaxhighlight lang="javascript"><br />
var cookie_a = get_cookie(document.cookie, 'A');<br />
var cookie_c = get_cookie(document.cookie, 'C');<br />
</syntaxhighlight><br />
となります。<br />
<br />
cookieのサブフィールドを指定して、値を取得する。<br />
たとえば、以下のケースの場合、C という値の cookie のサブフィールドの v の値や x の値を取得します。<br />
v=1&x=3<br />
<syntaxhighlight lang="javascript"><br />
function get_cookie_part(cookie, name) {<br />
var c = new RegExp('&?'+name+'=([^&]+)').exec(cookie);<br />
return c ? c[1]:null;<br />
}<br />
</syntaxhighlight><br />
使い方としては、<br />
<syntaxhighlight lang="javascript"><br />
var value_v = get_cookie_part('v=1&x=3', 'v');<br />
var value_x = get_cookie_part('v=1&x=3', 'x');<br />
</syntaxhighlight><br />
となります。<br />
== 関連項目 ==<br />
* [[メインページ]]<br />
<!-- vim: filetype=mediawiki<br />
--></div>
Daemon
https://kaworu.jpn.org/javascript/node.js%E3%81%A7%E6%93%AC%E4%BC%BC%E4%B9%B1%E6%95%B0%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95
node.jsで擬似乱数を生成する方法
2016-01-09T14:13:17Z
<p>Daemon: ページの作成:「node.jsで'''擬似乱数'''を生成するには、'''crypto'''モジュールを利用します。任意の長さの擬似乱数を生成できます。 '''読み...」</p>
<hr />
<div>[[node.js]]で'''擬似乱数'''を生成するには、'''crypto'''モジュールを利用します。任意の長さの擬似乱数を生成できます。<br />
<br />
'''読み方'''<br />
;擬似乱数:ぎじ らんすう<br />
__TOC__<br />
<br />
== 概要 ==<br />
いろいろなシーンで'''擬似乱数'''が必要になります。たとえば、'''暗号'''で利用する'''鍵'''の生成で利用します。pbkdf(鍵導出関数)などと組み合わせて利用することになるでしょう。<br />
<br />
擬似乱数の生成方法は、 crypto の randomBytes () の第一引数に、欲しい擬似乱数の長さをセットして、呼び出します。<br />
== 乱数の生成の関数 ==<br />
乱数の生成には、いくつかの関数があります。<br />
;randomBytes: 暗号学的に強い擬似乱数を生成します<br />
;pseudoRandomBytes: 暗号学的ではない 強い擬似乱数を生成します<br />
<br />
'''暗号''' で使う場合には、 randomBytes() を利用したほうが良いですが、十分なエントロピーが必要になります。エントロピーが足りない場合、エラーがスローされますので注意が必要です。<br />
<br />
'''暗号''' で使わないのであれば、 pseudoRandomBytes() を利用して構いません。<br />
== ソースコード ==<br />
サンプルでは、console.log()で表示するときに、意図的に base64 エンコードして表示しています。base64 エンコードせずに、標準出力に出力すると、バイト列が出力されるので、意味不明な画面になります。<br />
<br />
ここでは、256バイトの擬似乱数を作成します。<br />
<syntaxhighlight lang="javascript"><br />
/*<br />
* random1.js<br />
* Copyright (C) 2016 kaoru <kaoru@localhost><br />
*/<br />
(function(){<br />
'use strict';<br />
<br />
// async<br />
var crypto = require("crypto");<br />
crypto.randomBytes(256, function(ex, buf) {<br />
if(ex) throw ex;<br />
console.log("%d %s", buf.length, buf.toString('base64') );<br />
});<br />
<br />
// sync<br />
try {<br />
var buf = crypto.randomBytes(256);<br />
console.log("%d %s", buf.length, buf.toString('base64') );<br />
} catch (ex) {<br />
// handle error<br />
}<br />
})();<br />
</syntaxhighlight><br />
== 実行例 ==<br />
ページの表示の都合で、擬似乱数生成器によって出力されたバイト列(のbase64エンコードしたもの)は、途中で改行を入れています。<br />
<syntaxhighlight lang="bash"><br />
$ node random1.js<br />
256 mN8UOf3W0mV1HaYgVrUoPtSsAY5BDstLzZ9pcHvftIcwu6PKMnfiJd0GIWLI0OZfx68ICfcv25u<br />
qKyb3Ao6hj+kAYYhgxSDnlXlc63nog+p2DTxI8X/5TQTbtq8roe9KvQzZjftx6SQqniYorXhOfujEn2<br />
b0wFfWRCBTsjXTkhlSmJv88ykKMuviY8d/5QjaydgvH0iM1Ywjp5dFkiPKdm7evalbhxA7X4KSk0DOB<br />
AGgJTZXOxXHaMUlXo86b9GClJkX6ffgfXpvNxVOQ6PU/meadFrH4VPr+dZoTFRMh2e6W0o2cwpvyA+C<br />
UNyOtWGr4qAvVUeUf491riJpWUBJ7Q==<br />
256 zHuYOvLyI78m1CjBsnTNg5LOyKDgB9HOUI0OB7LhKVRqUypUVkYBngafw6eilgtE3IvIARhx63p<br />
YKl+VGhetqbK0kle7PaUDthZx2ULZJc4NwoAoq3FGR065CcD3burKCmHnPPYQrqNQdhBvMBMyqkh4Pa<br />
NqtuvqjMfL7wEOcKWTmUmlguF3Y1LCLpnCUN+dXluc9hRPTb/t27iX5PVSu/dB1mxXpZwJMq3JdoCKY<br />
RDNZXP+F4RdHGZRZY735RH+MADgO/YqVZ00qfor7GKEcNmvU2/b1pasmhapRqmSa79xES+bSCX0oq6s<br />
d8YyuofYkwZlRTctitL+B+GD0eozHw==<br />
</syntaxhighlight><br />
== まとめ ==<br />
* 暗号で擬似乱数を利用する場合は、 randomBytes を利用する<br />
** エントロピーが足りないとエラーがスローされる<br />
* 暗号以外で擬似乱数を使う場合は、 pseudoRandomBytes を利用して良い<br />
== 関連項目 ==<br />
* [[node.js]]<br />
<!-- vim: filetype=mediawiki<br />
--></div>
Daemon
https://kaworu.jpn.org/javascript/%E5%AE%9A%E6%95%B0
定数
2015-12-15T14:45:40Z
<p>Daemon: ページの作成:「C言語では、定数の定義にconstやdefineが使えました。JavaScriptでは、ECMAScript 6 から '''const''' を使用できます。 '''読み方''' ;定数:...」</p>
<hr />
<div>C言語では、定数の定義にconstやdefineが使えました。JavaScriptでは、ECMAScript 6 から '''const''' を使用できます。<br />
<br />
'''読み方'''<br />
;定数:ていすう<br />
;const:こんすと<br />
__TOC__<br />
<br />
== 概要 ==<br />
定数とは、上書きできない値です。<br />
[[定数]]を利用することで、マジックナンバーを避けることができ、コードの可読性が上がります。<br />
== ソースコード ==<br />
<syntaxhighlight lang="javascript"><br />
/* jshint esnext: true */<br />
const max = 255;<br />
</syntaxhighlight><br />
== 実行例 ==<br />
[[jshint]] に対するコメントがない場合、[[jshint]] が警告を出します。<br />
<syntaxhighlight lang="javascript"><br />
const max = 255;<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang="bash"><br />
$ jshint const1.js<br />
'const' is available in ES6 (use esnext option)<br />
or Mozilla JS extensions (use moz).<br />
</syntaxhighlight><br />
== 関連項目 ==<br />
{{lang core}}<br />
* [[JavaScript言語解説]]<br />
<!-- vim: filetype=mediawiki<br />
--></div>
Daemon
https://kaworu.jpn.org/javascript/Node.js_Tools_for_Visual_Studio
Node.js Tools for Visual Studio
2015-11-24T14:46:57Z
<p>Daemon: </p>
<hr />
<div>[[Node.js Tools for Visual Studio]]とは、Microsoftの統合開発環境 Visual Studio に Node.js の開発機能を追加するプラグインです。visualstudio.comから無償でダウンロードできます。<br />
<br />
'''読み方'''<br />
;[[Node.js Tools for Visual Studio]]:のーど じぇいえす つーるず ふぉー びじゅある すたじお<br />
__TOC__<br />
<br />
== 概要 ==<br />
[[Node.js Tools for Visual Studio]](NTVS)は、<u>Visual Studio に Node.jsの開発環境を提供するオープンソースのプラグインです</u>。<br />
<br />
[[Node.js Tools for Visual Studio]]の特徴を以下に挙げます。<br />
* 無償<br />
* オープンソース<br />
* インテリセンスによるインテリジェントなコード補完(IntelliSense)<br />
* デバッグ機能<br />
* プロファイリング機能<br />
* Node.js, io.js, JavaScript, TypeScript, HTML, CSS, JSON のサポート<br />
== Node.js Tools for Visual Studio v1.1がサポートする環境 ==<br />
* Visual Studio 2012<br />
* Visual Studio 2013<br />
* Visual Studio 2015<br />
* 無償版 Visual Studio Express<br />
* 無償版 Visual Studio Community<br />
== ライセンス ==<br />
* Apache License 2.0<br />
== ダウンロード ==<br />
* [https://www.visualstudio.com/ja-jp/features/node-js-vs.aspx ダウンロードサイト]<br />
== 関連項目 ==<br />
* [[JavaScript開発環境]]<br />
<!-- vim: filetype=mediawiki<br />
--></div>
Daemon
https://kaworu.jpn.org/javascript/node.js_cluster%E3%81%A7HTTP%E3%82%B5%E3%83%BC%E3%83%90%E3%82%92%E3%83%9E%E3%83%AB%E3%83%81%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E5%8C%96%E3%81%99%E3%82%8B
node.js clusterでHTTPサーバをマルチプロセス化する
2014-11-29T15:28:07Z
<p>Daemon: </p>
<hr />
<div>[[node.js]]のclusterを使用してHTTPサーバ(ウェブサーバ)を並列化し、パフォーマンスを上げられます。<br />
<br />
'''読み方'''<br />
;cluster:くらすた<br />
__TOC__<br />
<br />
== 概要 ==<br />
[[node.js]]の問題点として、シングルプロセスで処理をしていて、あるリクエストの処理が長くかかる場合、ほかのすべてのリクエストをブロックする可能性があります。httpモジュールで、ウェブサーバを起動したとき、同時に処理できるアクセスは、1つだけなので、処理がつまると、後ろに並んでいるリクエストの待ち行列は、ブロックされた状態になります。<br />
<br />
そのような問題を解決するために、並行サーバ(並列)、マルチスレッドモデルなどがあるわけです。<br />
[[node.js]]では、この問題に対処するいくつかの方法がありますが、ここでは、clusterを用いた例を示します。<br />
<br />
clusterは、マルチコアを活かすためのものです。並行サーバは、コア数以上は実際に動作しないようで、コアが合計2個しかなければ、コア数より多くfork()したとしても、2個分のプロセスしか仕事をしません。<br />
<br />
clusterの考え方は、伝統的なUnixプログラミングのforkモデルと同じと捉えて差し支えありません。<br />
<br />
cluster.js で示すコードでは、[[node]] で起動されたプログラム(親)は、コア数だけ fork を行い、子プロセスがHTTPサーバを起動し、リクエストを処理します。<br />
<br />
Unixのfork()と異なるのは、Unixのforkは、forkを呼び出した直後のプログラムが親プロセスと子プロセスで実行されますが、node.jsのclusterの場合は、forkを実行すると、同じプログラムが最初から起動されます。<br />
<br />
== Clusterのサンプルプログラム ==<br />
HTTPサーバをマルチプロセス化する前に、Clusterの簡単な例を示します。親プロセスかどうかの判断は、 cluster.isMaster を参照し、真であれば、親と判断します。<br />
子プロセスは、 process.exit() で終了させることができます。<br />
<syntaxhighlight lang="javascript"><br />
/*<br />
* cluster1.js<br />
* Copyright (C) 2014 kaoru <kaoru@bsd><br />
*/<br />
var cluster = require('cluster');<br />
if (cluster.isMaster) {<br />
console.log ('parents');<br />
var worker = cluster.fork();<br />
cluster.on('exit', function(worker, code, signal) {<br />
console.log('worker ' + worker.process.pid + ' died');<br />
});<br />
} else {<br />
console.log("worker");<br />
process.exit();<br />
}<br />
</syntaxhighlight><br />
実行例は、以下の通りです。<br />
<syntaxhighlight lang="bash"><br />
node cluster1.js<br />
parents<br />
worker<br />
worker 47429 died<br />
</syntaxhighlight><br />
<br />
子プロセスが何らかの理由で終了してしまった場合に、以下のコードが実行されます。<br />
<syntaxhighlight lang="javascript"><br />
cluster.on('exit', function(worker, code, signal) {<br />
console.log('worker ' + worker.process.pid + ' died');<br />
});<br />
</syntaxhighlight><br />
子プロセスが終了してしまった場合に、子プロセスを作り直すには、上記のコードに fork() を追加することで実現できます。<br />
<syntaxhighlight lang="javascript"><br />
cluster.on('exit', function(worker, code, signal) {<br />
console.log('worker ' + worker.process.pid + ' died');<br />
cluster.fork();<br />
});<br />
</syntaxhighlight><br />
マルチプロセスのHTTPサーバでは、リクエストをさばくための子プロセスが終了したままになってしまうと、リクエストをさばく子プロセスが減ったままになってしまいます。また、何らかの理由で、すべての子プロセスが終了してしまった場合、リクエストがさばけなくなってしまいます。そのために、いなくなってしまった子プロセスの分のプロセスを再作成する必要が出てきます。<br />
<br />
== CPUの数を調べる方法 ==<br />
マルチプロセス化する時にCPUの数(コアの数)を調べて、fork()します。そのために、以下のコードでCPUの数を調べることができます。<br />
<syntaxhighlight lang="javascript"><br />
var numCPUs = require('os').cpus().length;<br />
</syntaxhighlight><br />
<br />
== ClusterでHTTPサーバをマルチプロセス化する例 ==<br />
=== cluster.js ===<br />
<syntaxhighlight lang="javascript"><br />
/*<br />
* cluster.js<br />
* Copyright (C) 2014 kaoru <kaoru@bsd><br />
*/<br />
var cluster = require('cluster');<br />
var http = require('http');<br />
<br />
var numCPUs = require('os').cpus().length;<br />
<br />
var port = 8080;<br />
var max_server = numCPUs; // max server<br />
if (cluster.isMaster) {<br />
console.log ('master');<br />
<br />
for ( var i = 0 ; i < max_server ; ++i) {<br />
cluster.fork();<br />
}<br />
<br />
cluster.on('exit', function(worker, code, signal) {<br />
console.log('worker ' + worker.process.pid + ' died');<br />
cluster.fork();<br />
});<br />
<br />
} else {<br />
console.log("worker");<br />
var server = http.createServer(function(req, res){<br />
res.writeHead(200);<br />
res.end('Hello World');<br />
}).listen(port);<br />
}<br />
</syntaxhighlight><br />
== 実行例 ==<br />
<syntaxhighlight lang="bash"><br />
node cluster.js<br />
</syntaxhighlight><br />
== ベンチマーク ==<br />
[[node.jsによるHTTPサーバの作り方]]の簡単なHTTPサーバとcluster.jsを ab でベンチマークしました。<br />
Hello World レベルのプログラムのベンチマークです。10000 リクエストを並列30でベンチマークした場合です。<br />
<syntaxhighlight lang="bash"><br />
ab -n 10000 -c 30 http://localhost:8080/<br />
</syntaxhighlight><br />
<br />
ベンチマークの結果は、平行サーバは、 2.3 秒、非平行サーバは 3.1秒と、ほんのすこしだけ、パフォーマンスが上がっていることが確認できました。<br />
=== コア数 2 の並行サーバ ===<br />
<pre><br />
Document Path: /<br />
Document Length: 12 bytes<br />
<br />
Concurrency Level: 30<br />
Time taken for tests: 2.323 seconds<br />
Complete requests: 10000<br />
Failed requests: 0<br />
Total transferred: 870000 bytes<br />
HTML transferred: 120000 bytes<br />
Requests per second: 4304.82 [#/sec] (mean)<br />
Time per request: 6.969 [ms] (mean)<br />
Time per request: 0.232 [ms] (mean, across all concurrent requests)<br />
Transfer rate: 365.74 [Kbytes/sec] received<br />
</pre><br />
=== 非平行サーバ ===<br />
<pre><br />
Document Path: /<br />
Document Length: 12 bytes<br />
<br />
Concurrency Level: 30<br />
Time taken for tests: 3.175 seconds<br />
Complete requests: 10000<br />
Failed requests: 0<br />
Total transferred: 1130000 bytes<br />
HTML transferred: 120000 bytes<br />
Requests per second: 3150.08 [#/sec] (mean)<br />
Time per request: 9.524 [ms] (mean)<br />
Time per request: 0.317 [ms] (mean, across all concurrent requests)<br />
Transfer rate: 347.62 [Kbytes/sec] received<br />
</pre><br />
<br />
== 関連項目 ==<br />
{{node_http_server}}<br />
<!-- vim: filetype=mediawiki<br />
--></div>
Daemon
https://kaworu.jpn.org/javascript/node.js%E3%81%A7sleep%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95
node.jsでsleepする方法
2014-11-29T06:00:15Z
<p>Daemon: ページの作成:「node.jsでsleepするには、sleepモジュールで提供されるsleepやusleepを使用します。 '''読み方''' ;sleep:すりーぷ __TOC__ == 概要 == C...」</p>
<hr />
<div>[[node.js]]でsleepするには、sleepモジュールで提供されるsleepやusleepを使用します。<br />
<br />
'''読み方'''<br />
;sleep:すりーぷ<br />
__TOC__<br />
<br />
== 概要 ==<br />
C言語などでプログラムを一時的に寝かす方法として、sleep()やusleep()を使用します。<br />
sleepモジュールは、同様の機能を提供してくれます。<br />
== インストール ==<br />
sleepモジュールをインストールします。<br />
<syntaxhighlight lang="bash"><br />
$ sudo node install -g sleep<br />
</syntaxhighlight><br />
<br />
g++コマンドが存在しない環境では、CXXでC++コンパイラを指定してください。<br />
<syntaxhighlight lang="bash"><br />
$ sudo env CXX=c++ npm install -g sleep<br />
</syntaxhighlight><br />
<br />
== ソースコード ==<br />
3秒スリープする例です。<br />
<syntaxhighlight lang="javascript"><br />
var sleep = require('sleep');<br />
sleep.sleep(3); // 3秒スリープします。<br />
</syntaxhighlight><br />
<br />
3マイクロ秒スリープするには、usleepを使用します。<br />
1秒は、1,000,000 マイクロセコンドです。<br />
<syntaxhighlight lang="javascript"><br />
var sleep = require('sleep');<br />
sleep.usleep(3); // 3マイクロ秒スリープします。<br />
</syntaxhighlight><br />
<br />
== 実行例 ==<br />
<syntaxhighlight lang="bash"><br />
$ node sleep.js<br />
</syntaxhighlight><br />
== 使い方 ==<br />
== エラー ==<br />
=== インストール時のエラー ===<br />
[[npm]]は、インストール時にC++のソースコードをビルドしようとします。そのときに、g++コマンドを使おうとします。FreeBSD 10.0-RELEASEでは、g++コマンドがありません。代わりに、c++コマンド(実体はclang++)やclang++コマンドがあります。<br />
<syntaxhighlight lang="bash"><br />
$ sudo npm install -g sleep<br />
\<br />
> sleep@1.1.8 install /usr/local/lib/node_modules/sleep<br />
> node build.js || nodejs build.js<br />
<br />
gyp WARN EACCES user "root" does not have permission to access the dev dir "/roo<br />
t/.node-gyp/0.10.33"<br />
gyp WARN EACCES attempting to reinstall using temporary dev dir "/usr/local/lib/<br />
node_modules/sleep/.node-gyp"<br />
gmake: ディレクトリ '/usr/local/lib/node_modules/sleep/build' に入ります<br />
CXX(target) Release/obj.target/node_sleep/sleep.o<br />
gmake: g++: コマンドが見つかりませんでした<br />
node_sleep.target.mk:81: ターゲット 'Release/obj.target/node_sleep/sleep.o' のレシピで失敗しました<br />
gmake: *** [Release/obj.target/node_sleep/sleep.o] エラー 127<br />
gmake: ディレクトリ '/usr/local/lib/node_modules/sleep/build' から出ます<br />
gyp ERR! build error<br />
gyp ERR! stack Error: `gmake` failed with exit code: 2<br />
gyp ERR! stack at ChildProcess.onExit (/usr/local/lib/node_modules/npm/node_modules/node-gyp/lib/build.js:267:23)<br />
gyp ERR! stack at ChildProcess.emit (events.js:98:17)<br />
gyp ERR! stack at Process.ChildProcess._handle.onexit (child_process.js:810:12)<br />
gyp ERR! System FreeBSD 10.0-RELEASE-p7<br />
gyp ERR! command "node" "/usr/local/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "rebuild" "--global" "sleep"<br />
gyp ERR! cwd /usr/local/lib/node_modules/sleep<br />
gyp ERR! node -v v0.10.33<br />
gyp ERR! node-gyp -v v1.0.2<br />
gyp ERR! not ok<br />
[sleep]: Error: Failed to execute 'node-gyp rebuild --global sleep' (1)<br />
nodejs: not found<br />
<br />
npm ERR! FreeBSD 10.0-RELEASE-p7<br />
npm ERR! argv "node" "/usr/local/bin/npm" "install" "-g" "sleep"<br />
npm ERR! node v0.10.33<br />
npm ERR! npm v2.0.2<br />
npm ERR! code ELIFECYCLE<br />
npm ERR! sleep@1.1.8 install: `node build.js || nodejs build.js`<br />
npm ERR! Exit status 127<br />
npm ERR!<br />
npm ERR! Failed at the sleep@1.1.8 install script.<br />
npm ERR! This is most likely a problem with the sleep package,<br />
npm ERR! not with npm itself.<br />
npm ERR! Tell the author that this fails on your system:<br />
npm ERR! node build.js || nodejs build.js<br />
npm ERR! You can get their info via:<br />
npm ERR! npm owner ls sleep<br />
npm ERR! There is likely additional logging output above.<br />
</syntaxhighlight><br />
<br />
g++コマンドのない環境のエラーです。環境変数でC++コンパイラのコマンドを指定します。<br />
g++以外のC++コンパイラがすでにある場合は、環境変数 CXX でC++コンパイラのコマンドを指定します。または、g++のパッケージをインストールします。<br />
<syntaxhighlight lang="bash"><br />
$ sudo env CXX=c++ npm install -g sleep<br />
パスワード:<br />
|<br />
> sleep@1.1.8 install /usr/local/lib/node_modules/sleep<br />
> node build.js || nodejs build.js<br />
<br />
gyp WARN EACCES user "root" does not have permission to access the dev dir "/root/.node-gyp/0.10.33"<br />
gyp WARN EACCES attempting to reinstall using temporary dev dir "/usr/local/lib/node_modules/sleep/.node-gyp"<br />
gmake: ディレクトリ '/usr/local/lib/node_modules/sleep/build' に入ります<br />
CXX(target) Release/obj.target/node_sleep/sleep.o<br />
SOLINK_MODULE(target) Release/obj.target/node_sleep.node<br />
COPY Release/node_sleep.node<br />
gmake: ディレクトリ '/usr/local/lib/node_modules/sleep/build' から出ます<br />
[sleep]: Created: Build/Release<br />
[sleep]: Installed in Build/Release/node_sleep.node<br />
sleep@1.1.8 /usr/local/lib/node_modules/sleep<br />
└── mkdirp@0.3.5<br />
</syntaxhighlight><br />
<br />
=== ビルド時のエラー ===<br />
mkdirp がないとエラーになりました。<br />
<syntaxhighlight lang="bash"><br />
$ node build.js<br />
<br />
module.js:340<br />
throw err;<br />
^<br />
Error: Cannot find module 'mkdirp'<br />
at Function.Module._resolveFilename (module.js:338:15)<br />
at Function.Module._load (module.js:280:25)<br />
at Module.require (module.js:364:17)<br />
at require (module.js:380:17)<br />
at Object.<anonymous> (/tmp/node/node-sleep/build.js:8:14)<br />
at Module._compile (module.js:456:26)<br />
at Object.Module._extensions..js (module.js:474:10)<br />
at Module.load (module.js:356:32)<br />
at Function.Module._load (module.js:312:12)<br />
at Function.Module.runMain (module.js:497:10)<br />
</syntaxhighlight><br />
<br />
mkdirp を入れます。<br />
<syntaxhighlight lang="bash"><br />
$ sudo npm install -g mkdirp<br />
</syntaxhighlight><br />
<br />
node-gyp が入っていないようです。<br />
<syntaxhighlight lang="bash"><br />
$ node build.js<br />
[sleep]: Error: Failed to execute 'node-gyp rebuild' (Error: spawn ENOENT)<br />
</syntaxhighlight><br />
<br />
node-gyp を入れます。<br />
<syntaxhighlight lang="bash"><br />
$ sudo npm install -g node-gyp<br />
</syntaxhighlight><br />
<br />
g++コマンドがないので失敗しました。<br />
<syntaxhighlight lang="bash"><br />
$ node build.js<br />
gyp info it worked if it ends with ok<br />
gyp info using node-gyp@1.0.2<br />
gyp info using node@0.10.33 | freebsd | x64<br />
gyp http GET http://nodejs.org/dist/v0.10.33/node-v0.10.33.tar.gz<br />
gyp http 200 http://nodejs.org/dist/v0.10.33/node-v0.10.33.tar.gz<br />
gyp http GET http://nodejs.org/dist/v0.10.33/SHASUMS256.txt<br />
gyp http 200 http://nodejs.org/dist/v0.10.33/SHASUMS256.txt<br />
gyp info spawn python<br />
gyp info spawn args [ '/usr/local/lib/node_modules/node-gyp/gyp/gyp_main.py',<br />
gyp info spawn args 'binding.gyp',<br />
gyp info spawn args '-f',<br />
gyp info spawn args 'make',<br />
gyp info spawn args '-I',<br />
gyp info spawn args '/tmp/node/node-sleep/build/config.gypi',<br />
gyp info spawn args '-I',<br />
gyp info spawn args '/usr/local/lib/node_modules/node-gyp/addon.gypi',<br />
gyp info spawn args '-I',<br />
gyp info spawn args '/tmp/.node-gyp/0.10.33/common.gypi',<br />
gyp info spawn args '-Dlibrary=shared_library',<br />
gyp info spawn args '-Dvisibility=default',<br />
gyp info spawn args '-Dnode_root_dir=/tmp/.node-gyp/0.10.33',<br />
gyp info spawn args '-Dmodule_root_dir=/tmp/node/node-sleep',<br />
gyp info spawn args '--depth=.',<br />
gyp info spawn args '--no-parallel',<br />
gyp info spawn args '--generator-output',<br />
gyp info spawn args 'build',<br />
gyp info spawn args '-Goutput_dir=.' ]<br />
gyp info spawn gmake<br />
gyp info spawn args [ 'BUILDTYPE=Release', '-C', 'build' ]<br />
gmake: ディレクトリ '/tmp/node/node-sleep/build' に入ります<br />
CXX(target) Release/obj.target/node_sleep/sleep.o<br />
gmake: g++: コマンドが見つかりませんでした<br />
node_sleep.target.mk:81: ターゲット 'Release/obj.target/node_sleep/sleep.o' のレシピで失敗しました<br />
gmake: *** [Release/obj.target/node_sleep/sleep.o] エラー 127<br />
gmake: ディレクトリ '/tmp/node/node-sleep/build' から出ます<br />
gyp ERR! build error<br />
gyp ERR! stack Error: `gmake` failed with exit code: 2<br />
gyp ERR! stack at ChildProcess.onExit (/usr/local/lib/node_modules/node-gyp/lib/build.js:267:23)<br />
gyp ERR! stack at ChildProcess.emit (events.js:98:17)<br />
gyp ERR! stack at Process.ChildProcess._handle.onexit (child_process.js:810:12)<br />
gyp ERR! System FreeBSD 10.0-RELEASE-p7<br />
gyp ERR! command "node" "/usr/local/bin/node-gyp" "rebuild"<br />
gyp ERR! cwd /tmp/node/node-sleep<br />
gyp ERR! node -v v0.10.33<br />
gyp ERR! node-gyp -v v1.0.2<br />
gyp ERR! not ok<br />
[sleep]: Error: Failed to execute 'node-gyp rebuild' (1)<br />
</syntaxhighlight><br />
<br />
FreeBSD 10.0-RELEASEには、g++コマンドがないので、エラーになりました。<br />
make に C++コンパイラを指定してやればいいだけなので、環境変数でこの問題は解決できます。<br />
<syntaxhighlight lang="bash"><br />
$ env CXX=c++ node build.js<br />
gyp info it worked if it ends with ok<br />
gyp info using node-gyp@1.0.2<br />
gyp info using node@0.10.33 | freebsd | x64<br />
gyp info spawn python<br />
gyp info spawn args [ '/usr/local/lib/node_modules/node-gyp/gyp/gyp_main.py',<br />
gyp info spawn args 'binding.gyp',<br />
gyp info spawn args '-f',<br />
gyp info spawn args 'make',<br />
gyp info spawn args '-I',<br />
gyp info spawn args '/tmp/node/node-sleep/build/config.gypi',<br />
gyp info spawn args '-I',<br />
gyp info spawn args '/usr/local/lib/node_modules/node-gyp/addon.gypi',<br />
gyp info spawn args '-I',<br />
gyp info spawn args '/tmp/.node-gyp/0.10.33/common.gypi',<br />
gyp info spawn args '-Dlibrary=shared_library',<br />
gyp info spawn args '-Dvisibility=default',<br />
gyp info spawn args '-Dnode_root_dir=/tmp/.node-gyp/0.10.33',<br />
gyp info spawn args '-Dmodule_root_dir=/tmp/node/node-sleep',<br />
gyp info spawn args '--depth=.',<br />
gyp info spawn args '--no-parallel',<br />
gyp info spawn args '--generator-output',<br />
gyp info spawn args 'build',<br />
gyp info spawn args '-Goutput_dir=.' ]<br />
gyp info spawn gmake<br />
gyp info spawn args [ 'BUILDTYPE=Release', '-C', 'build' ]<br />
gmake: ディレクトリ '/tmp/node/node-sleep/build' に入ります<br />
CXX(target) Release/obj.target/node_sleep/sleep.o<br />
SOLINK_MODULE(target) Release/obj.target/node_sleep.node<br />
COPY Release/node_sleep.node<br />
gmake: ディレクトリ '/tmp/node/node-sleep/build' から出ます<br />
gyp info ok<br />
[sleep]: Created: Build/Release<br />
[sleep]: Installed in Build/Release/node_sleep.node<br />
</syntaxhighlight><br />
== 関連項目 ==<br />
* [[node.js]]<br />
<!-- vim: filetype=mediawiki<br />
--></div>
Daemon
https://kaworu.jpn.org/javascript/node.js%E7%92%B0%E5%A2%83%E3%82%92chef%E3%81%A7%E6%A7%8B%E7%AF%89%E3%81%99%E3%82%8B
node.js環境をchefで構築する
2014-09-10T16:40:13Z
<p>Daemon: ページの作成:「chef(chef-solo)を利用して、node.js(node)とnpmをインストールします。 '''読み方''' ;chef:しぇふ __TOC__ == 概要 == 今回、イン...」</p>
<hr />
<div>chef(chef-solo)を利用して、[[node.js]]([[node]])と[[npm]]をインストールします。<br />
<br />
'''読み方'''<br />
;chef:しぇふ<br />
__TOC__<br />
<br />
== 概要 ==<br />
今回、インストールするパッケージは、以下の通りです。<br />
* [[node]]<br />
* [[npm]]<br />
== cookbook の作成 ==<br />
<syntaxhighlight lang="bash"><br />
knife cookbook create node -o .<br />
</syntaxhighlight><br />
== レシピの作成 ==<br />
<syntaxhighlight lang="bash"><br />
vim node/recipes/default.rb<br />
</syntaxhighlight><br />
=== recipes/default.rb ===<br />
<syntaxhighlight lang="ruby"><br />
#<br />
# Cookbook Name:: node<br />
# Recipe:: default<br />
#<br />
# Copyright 2014, YOUR_COMPANY_NAME<br />
#<br />
# All rights reserved - Do Not Redistribute<br />
#<br />
<br />
package "node" do<br />
action :install<br />
end<br />
<br />
package "npm" do<br />
action :install<br />
end<br />
</syntaxhighlight><br />
<br />
== パッケージのインストール ==<br />
<syntaxhighlight lang="bash"><br />
sudo chef-solo -o node<br />
</syntaxhighlight><br />
=== 実行例 ===<br />
<syntaxhighlight lang="bash"><br />
$ sudo chef-solo -o node<br />
[2014-09-10T22:02:12+09:00] WARN:<br />
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *<br />
SSL validation of HTTPS requests is disabled. HTTPS connections are still<br />
encrypted, but chef is not able to detect forged replies or man in the middle<br />
attacks.<br />
<br />
To fix this issue add an entry like this to your configuration file:<br />
<br />
```<br />
# Verify all HTTPS connections (recommended)<br />
ssl_verify_mode :verify_peer<br />
<br />
# OR, Verify only connections to chef-server<br />
verify_api_cert true<br />
```<br />
<br />
To check your SSL configuration, or troubleshoot errors, you can use the<br />
`knife ssl check` command like so:<br />
<br />
```<br />
knife ssl check -c /etc/chef/solo.rb<br />
```<br />
<br />
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *<br />
<br />
Starting Chef Client, version 11.14.2<br />
[2014-09-10T22:02:16+09:00] WARN: Run List override has been provided.<br />
[2014-09-10T22:02:16+09:00] WARN: Original Run List: []<br />
[2014-09-10T22:02:16+09:00] WARN: Overridden Run List: [recipe[node]]<br />
Compiling Cookbooks...<br />
Converging 2 resources<br />
Recipe: node::default<br />
* freebsd_package[node] action install<br />
- install version 0.10.31 of package node<br />
* freebsd_package[npm] action install<br />
- install version 1.4.15 of package npm<br />
<br />
Running handlers:<br />
Running handlers complete<br />
Chef Client finished, 2/2 resources updated in 13.055802763 seconds<br />
</syntaxhighlight><br />
== 関連項目 ==<br />
* [[JavaScript開発環境]]<br />
<!-- vim: filetype=mediawiki<br />
--></div>
Daemon
https://kaworu.jpn.org/javascript/jade
jade
2014-09-09T16:28:06Z
<p>Daemon: ページの作成:「jadeとは、nodeのテンプレートエンジンです。 '''読み方''' ;jade:じぇいど __TOC__ == 概要 == node.js用のjadeは、高いパ...」</p>
<hr />
<div>[[jade]]とは、[[node]]のテンプレートエンジンです。<br />
<br />
'''読み方'''<br />
;[[jade]]:じぇいど<br />
__TOC__<br />
<br />
== 概要 ==<br />
[[node.js]]用の[[jade]]は、高いパフォーマンスのテンプレートエンジンです。<br />
<br />
== 拡張子 ==<br />
[[jade]]用のファイルの拡張子は、 .jade です。<br />
== jade用vimプラグイン ==<br />
=== vim-jade ===<br />
vim-jadeは、[[jade]]テンプレート用にシンタックスハイライトを提供します。<br />
.vimrc に以下の設定を追加します。<br />
<syntaxhighlight lang="vim"><br />
NeoBundle 'digitaltoad/vim-jade'<br />
</syntaxhighlight><br />
NeoBundleを利用して、インストールする場合は、以下のコマンドを実行します。<br />
<syntaxhighlight lang="bash"><br />
$ vim +":NeoBundleInstall" +:q<br />
</syntaxhighlight><br />
== インストール ==<br />
<syntaxhighlight lang="bash"><br />
$ sudo npm install -g jade<br />
</syntaxhighlight><br />
== jadeコマンドでHTMLファイルを作成する ==<br />
=== ソースコード hello.jade ===<br />
<pre><br />
doctype html<br />
html(lang="ja")<br />
head<br />
title Page Title<br />
body<br />
h1. Header<br />
p Hello, World.<br />
</pre><br />
=== 実行 hello.htmlの作成 ===<br />
<syntaxhighlight lang="bash"><br />
$ jade hello.jade<br />
<br />
rendered hello.html<br />
</syntaxhighlight><br />
<br />
=== 作成された hello.html ===<br />
<pre><br />
<nowiki><br />
<!DOCTYPE html><html lang="ja"><head><title>Page<br />
Title</title></head><body><h1>p Hello, World.</h1></body></html><br />
</nowiki><br />
</pre><br />
== 使い方 ==<br />
=== コマンドラインオプション ===<br />
<syntaxhighlight lang="bash"><br />
Usage: jade [options] [dir|file ...]<br />
<br />
Options:<br />
<br />
-h, --help output usage information<br />
-V, --version output the version number<br />
-O, --obj <str> javascript options object<br />
-o, --out <dir> output the compiled html to <dir><br />
-p, --path <path> filename used to resolve includes<br />
-P, --pretty compile pretty html output<br />
-c, --client compile function for client-side runtime.js<br />
-D, --no-debug compile without debugging (smaller functions)<br />
-w, --watch watch files for changes and automatically re-render<br />
<br />
Examples:<br />
<br />
# translate jade the templates dir<br />
$ jade templates<br />
<br />
# create {foo,bar}.html<br />
$ jade {foo,bar}.jade<br />
<br />
# jade over stdio<br />
$ jade < my.jade > my.html<br />
<br />
# jade over stdio<br />
$ echo 'h1 Jade!' | jade<br />
<br />
# foo, bar dirs rendering to /tmp<br />
$ jade foo bar --out /tmp<br />
</syntaxhighlight><br />
== 関連項目 ==<br />
<br />
<!-- vim: filetype=mediawiki<br />
--></div>
Daemon
https://kaworu.jpn.org/javascript/jq
jq
2014-09-08T14:05:16Z
<p>Daemon: </p>
<hr />
<div>[[jq]]コマンドとは、コマンドライン JSON プロセッサです。jsonデータの整形や抽出ができます。[[jq]]コマンドとは別の存在として、[[node.js]]の[[npm]]モジュールとして、サーバサイド jQuery ラッパーの名前も jq です。<br />
<br />
'''読み方'''<br />
;[[jq]]:じぇーきゅー<br />
__TOC__<br />
<br />
== 概要 ==<br />
[[jq]]コマンドは、awkやsedのように整形や加工を行うコマンドです。<br />
<br />
直列で表示されたJSONフォーマットは、ヒューマンリーダブルではありません。<br />
<syntaxhighlight lang="javascript"><br />
[{"name":"foo","age":10},{"name":"bar","age":20},{"name":"hoge","age":30}]<br />
</syntaxhighlight><br />
<br />
このように展開することによって、可読性が改善します。<br />
<syntaxhighlight lang="javascript"><br />
[<br />
{<br />
"age": 10,<br />
"name": "foo"<br />
},<br />
{<br />
"age": 20,<br />
"name": "bar"<br />
},<br />
{<br />
"age": 30,<br />
"name": "hoge"<br />
}<br />
]<br />
</syntaxhighlight><br />
<br />
== インストール ==<br />
=== FreeBSD ===<br />
<syntaxhighlight lang="bash"><br />
$ sudo pkg install jq<br />
</syntaxhighlight><br />
=== Ubuntu ===<br />
<syntaxhighlight lang="bash"><br />
$ sudo apt-get install jq<br />
</syntaxhighlight><br />
=== CentOS ===<br />
<syntaxhighlight lang="bash"><br />
$ sudo yum -y install jq<br />
</syntaxhighlight><br />
=== Mac ===<br />
<syntaxhighlight lang="bash"><br />
brew install jq<br />
</syntaxhighlight><br />
<br />
== 使い方 ==<br />
=== コマンドラインオプション ===<br />
<syntaxhighlight lang="bash"><br />
jq - commandline JSON processor [version 1.3]<br />
Usage: jq [options] <jq filter> [file...]<br />
<br />
For a description of the command line options and<br />
how to write jq filters (and why you might want to)<br />
see the jq manpage, or the online documentation at<br />
http://stedolan.github.com/jq<br />
</syntaxhighlight><br />
=== JSONを整形して表示する ===<br />
<syntaxhighlight lang="bash"><br />
$ cat b.json<br />
[{"name":"foo","age":10},{"name":"bar","age":20},{"name":"hoge","age":30}]<br />
$ jq . b.json<br />
[<br />
{<br />
"age": 10,<br />
"name": "foo"<br />
},<br />
{<br />
"age": 20,<br />
"name": "bar"<br />
},<br />
{<br />
"age": 30,<br />
"name": "hoge"<br />
}<br />
]<br />
</syntaxhighlight><br />
=== JSONからn番目のエントリを抽出する ===<br />
インデックスの値は、0から数えます。2番目を表示するには、1を指定します。<br />
<syntaxhighlight lang="bash"><br />
$ jq '.[1]' b.json<br />
{<br />
"age": 20,<br />
"name": "bar"<br />
}<br />
</syntaxhighlight><br />
=== JSONで特定のフィールドを抽出する ===<br />
2番めのageのフィールドだけを抽出します。<br />
<syntaxhighlight lang="bash"><br />
$ jq '.[1].age' b.json<br />
20<br />
</syntaxhighlight><br />
<br />
すべてのageのフィールドを抽出します。<br />
<syntaxhighlight lang="bash"><br />
$ jq '.[].age' b.json<br />
10<br />
20<br />
30<br />
</syntaxhighlight><br />
=== 値の範囲を指定する ===<br />
<syntaxhighlight lang="bash"><br />
$ jq '.[].age >= 20 ' b.json<br />
false<br />
true<br />
true<br />
</syntaxhighlight><br />
=== 必要なデータを取り出して、整形する ===<br />
<syntaxhighlight lang="bash"><br />
$ jq '.[]| "\(.name) is \(.age)"' b.json<br />
"foo is 10"<br />
"bar is 20"<br />
"hoge is 30"<br />
$ jq -r '.[]| "\(.name) is \(.age)"' b.json<br />
foo is 10<br />
bar is 20<br />
hoge is 30<br />
</syntaxhighlight><br />
== 配列の中身を取り出す ==<br />
=== dns.json ===<br />
以下の dns.json というファイルがあったとします。<br />
<syntaxhighlight lang="javascript"><br />
[<br />
{ "dns_names":["www.foo.com"] },<br />
{ "dns_names":["login.foo.com"] },<br />
{ "dns_names":["a.foo.com", "b.foo.com", "c.foo.com"] }<br />
]<br />
</syntaxhighlight><br />
=== 一番上の配列を取り外す ===<br />
<syntaxhighlight lang="bash"><br />
$ jq '.[]' dns.json<br />
{<br />
"dns_names": [<br />
"www.foo.com"<br />
]<br />
}<br />
{<br />
"dns_names": [<br />
"login.foo.com"<br />
]<br />
}<br />
{<br />
"dns_names": [<br />
"a.foo.com",<br />
"b.foo.com",<br />
"c.foo.com"<br />
]<br />
}<br />
</syntaxhighlight><br />
=== キーを指定して取り出す ===<br />
まだ、配列として、取り出されています。<br />
<syntaxhighlight lang="bash"><br />
$ jq '.[]|.["dns_names"]' dns.json<br />
[<br />
"www.foo.com"<br />
]<br />
[<br />
"login.foo.com"<br />
]<br />
[<br />
"a.foo.com",<br />
"b.foo.com",<br />
"c.foo.com"<br />
]<br />
</syntaxhighlight><br />
=== さらにかっこを外す ===<br />
<syntaxhighlight lang="bash"><br />
$ jq '.[]|.["dns_names"]|.[]' dns.json<br />
"www.foo.com"<br />
"login.foo.com"<br />
"a.foo.com"<br />
"b.foo.com"<br />
"c.foo.com"<br />
</syntaxhighlight><br />
=== ダブルクォートを外す ===<br />
-r オプションを使えば、ダブルクォートを外せます。<br />
<syntaxhighlight lang="bash"><br />
$ jq -r '.[]|.["dns_names"]|.[]' dns.json<br />
www.foo.com<br />
login.foo.com<br />
a.foo.com<br />
b.foo.com<br />
c.foo.com<br />
</syntaxhighlight><br />
<br />
== 2つのキーを取り出す ==<br />
=== dns.2json ===<br />
<syntaxhighlight lang="javascript"><br />
[<br />
{ "dns_names":["www.foo.com"], "issuer":"EV" },<br />
{ "dns_names":["login.foo.com"], "issuer":"EV" },<br />
{ "dns_names":["a.foo.com", "b.foo.com", "c.foo.com"], "issuer":"OV" }<br />
]<br />
</syntaxhighlight><br />
=== 2つのキーを取り出してみる ===<br />
dns_names と issuer を取り出してみます。<br />
"," (カンマ) を使うことで、複数の値を取り出すことが指定できます。<br />
<syntaxhighlight lang="bash"><br />
$ jq -r '.[]|."dns_names", ."issuer"' dns2.json<br />
[<br />
"www.foo.com"<br />
]<br />
EV<br />
[<br />
"login.foo.com"<br />
]<br />
EV<br />
[<br />
"a.foo.com",<br />
"b.foo.com",<br />
"c.foo.com"<br />
]<br />
OV<br />
</syntaxhighlight><br />
=== さらに配列のかぎかっこを外す ===<br />
さらに鍵かっこを dns_names の後ろに指定すると、かっこが外せます。ただ、このデータのままで使いやすいのか、という問題は残ってます。<br />
<syntaxhighlight lang="bash"><br />
$ jq -r '.[]|."dns_names"[], ."issuer"' dns2.json<br />
www.foo.com<br />
EV<br />
login.foo.com<br />
EV<br />
a.foo.com<br />
b.foo.com<br />
c.foo.com<br />
OV<br />
</syntaxhighlight><br />
=== 成形してみる ===<br />
これだと、何も変わってない。<br />
<syntaxhighlight lang="bash"><br />
$ jq -r '.[]| {dns_names: ."dns_names", issuer} ' dns2.json<br />
{<br />
"dns_names": [<br />
"www.foo.com"<br />
],<br />
"issuer": "EV"<br />
}<br />
{<br />
"dns_names": [<br />
"login.foo.com"<br />
],<br />
"issuer": "EV"<br />
}<br />
{<br />
"dns_names": [<br />
"a.foo.com",<br />
"b.foo.com",<br />
"c.foo.com"<br />
],<br />
"issuer": "OV"<br />
}<br />
</syntaxhighlight><br />
=== 配列を展開してみる ===<br />
dns_names の値は配列になっていて、1つ以上のFQDNが入っています。<br />
エントリごとに、 dns_names と issuer があります。<br />
dns_names の値は配列ですが、その1つ1つに対して、 issuer を入れる場合は、以下のように書くと、 a.foo.com, b.foo.com, c.foo.com が別々に展開されます。<br />
<syntaxhighlight lang="bash"><br />
$ jq -r '.[]| {dns_names: ."dns_names"[], issuer} ' dns2.json<br />
{<br />
"dns_names": "www.foo.com",<br />
"issuer": "EV"<br />
}<br />
{<br />
"dns_names": "login.foo.com",<br />
"issuer": "EV"<br />
}<br />
{<br />
"dns_names": "a.foo.com",<br />
"issuer": "OV"<br />
}<br />
{<br />
"dns_names": "b.foo.com",<br />
"issuer": "OV"<br />
}<br />
{<br />
"dns_names": "c.foo.com",<br />
"issuer": "OV"<br />
}<br />
</syntaxhighlight><br />
== 関連項目 ==<br />
* [[JavaScript開発環境]]<br />
<!-- vim: filetype=mediawiki<br />
--></div>
Daemon
https://kaworu.jpn.org/javascript/jslint
jslint
2014-09-07T15:06:26Z
<p>Daemon: ページの作成:「jslintとは、JavaScriptのlintプログラムで、JavaScriptのエラーと潜在的な問題を検出するプログラムです。ダグラス・クロックフ...」</p>
<hr />
<div>[[jslint]]とは、JavaScriptのlintプログラムで、JavaScriptのエラーと潜在的な問題を検出するプログラムです。ダグラス・クロックフォード氏によってメンテナンスされています。[[jshint]]は、[[jslint]]からフォークしました。<br />
<br />
'''読み方'''<br />
;[[jslint]]:じぇーえす りんと<br />
__TOC__<br />
<br />
== 概要 ==<br />
[[jslint]]は、ソースコードの品質管理のためのプログラムです。<br />
== インストール ==<br />
<syntaxhighlight lang="bash"><br />
$ sudo npm install -g jslint<br />
</syntaxhighlight><br />
== 使い方 ==<br />
=== コマンドラインオプション ===<br />
<syntaxhighlight lang="bash"><br />
Usage: /usr/local/bin/jslint [--anon] [--ass] [--bitwise] [--browser]<br />
[--closure] [--color] [--config] [--continue] [--debug] [--devel] [--edition]<br />
[--eqeq] [--es5] [--evil] [--forin] [--indent] [--json] [--maxerr] [--maxlen]<br />
[--newcap] [--node] [--nomen] [--on] [--passfail] [--plusplus] [--predef]<br />
[--properties] [--regexp] [--rhino] [--sloppy] [--stupid] [--sub] [--terse]<br />
[--todo] [--undef] [--unparam] [--vars] [--version] [--white] [--windows] [--]<br />
<scriptfile>...<br />
</syntaxhighlight><br />
=== 実行例 ===<br />
<syntaxhighlight lang="bash"><br />
$ jslint /tmp/*.js<br />
<br />
/tmp/a.js<br />
#1 'document' was used before it was defined.<br />
document.domain; // Line 7, Pos 1<br />
#2 'location' was used before it was defined.<br />
location.hostname; // Line 8, Pos 1<br />
[4] 30067 exit 1 jslint /tmp/*.js<br />
</syntaxhighlight><br />
== 関連項目 ==<br />
* [[jshint]]<br />
<!-- vim: filetype=mediawiki<br />
--></div>
Daemon
https://kaworu.jpn.org/javascript/jsdoc.vim
jsdoc.vim
2014-09-07T13:11:13Z
<p>Daemon: </p>
<hr />
<div>[[jsdoc.vim]]とは、[[JSDoc]]のブロックコメントジェネレータです。vimのドキュメント入力補完機能として使えます。<br />
<br />
'''読み方'''<br />
;[[jsdoc.vim]]:じゅーえす どっく ぶいあいえむ<br />
__TOC__<br />
<br />
== 概要 ==<br />
[[jsdoc.vim]]では、vimでJavaScriptプログラミングをしているときに、[[JSDoc]]形式のコメントの入力補完ができます。<br />
== .vimrc ==<br />
vimの設定ファイル .vimrc を設定します。以下は、NeoBundle用の設定です。<br />
<syntaxhighlight lang="vim"><br />
NeoBundle 'heavenshell/vim-jsdoc'<br />
</syntaxhighlight><br />
<br />
=== デフォルトのキーマッピングを変更する ===<br />
デフォルトのキーマッピングがC-l(C-L)という(困る方には)困ったマッピングです。<br />
<br />
以下の設定をすることで、C-l以外のマッピングを自分で設定できます。<br />
<syntaxhighlight lang="vim"><br />
let g:jsdoc_default_mapping = 0<br />
nnoremap <silent> <C-J> :JsDoc<CR><br />
</syntaxhighlight><br />
== 使い方 ==<br />
コメントを入力したい関数定義の直前などで C-l (コントロール エル)を押すとコメントが自動的に挿入されます。<br />
<br />
例えば、今、カーソルが18行目にあるとします。<br />
<syntaxhighlight lang="javascript"><br />
18<br />
19 function square(a) {<br />
20 return a*a;<br />
21 }<br />
</syntaxhighlight><br />
ここで、C-l を押します。<br />
<br />
このように展開されます。<br />
<syntaxhighlight lang="bash"><br />
18 /**<br />
19 *<br />
20 *<br />
21 * @return {undefined}<br />
22 */<br />
23<br />
24 function square(a) {<br />
25 return a*a;<br />
26 }<br />
</syntaxhighlight><br />
== 関連項目 ==<br />
{{jsdoc}}<br />
<!-- vim: filetype=mediawiki<br />
--></div>
Daemon
https://kaworu.jpn.org/javascript/JSDoc
JSDoc
2014-09-07T12:59:05Z
<p>Daemon: /* 関連項目 */</p>
<hr />
<div>[[JSDoc]]とは、JavaScriptのためのAPIドキュメントジェネレータです。Doxygenとか、その類のツールです。jsdocコマンドを用いて、HTMLドキュメントを生成します。現在は、JSDoc 3が開発されています。<br />
<br />
'''読み方'''<br />
;[[JSDoc]]:じゅーえす どっく<br />
__TOC__<br />
<br />
== 概要 ==<br />
いくつものテンプレートが提供されているので、オシャレなドキュメントが簡単に作成できます。<br />
== インストール ==<br />
jsdocをインストールします。jsdocコマンドがインストールされます。<br />
<syntaxhighlight lang="bash"><br />
$ sudo npm install -g jsdoc<br />
</syntaxhighlight><br />
<br />
== 使用方法 ==<br />
=== ソースコード ===<br />
ソースコードにJSDocの記法でドキュメントを記載します。<br />
<syntaxhighlight lang="javascript"><br />
/*<br />
* calc.js<br />
* Copyright (C) 2014 kaoru <kaoru@bsd><br />
*/<br />
<br />
/**<br />
* Return the sum of a and b.<br />
* @param {Number} a 1st number.<br />
* @param {Number} b 2nd number.<br />
* @returns {Number} Sum of number.<br />
*/<br />
function sum(a,b) {<br />
return a+b;<br />
}<br />
</syntaxhighlight><br />
=== ドキュメントの生成 ===<br />
jsdocコマンドを用いて、ドキュメントを作成します。<br />
<syntaxhighlight lang="bash"><br />
$ jsdoc calc.js<br />
</syntaxhighlight><br />
自動的に、out というディレクトリが作成され、その中にドキュメントが生成されます。<br />
<br />
以下、w3mで表示したページです。<br />
<pre><br />
Global<br />
<br />
Methods<br />
<br />
sum(a, b) → {Number}<br />
<br />
Return the sum of a and b.<br />
<br />
Parameters:<br />
<br />
Name Type Description<br />
a Number 1st number.<br />
b Number 2nd number.<br />
<br />
Source:<br />
☆ calc.js, line 15<br />
<br />
Returns:<br />
<br />
Sum of number.<br />
<br />
Type<br />
Number<br />
<br />
Index<br />
<br />
Global<br />
<br />
• sum<br />
<br />
<br />
Documentation generated by JSDoc 3.3.0-alpha9 on Sun Sep 07 2014 21:54:19<br />
GMT+0900 (JST)<br />
</pre><br />
<br />
== 使い方 ==<br />
=== コマンドラインオプション ===<br />
<syntaxhighlight lang="bash"><br />
JSDoc 3.3.0-alpha9 (Sat, 28 Jun 2014 15:26:03 GMT)<br />
<br />
Options:<br />
-t, --template <value> The path to the template to use. Default:<br />
path/to/jsdoc/templates/default<br />
-c, --configure <value> The path to the configuration file.<br />
Default: path/to/jsdoc/conf.json<br />
-e, --encoding <value> Assume this encoding when reading all<br />
source files. Default: utf8<br />
-T, --test Run all tests and quit.<br />
-d, --destination <value> The path to the output folder. Use<br />
"console" to dump data to the console.<br />
Default: ./out/<br />
-p, --private Display symbols marked with the @private<br />
tag. Default: false<br />
-r, --recurse Recurse into subdirectories when scanning<br />
for source code files.<br />
-h, --help Print this message and quit.<br />
-X, --explain Dump all found doclet internals to console<br />
and quit.<br />
-q, --query <value> A query string to parse and store in<br />
env.opts.query. Example: foo=bar&baz=true<br />
-u, --tutorials <value> Directory in which JSDoc should search for<br />
tutorials.<br />
-v, --version Display the version number and quit.<br />
--debug Log information for debugging JSDoc. On<br />
Rhino, launches the debugger when passed as<br />
the first option.<br />
--verbose Log detailed information to the console as<br />
JSDoc runs.<br />
--pedantic Treat errors as fatal errors, and treat<br />
warnings as errors. Default: false<br />
--match <value> Only run tests containing <value>.<br />
--nocolor Do not use color in console output from<br />
tests.<br />
<br />
Visit http://usejsdoc.org for more information.<br />
</syntaxhighlight><br />
<br />
== 関連項目 ==<br />
{{jsdoc}}<br />
<!-- vim: filetype=mediawiki<br />
--></div>
Daemon
https://kaworu.jpn.org/javascript/zlibber
zlibber
2014-09-07T07:22:22Z
<p>Daemon: ページの作成:「zlibberとは、defalte, inflateコマンドを提供するnode.jsのnpmパッケージです。 '''読み方''' ;zlibber:ぜっとりばー __TOC__ == ...」</p>
<hr />
<div>[[zlibber]]とは、defalte, inflateコマンドを提供する[[node.js]]の[[npm]]パッケージです。<br />
<br />
'''読み方'''<br />
;[[zlibber]]:ぜっとりばー<br />
__TOC__<br />
<br />
== 概要 ==<br />
[[zlibber]]は、標準入力から読み込んだデータを zlibを使用して、defalte形式で圧縮、解凍します。<br />
== 使い方 ==<br />
=== 圧縮 ===<br />
<syntaxhighlight lang="bash"><br />
$ echo hoge | deflate > hoge.deflate<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang="bash"><br />
$ echo hoge | deflate > hoge.deflate<br />
$ file hoge.deflate<br />
hoge.deflate: data<br />
$ hexdump -C hoge.deflate<br />
00000000 78 9c cb c8 4f 4f e5 02 00 05 d2 01 ae |x...OO.......|<br />
0000000d<br />
</syntaxhighlight><br />
=== 解凍 ===<br />
<syntaxhighlight lang="bash"><br />
$ inflate < hoge.deflate<br />
$ echo hoge | deflate | inflate<br />
hoge<br />
</syntaxhighlight><br />
== 関連項目 ==<br />
* [[node.js HTTPサーバでレスポンスをgzipやdeflateで圧縮する]]<br />
<!-- vim: filetype=mediawiki<br />
--></div>
Daemon
https://kaworu.jpn.org/javascript/node.js_HTTP%E3%82%B5%E3%83%BC%E3%83%90%E3%81%A7%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9%E3%82%92gzip%E3%82%84deflate%E3%81%A7%E5%9C%A7%E7%B8%AE%E3%81%99%E3%82%8B
node.js HTTPサーバでレスポンスをgzipやdeflateで圧縮する
2014-09-07T07:13:20Z
<p>Daemon: ページの作成:「HTTPサーバ(ウェブサーバ)では、HTTPレスポンスを圧縮して、データ送信量を減らし、通信を速く終わらせることができます。no...」</p>
<hr />
<div>HTTPサーバ(ウェブサーバ)では、HTTPレスポンスを圧縮して、データ送信量を減らし、通信を速く終わらせることができます。[[node.js]]のHTTPサーバ(ウェブサーバ)では、zlibを利用して、gzipやdeflateでHTTPレスポンスを圧縮できます<br />
<br />
'''読み方'''<br />
;zlib:ぜっと りぶ<br />
;gzip:じーじっぷ<br />
;deflate:でふれいと<br />
__TOC__<br />
<br />
== 概要 ==<br />
HTTPサーバでレスポンスを圧縮することで、通信コストを下げることができます。データ量が小さくなれば、それだけ、データが速く、クライアントに到達します。サーバ側のOSとしては、速く、ネットワークのバッファをネットワークに送信できるので、OSリソースがその分、節約できます。<br />
<br />
しかしながら、データを圧縮するには、CPUのコストを支払わなければなりません。負荷が上がってきたとき、必ずしもデータを圧縮するのが正しいとはいえない状況がでてくるかもしれません。また、圧縮に向かないデータもあるでしょう。たとえば、すでに圧縮されてしまっている画像データや音声データ(mp3)などです。<br />
<br />
圧縮するべきか、よく考えて、レスポンスを操作するべきです。ある程度のサイズのテキストのデータであれば、圧縮の恩恵が受けやすいので基本的に圧縮してしまうのがよいでしょう。<br />
== ソースコード node http_zlib1.js==<br />
<syntaxhighlight lang="javascript"><br />
/*<br />
* http_zlib1.js<br />
* Copyright (C) 2014 kaoru <kaoru@bsd><br />
*/<br />
var zlib = require('zlib');<br />
var http = require('http');<br />
var server = http.createServer();<br />
<br />
server.on('request', doRequest);<br />
server.listen(8080);<br />
<br />
function doRequest(req, res) {<br />
var acceptEncoding = req.headers['accept-encoding'];<br />
if (! acceptEncoding ) {<br />
acceptEncoding = '';<br />
}<br />
<br />
var output = 'Hello World\n';<br />
var buf;<br />
console.log(acceptEncoding);<br />
<br />
if (acceptEncoding.match(/\bdeflate\b/)) {<br />
res.writeHead(200, {'Content-Type': 'text/plain', 'content-encoding': 'deflate'});<br />
buf = new Buffer(output, 'utf-8');<br />
zlib.deflate(buf, function(_, result){<br />
//console.log(result);<br />
res.end(result);<br />
});<br />
console.log('response is deflate');<br />
} else if (acceptEncoding.match(/\bgzip\b/)) {<br />
res.writeHead(200, {'Content-Type': 'text/plain', 'content-encoding': 'gzip'});<br />
buf = new Buffer(output, 'utf-8');<br />
zlib.gzip(buf, function(_, result){<br />
res.end(result);<br />
});<br />
console.log('response is gzip');<br />
} else {<br />
res.writeHead(200, {'Content-Type': 'text/plain'});<br />
res.end(output);<br />
console.log('response is text');<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
== 実行例 ==<br />
=== HTTPサーバを起動 ===<br />
<syntaxhighlight lang="bash"><br />
node http_zlib1.js<br />
</syntaxhighlight><br />
== 使い方 ==<br />
curlコマンドでは、デフォルトでは、Accept-Encodingを指定しないので、HTTPレスポンスは圧縮されません。<br />
そこで、圧縮を受け付けますよ、と宣言するために、HTTPリクエストヘッダに Accept-Encodingを指定します。<br />
<br />
コマンドラインの例は、以下の通りです。<br />
<syntaxhighlight lang="bash"><br />
$ curl -s -H 'Accept-Encoding: gzip,deflate' 'http://localhost:8080/'<br />
</syntaxhighlight><br />
圧縮されたレスポンスは、人の目では、なんだかわかりません。そこで、ここではパイプでつないで、解凍します。<br />
<br />
deflateで圧縮されたコンテンツは、zlibberのinflateで解凍できます。<br />
<syntaxhighlight lang="bash"><br />
$ curl -s -H 'Accept-Encoding: gzip,deflate' 'http://localhost:8080/' \<br />
| inflate<br />
Hello World<br />
</syntaxhighlight><br />
<br />
Accept-Encodingにgzip,deflateの両方を指定すると、上記のプログラムは、必ず、deflateになってしまうので、gzipだけにして、レスポンスがgunzipで解凍できるか、試してみます。<br />
<syntaxhighlight lang="bash"><br />
$ curl -s -H 'Accept-Encoding: gzip' 'http://localhost:8080/' | gunzip<br />
Hello World<br />
</syntaxhighlight><br />
== zlibber ==<br />
inflateコマンドが入ってない場合は、[[zlibber]]をインストールします。<br />
<syntaxhighlight lang="bash"><br />
$ sudo npm install -g zlibber<br />
</syntaxhighlight><br />
== 関連項目 ==<br />
{{node http server}}<br />
* [[zlibber]]<br />
<!-- vim: filetype=mediawiki<br />
--></div>
Daemon
https://kaworu.jpn.org/javascript/node.js_HTTP%E3%82%B5%E3%83%BC%E3%83%90%E3%81%A7Apache%E3%83%A9%E3%82%A4%E3%82%AF%E3%81%AA%E3%83%AD%E3%82%B0%E3%82%92%E8%A8%98%E9%8C%B2%E3%81%99%E3%82%8B
node.js HTTPサーバでApacheライクなログを記録する
2014-09-07T05:54:31Z
<p>Daemon: ページの作成:「node.jsのHTTPサーバ(ウェブサーバ)は、httpモジュール/foreverなどで簡単に作成できます。ただし、httpだけでは、アクセスログ...」</p>
<hr />
<div>[[node.js]]のHTTPサーバ(ウェブサーバ)は、httpモジュール/foreverなどで簡単に作成できます。ただし、httpだけでは、アクセスログが記録されません。apache-logと呼ばれるモジュールを利用するとApacheライクなログを出力できます。<br />
<br />
'''読み方'''<br />
;apache-log:あぱっち ろぐ<br />
__TOC__<br />
<br />
== 概要 ==<br />
apache-log は、デフォルトでは、 /var/log/access.log にアクセスログを記録します。<br />
== apache-log ==<br />
[[node.js]]のapache-logモジュールは、[[node.js]]のためのApacheのCLF(Common Log Format)でアクセスをロギングするためのミドルウェアです。<br />
== インストール ==<br />
<syntaxhighlight lang="bash"><br />
$ sudo npm install -g apache-log<br />
</syntaxhighlight><br />
<br />
== apache-logを使用したロギング ==<br />
=== ソースコード http_apache-log1.js ===<br />
<syntaxhighlight lang="javascript"><br />
/*<br />
* http_apache-log1.js<br />
* Copyright (C) 2014 kaoru <kaoru@bsd><br />
*/<br />
//var apache_log = require('apache-log');<br />
var apache_log = require('/usr/local/lib/node_modules/apache-log/lib/apache-log.js');<br />
var http = require('http');<br />
var server = http.createServer();<br />
<br />
server.on('request', doRequest);<br />
server.listen(8080);<br />
<br />
function doRequest(req, res) {<br />
apache_log.logger(req,res);<br />
res.writeHead(200, {'Content-Type': 'text/plain'});<br />
res.write('Hello World\n');<br />
res.end();<br />
}<br />
</syntaxhighlight><br />
=== 実行方法 ===<br />
ウェブサーバを起動します。<br />
<syntaxhighlight lang="bash"><br />
$ sudo node http_apache-log1.js<br />
</syntaxhighlight><br />
<br />
コマンドラインでウェブサーバにアクセスします。<br />
<syntaxhighlight lang="bash"><br />
$ curl http://localhost:8080/<br />
Hello World<br />
$ $ curl 'http://localhost:8080/?foo=bar&hoge=meta'<br />
Hello World<br />
</syntaxhighlight><br />
<br />
以下、アクセスログです。<br />
<syntaxhighlight lang="bash"><br />
$ tail -f /var/log/access.log<br />
127.0.0.1 - - [07/Sep/2014:05:42:10 +0000] "GET / HTTP/1.1" 200 - "-" "curl/7.36.0"<br />
127.0.0.1 - - [07/Sep/2014:05:50:24 +0000] "GET /?foo=bar&hoge=meta HTTP/1.1" 200 - "-" "curl/7.36.0"<br />
</syntaxhighlight><br />
このように簡単にApacheライクなアクセスログを記録できました。<br />
== 関連項目 ==<br />
{{node http server}}<br />
<!-- vim: filetype=mediawiki<br />
--></div>
Daemon
https://kaworu.jpn.org/javascript/node.js_forever%E3%81%A7HTTP%E3%82%B5%E3%83%BC%E3%83%90%E3%82%92%E3%83%87%E3%83%BC%E3%83%A2%E3%83%B3%E5%8C%96%E3%81%99%E3%82%8B
node.js foreverでHTTPサーバをデーモン化する
2014-09-07T05:07:13Z
<p>Daemon: ページの作成:「HTTPサーバ/HTTPサーバ(SPDYを含む)の例を紹介してきましたが、それぞれデーモン化されているわけではありませんでした。node.j...」</p>
<hr />
<div>HTTPサーバ/HTTPサーバ(SPDYを含む)の例を紹介してきましたが、それぞれデーモン化されているわけではありませんでした。[[node.js]]では、プログラムのデーモン化の方法がいくつかありますが、ここでは、foreverを利用してモジュール化する方法を説明します。<br />
<br />
'''読み方'''<br />
;forever:ふぉーえばー<br />
__TOC__<br />
<br />
== 概要 ==<br />
foreverでは、以下のプログラムをデーモン化できます。<br />
* [[node.jsによるHTTPサーバの作り方]]<br />
* [[node.jsによるHTTPSサーバの作り方]]<br />
* [[node.jsでSPDY対応ウェブサーバ]]<br />
<br />
HTTPサーバ(ウェブサーバ)を以下のようなコマンドラインで起動した場合、端末からログアウトできない、http.jsがエラーで落ちた時に、サービスの継続性が失われる、といった問題があります。<br />
<syntaxhighlight lang="bash"><br />
$ node http.js<br />
</syntaxhighlight><br />
<br />
foreverでは、上記の問題を解決するため、プログラムのデーモン化やサービスが落ちたときに自動再起動などの機能を提供します。実際に、プログラムがデーモン化されるのではなく、foreverがデーモン化して、サービスを起動することになります。<br />
<br />
foreverの詳細については、[[node.js foreverによるデーモン化]]をご参照ください。<br />
== インストール ==<br />
事前準備として[[npm]]コマンドでforeverモジュールをインストールします。<br />
<syntaxhighlight lang="bash"><br />
$ sudo npm install -g forever<br />
</syntaxhighlight><br />
<br />
== ソースコード http.js ==<br />
ここでは、HTTPサーバを例にとって説明します。<br />
<syntaxhighlight lang="javascript"><br />
var http = require('http');<br />
var server = http.createServer();<br />
<br />
server.on('request', doRequest);<br />
server.listen(8080);<br />
<br />
function doRequest(req, res) {<br />
res.writeHead(200, {'Content-Type': 'text/plain'});<br />
res.write('Hello World\n');<br />
res.end();<br />
}<br />
</syntaxhighlight><br />
== 実行例 ==<br />
foreverのスタート、ストップ、リスタートは、以下の通りです。<br />
<syntaxhighlight lang="bash"><br />
$ forever start http.js<br />
$ forever stop http.js<br />
$ forever restart http.js<br />
</syntaxhighlight><br />
== 関連項目 ==<br />
{{node http server}}<br />
* [[node.js foreverによるデーモン化]]<br />
<!-- vim: filetype=mediawiki<br />
--></div>
Daemon
https://kaworu.jpn.org/javascript/node.js%E3%81%A7%E9%96%A2%E6%95%B0%E3%82%92export%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95
node.jsで関数をexportする方法
2014-09-07T04:45:28Z
<p>Daemon: </p>
<hr />
<div>[[node.js]]では、モジュールをrequire()で読み込み、他のファイルなどに定義されたを関数/[[オブジェクト]]を利用できます。<br />
<br />
'''読み方'''<br />
;require:りくわいあ<br />
__TOC__<br />
<br />
== 概要 ==<br />
プログラムは、コードを読みやすく、管理しやすく、といった目的で、目的別、関数別などでディレクトリやソースコードをわけて管理します。<br />
[[node.js]]では、モジュールとしてまとめていきます。<br />
<br />
外部のファイルに定義されたオブジェクトや関数を利用するには、定義されているモジュールをrequire()します。外部に公開する関数をmodule.exportsとして定義します。<br />
<br />
また、[[オブジェクト]]を複数公開するには、外部に公開する[[オブジェクト]]は、module.exports のプロパティとして定義します。詳しくは、[[node.jsでオブジェクトをexportする方法]]をご参照ください。<br />
<br />
== ソースコード ==<br />
=== exportする関数 add.js ===<br />
<syntaxhighlight lang="javascript"><br />
/*<br />
* add.js<br />
* Copyright (C) 2014 kaoru <kaoru@bsd><br />
*/<br />
module.exports = function(a,b){<br />
return a + b;<br />
};<br />
</syntaxhighlight><br />
=== exportされた関数を利用する ===<br />
<syntaxhighlight lang="javascript"><br />
/*<br />
* main_add.js<br />
* Copyright (C) 2014 kaoru <kaoru@bsd><br />
*/<br />
var add = require('./add.js');<br />
console.log(add(10,5));<br />
</syntaxhighlight><br />
== 実行例 ==<br />
<syntaxhighlight lang="bash"><br />
$ node main_add.js<br />
15<br />
</syntaxhighlight><br />
== 関連項目 ==<br />
* [[node.jsでオブジェクトをexportする方法]]<br />
* [[node.jsとブラウザでコードを共有する方法]]<br />
* [[メインページ]]<br />
<!-- vim: filetype=mediawiki<br />
--></div>
Daemon
https://kaworu.jpn.org/javascript/node.js%E3%81%A7%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92export%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95
node.jsでオブジェクトをexportする方法
2014-09-07T04:17:25Z
<p>Daemon: </p>
<hr />
<div>[[node.js]]では、モジュールをrequire()で読み込み、他のファイルなどに定義されたをオブジェクトを利用できます。<br />
<br />
'''読み方'''<br />
;require:りくわいあ<br />
__TOC__<br />
<br />
== 概要 ==<br />
プログラムは、コードを読みやすく、管理しやすく、といった目的で、目的別、関数別などでディレクトリやソースコードをわけて管理します。<br />
<br />
[[node.js]]では、モジュールとしてまとめていきます。<br />
<br />
外部のファイルに定義されたオブジェクトや関数を利用するには、定義されているモジュールをrequire()します。外部に公開する[[オブジェクト]]は、module.exports のプロパティとして定義します。<br />
<br />
== ソースコード ==<br />
=== exportするオブジェクト calc.js ===<br />
<syntaxhighlight lang="javascript"><br />
/*<br />
* calc.js<br />
* Copyright (C) 2014 kaoru <kaoru@bsd><br />
*/<br />
module.exports.add = function (a,b) {<br />
return a + b;<br />
};<br />
<br />
module.exports.square = function (a) {<br />
return a * a;<br />
};<br />
<br />
module.exports.cube = function (a) {<br />
return a * a * a;<br />
};<br />
</syntaxhighlight><br />
=== exportされたオブジェクトを利用する ===<br />
<syntaxhighlight lang="javascript"><br />
/*<br />
* main_calc.js<br />
* Copyright (C) 2014 kaoru <kaoru@bsd><br />
*/<br />
var calc = require('./calc.js');<br />
console.log(calc.add(1,3));<br />
console.log(calc.square(3));<br />
</syntaxhighlight><br />
== 実行例 ==<br />
<syntaxhighlight lang="bash"><br />
$ node main_calc.js<br />
4<br />
9<br />
</syntaxhighlight><br />
== 関連項目 ==<br />
* [[node.jsで関数をexportする方法]]<br />
* [[node.jsとブラウザでコードを共有する方法]]<br />
* [[メインページ]]<br />
<!-- vim: filetype=mediawiki<br />
--></div>
Daemon
https://kaworu.jpn.org/javascript/node
node
2014-09-07T02:03:14Z
<p>Daemon: ページの作成:「nodeとは、node.jsのコマンドです。つまり、JavaScriptの処理系です。プログラムはV8 JavaScriptエンジンで実行されます。 '''読...」</p>
<hr />
<div>[[node]]とは、[[node.js]]のコマンドです。つまり、JavaScriptの処理系です。プログラムはV8 JavaScriptエンジンで実行されます。<br />
<br />
'''読み方'''<br />
;[[node]]:のーど<br />
__TOC__<br />
<br />
== 概要 ==<br />
[[node]]コマンドは、スクリプトファイルを指定するか、コマンドラインの引数としてワンライナープログラムを指定する方法で、プログラムを実行できます。<br />
スクリプトファイルを実行する例です。<br />
<syntaxhighlight lang="bash"><br />
$ node main.js<br />
</syntaxhighlight><br />
ワンライナープログラムの例です。<br />
<syntaxhighlight lang="bash"><br />
$ node -e "console.log('Hello, World');"<br />
Hello, World<br />
</syntaxhighlight><br />
ワンライナーの詳細については、[[node.jsにおけるワンライナーの使い方]]をご参照ください。<br />
== インストール ==<br />
[[node.jsのインストール]]をご参照ください。<br />
== コマンドラインオプション ==<br />
<syntaxhighlight lang="bash"><br />
Usage: node [options] [ -e script | script.js ] [arguments]<br />
node debug script.js [arguments]<br />
<br />
Options:<br />
-v, --version print node's version<br />
-e, --eval script evaluate script<br />
-p, --print evaluate script and print result<br />
-i, --interactive always enter the REPL even if stdin<br />
does not appear to be a terminal<br />
--no-deprecation silence deprecation warnings<br />
--trace-deprecation show stack traces on deprecations<br />
--v8-options print v8 command line options<br />
--max-stack-size=val set max v8 stack size (bytes)<br />
<br />
Environment variables:<br />
NODE_PATH ':'-separated list of directories<br />
prefixed to the module search path.<br />
NODE_MODULE_CONTEXTS Set to 1 to load modules in their own<br />
global contexts.<br />
NODE_DISABLE_COLORS Set to 1 to disable colors in the REPL<br />
<br />
Documentation can be found at http://nodejs.org/<br />
</syntaxhighlight><br />
== 関連項目 ==<br />
{{node basic}}<br />
<!-- vim: filetype=mediawiki<br />
--></div>
Daemon
https://kaworu.jpn.org/javascript/node.js%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%83%AF%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%8A%E3%83%BC%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9
node.jsにおけるワンライナーの使い方
2014-09-07T01:54:37Z
<p>Daemon: ページの作成:「スクリプト言語の処理系の引数に実行したい短いプログラムを指定して、コマンドラインでプログラムを実行できます。1行...」</p>
<hr />
<div>スクリプト言語の処理系の引数に実行したい短いプログラムを指定して、コマンドラインでプログラムを実行できます。1行程度のごく短いプログラムです。[[node.js]]では、[[node]]コマンドの引数に直接プログラムを渡して実行できます。<br />
<br />
'''読み方'''<br />
;ワンライナー:わん らいなー<br />
;One Liner:わん らいなー<br />
<br />
__TOC__<br />
<br />
== 概要 ==<br />
ワンライナープログラムのメリットは、ファイルを作成せずに、プログラムがすぐに実行できることです。[[node]]コマンドは、引数にスクリプトファイル(.js)を指定してプログラムを実行できますが、-eオプションでダイレクトに命令を渡すこともできます。<br />
<syntaxhighlight lang="bash"><br />
$ node -e "expression;"<br />
</syntaxhighlight><br />
== 使い方 ==<br />
[[node]]でのワンライナープログラムの実行方法は、[[node]]コマンドに-eオプションを使って、実行したいプログラムを記述します。<br />
<syntaxhighlight lang="bash"><br />
$ node -e "var i = 1; i = i + 1999; console.log(i);"<br />
2000<br />
</syntaxhighlight><br />
== 関連項目 ==<br />
{{node basic}}<br />
<!-- vim: filetype=mediawiki<br />
--></div>
Daemon
https://kaworu.jpn.org/javascript/mocha
mocha
2014-09-06T17:02:11Z
<p>Daemon: </p>
<hr />
<div>[[mocha]]とは、JavaScriptの単体テストで利用されるユニットテストフレームワークです。<br />
<br />
'''読み方'''<br />
;[[mocha]]:もか<br />
__TOC__<br />
<br />
== 概要 ==<br />
== インストール ==<br />
<syntaxhighlight lang="bash"><br />
$ sudo npm install -g mocha<br />
</syntaxhighlight><br />
== コマンド ==<br />
=== コマンドラインオプション ===<br />
[[mocha]]コマンドのコマンドラインオプションは、以下の通りです。<br />
<syntaxhighlight lang="bash"><br />
Usage: _mocha [debug] [options] [files]<br />
<br />
Commands:<br />
<br />
init <path> initialize a client-side mocha setup at <path><br />
<br />
Options:<br />
<br />
-h, --help output usage information<br />
-V, --version output the version number<br />
-A, --async-only force all tests to take a callback (async)<br />
-c, --colors force enabling of colors<br />
-C, --no-colors force disabling of colors<br />
-G, --growl enable growl notification support<br />
-R, --reporter <name> specify the reporter to use<br />
-S, --sort sort test files<br />
-b, --bail bail after first test failure<br />
-d, --debug enable node's debugger, synonym for node --debug<br />
-g, --grep <pattern> only run tests matching <pattern><br />
-gc --expose-gc<br />
-i, --invert inverts --grep matches<br />
-r, --require <name> require the given module<br />
-s, --slow <ms> "slow" test threshold in milliseconds [75]<br />
-t, --timeout <ms> set test-case timeout in milliseconds [2000]<br />
-u, --ui <name> specify user-interface (bdd|tdd|exports)<br />
-w, --watch watch files for changes<br />
--check-leaks check for global variable leaks<br />
--compilers <ext>:<module>,... use the given module(s) to compile files<br />
--debug-brk enable node's debugger breaking on the first line<br />
--globals <names> allow the given comma-delimited global [names]<br />
--harmony enable all harmony features (except typeof)<br />
--harmony-collections enable harmony collections (sets, maps, and weak maps)<br />
--harmony-generators enable harmony generators<br />
--harmony-proxies enable harmony proxies<br />
--inline-diffs display actual/expected differences inline within each string<br />
--interfaces display available interfaces<br />
--no-deprecation silence deprecation warnings<br />
--no-exit require a clean shutdown of the event loop: mocha will not call process.exit<br />
--no-timeouts disables timeouts, given implicitly with --debug<br />
--opts <path> specify opts path<br />
--prof log statistical profiling information<br />
--recursive include sub directories<br />
--reporters display available reporters<br />
--throw-deprecation throw an exception anytime a deprecated function is used<br />
--trace trace function calls<br />
--trace-deprecation show stack traces on deprecations<br />
--watch-extensions <ext>,... additional extensions to monitor with --watch<br />
</syntaxhighlight><br />
=== 単体テストを実行する ===<br />
<syntaxhighlight lang="bash"><br />
$ mocha test.js<br />
</syntaxhighlight><br />
=== ファイルを監視し、変更されたら自動的に単体テストを実行する ===<br />
テストが自動的に実行されるため、すぐにおかしいところに気づけます。<br />
<syntaxhighlight lang="bash"><br />
$ mocha -w test.js<br />
</syntaxhighlight><br />
== 簡単な利用例 ==<br />
=== calc.js ===<br />
<syntaxhighlight lang="javascript"><br />
/*<br />
* calc.js<br />
* Copyright (C) 2014 kaoru <kaoru@bsd><br />
*/<br />
module.exports.add = function (a,b) {<br />
return a + b;<br />
};<br />
<br />
module.exports.square = function (a) {<br />
return a * a;<br />
};<br />
<br />
module.exports.cube = function (a) {<br />
return a * a * a;<br />
};<br />
</syntaxhighlight><br />
=== test_calc.js ===<br />
<syntaxhighlight lang="javascript"><br />
/*<br />
* test_calc.js<br />
* Copyright (C) 2014 kaoru <kaoru@bsd><br />
*/<br />
var assert = require('assert');<br />
var myfuncs = require('./calc.js');<br />
<br />
describe('myfuncs', function() {<br />
describe('add', function() {<br />
it ('第1引数と第2引数を足した結果を返す', function() {<br />
assert.equal(myfuncs.add(1,2), 3);<br />
});<br />
});<br />
describe('square', function() {<br />
it ('2乗した結果を返す', function() {<br />
assert.equal(myfuncs.square(2), 4);<br />
});<br />
});<br />
describe('cube', function() {<br />
it ('3乗した結果を返す', function() {<br />
assert.equal(myfuncs.cube(2), 8);<br />
});<br />
});<br />
});<br />
</syntaxhighlight><br />
=== 実行例 ===<br />
正常にテストが終了した場合の例です。<br />
<syntaxhighlight lang="bash"><br />
$ mocha test_calc.js<br />
<br />
<br />
myfuncs<br />
add<br />
✓ 第1引数と第2引数を足した結果を返す<br />
square<br />
✓ 2乗した結果を返す<br />
cube<br />
✓ 3乗した結果を返す<br />
<br />
<br />
3 passing (34ms)<br />
<br />
</syntaxhighlight><br />
== 関連項目 ==<br />
* [[ユニットテストフレームワーク]]<br />
<!-- vim: filetype=mediawiki<br />
--></div>
Daemon
https://kaworu.jpn.org/javascript/%E3%83%A6%E3%83%8B%E3%83%83%E3%83%88%E3%83%86%E3%82%B9%E3%83%88%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF
ユニットテストフレームワーク
2014-09-06T16:58:35Z
<p>Daemon: ページの作成:「ユニットテストフレームワークとは、 '''読み方''' ;ユニットテストフレームワーク:ゆにっとてすとふれーむわーく __TOC_...」</p>
<hr />
<div>[[ユニットテストフレームワーク]]とは、<br />
<br />
'''読み方'''<br />
;[[ユニットテストフレームワーク]]:ゆにっとてすとふれーむわーく<br />
__TOC__<br />
<br />
== 概要 ==<br />
* [[mocha]]<br />
<br />
== 関連項目 ==<br />
<br />
<!-- vim: filetype=mediawiki<br />
--></div>
Daemon
https://kaworu.jpn.org/javascript/socket.io
socket.io
2014-09-06T16:58:03Z
<p>Daemon: ページの作成:「socket.ioとは、node.jsのnpmとして提供されているWebSocketを扱うモジュールです。リアルタイムアプリケーションのため...」</p>
<hr />
<div>[[socket.io]]とは、[[node.js]]の[[npm]]として提供されている[[WebSocket]]を扱うモジュールです。リアルタイムアプリケーションのためのクロスブラウザWebSocketです。<br />
<br />
'''読み方'''<br />
;[[socket.io]]:そけっと あいおー<br />
__TOC__<br />
<br />
== 概要 ==<br />
<br />
== インストール ==<br />
<syntaxhighlight lang="bash"><br />
$ sudo npm install -g socket.io<br />
</syntaxhighlight><br />
== 実行例 ==<br />
== 使い方 ==<br />
== 関連項目 ==<br />
* [[WebSocket]]<br />
<!-- vim: filetype=mediawiki<br />
--></div>
Daemon
https://kaworu.jpn.org/javascript/wscat
wscat
2014-09-06T11:00:46Z
<p>Daemon: </p>
<hr />
<div>[[node.js]]の[[ws]]は、[[npm]]パッケージとして提供される[[WebSocket]]ライブラリです。[[WebSocket]]の実装を簡単に実現できます。[[ws]]パッケージで提供される[[wscat]]は、netcat(ncat,nc)ライクなコマンドです<br />
<br />
'''読み方'''<br />
;[[wscat]]:えぶりゅえす きゃっと<br />
__TOC__<br />
<br />
== 概要 ==<br />
[[node.js]]の[[ws]]は、[[npm]]パッケージとして提供される[[WebSocket]]ライブラリです。[[WebSocket]]の実装を簡単に実現できます。[[ws]]パッケージで提供される[[wscat]]は、netcat(ncat,nc)ライクなコマンドです。サーバモードとクライアントモードを持っています。[[WebSocket]]サーバやクライアントを実装するときのデバッグやテストに利用できます。<br />
<br />
== 実行例 ==<br />
=== コマンドラインオプション ===<br />
<syntaxhighlight lang="bash"><br />
Usage: wscat [options] <url><br />
<br />
Options:<br />
<br />
-h, --help output usage information<br />
-V, --version output the version number<br />
-l, --listen <port> listen on port<br />
-c, --connect <url> connect to a websocket server<br />
-p, --protocol <version> optional protocol version<br />
-o, --origin <origin> optional origin<br />
--host <host> optional host<br />
-s, --subprotocol <protocol> optional subprotocol<br />
-n, --no-check Do not check for unauthorized certificates<br />
-H, --header <header:value> Set an HTTP header. Repeat to set multiple. (--connect only)<br />
--auth <username:password> Add basic HTTP authentication header. (--connect only)<br />
</syntaxhighlight><br />
<br />
=== WebSocketのクライアントして使う ===<br />
接続して、メッセージとして、hello とおくってみる例です。<br />
<syntaxhighlight lang="bash"><br />
$ wscat -c ws://127.0.0.1:8080<br />
connected (press CTRL+C to quit)<br />
< something<br />
> hello<br />
</syntaxhighlight><br />
=== WebSocketのサーバして使う ===<br />
<syntaxhighlight lang="bash"><br />
$ wscat -l 8080<br />
</syntaxhighlight><br />
== 関連項目 ==<br />
* [[ws]]<br />
<!-- vim: filetype=mediawiki<br />
--></div>
Daemon
https://kaworu.jpn.org/javascript/iocat
iocat
2014-09-06T05:56:54Z
<p>Daemon: /* 関連項目 */</p>
<hr />
<div>[[iocat]]とは、[[socket.io]]をサポートする [[WebSocket]] netcat です。<br />
<br />
'''読み方'''<br />
;[[iocat]]:あいおーきゃっと<br />
__TOC__<br />
<br />
== 概要 ==<br />
[[iocat]]は、socket.io と [[WebSocket]] の netcat ライクなユーティリティです。<br />
netcat(ncat,nc)は、ネットワークソフトウェアで、ネットワークのクライアントやサーバとして使えるツールです。<br />
<br />
[[WebSocket]]部分は、wsパッケージで提供される [[wscat]]でも良いです。<br />
=== コマンドラインオプション ===<br />
<syntaxhighlight lang="bash"><br />
Usage: iocat [options] URL<br />
<br />
Options:<br />
<br />
-h, --help output usage information<br />
-V, --version output the version number<br />
-v, --verbose verbose<br />
-l, --listen Start in listen mode, creating a server<br />
-p, --local-port <port> Specify local port for remote conntects<br />
--socketio Use socket.io<br />
-k, --keep-listen Keep inbound sockets open for multiple connects<br />
</syntaxhighlight><br />
<br />
=== WebScoketサーバとして起動する ===<br />
<syntaxhighlight lang="bash"><br />
$ iocat -l -p 8080<br />
</syntaxhighlight><br />
=== WebScoketクライアントとして起動する ===<br />
<syntaxhighlight lang="bash"><br />
$ iocat -p 8080 ws://127.0.0.1:8080<br />
</syntaxhighlight><br />
<br />
=== デモ ===<br />
表示がごちゃ混ぜになっていて、わかりにくいですが、[[iocat]]をサーバとクライアントとして、起動した例です。<br />
<br />
サーバ<br />
<syntaxhighlight lang="bash"><br />
$ iocat -l -p 8080<br />
> New connection<br />
hello<br />
> I'm server<br />
</syntaxhighlight><br />
クライアント<br />
<syntaxhighlight lang="bash"><br />
$ iocat ws://127.0.0.1:8080<br />
> Connection to ws://127.0.0.1:8080 succeeded!<br />
hello<br />
> I'm server<br />
</syntaxhighlight><br />
== 関連項目 ==<br />
* [[WebSocket]]<br />
* [[wscat]]<br />
<!-- vim: filetype=mediawiki<br />
--></div>
Daemon
https://kaworu.jpn.org/javascript/WebSocket
WebSocket
2014-09-06T05:46:39Z
<p>Daemon: ページの作成:「WebSocketとは、ブラウザとサーバの間で双方向通信を実現する仕組みです。AjaxやCometの課題を解決するために作られました。 ...」</p>
<hr />
<div>[[WebSocket]]とは、ブラウザとサーバの間で双方向通信を実現する仕組みです。AjaxやCometの課題を解決するために作られました。<br />
<br />
'''読み方'''<br />
;[[WebSocket]]:うぇぶ そけっと<br />
__TOC__<br />
<br />
== 概要 ==<br />
[[WebSocket]]では、サーバとクライアント(主にブラウザ)の間で、永続的なソケットを利用し、双方向通信を実現します。一度、接続してしまえば、サーバからのプッシュ通知も可能となります。<br />
<br />
== AjaxとCometの課題 ==<br />
Ajaxは、非同期通信のためにXMLHttpRequestオブジェクトを使用しています。通信の都度HTTPリクエストが発生し、通信コストが高いです。この方式は、クライアントからサーバに接続するモデルであるため、サーバ側からデータをプッシュできません。<br />
<br />
Comet では、サーバからクライアントに任意のタイミングでレスポンスを返すため、HTTPロングポーリングと呼ばれる、HTTPの通信接続を確立しておき、レスポンスするまで接続を維持する方式です。この通信もまた、都度、再接続が必要となり、接続処理に無駄があります。<br />
<br />
== WebSocketのサーバ ==<br />
[[WebSocket]]を使用したアプリケーションの開発には、[[WebSocket]]に対応するサーバが必要になります。たとえば、以下のソフトウェアを利用して、[[WebSocket]]を利用できます。<br />
* [[node.js]]<br />
* Jetty<br />
* PHP Websocket Class<br />
<br />
== WebSocketのAPI ==<br />
{|class="wikitable"<br />
|+ WebSocket API<br />
! メンバ<br />
! 説明<br />
|-<br />
| WebSocket(url,protocol)<br />
| WebSocketのコンストラクタ。<br />
|-<br />
| send(data)<br />
| メッセージを送信する<br />
|-<br />
| close()<br />
| WebSocketの接続を切断する。<br />
|-<br />
| onopen<br />
| WebSocket の接続が確立したときに呼び出されるハンドラ<br />
|-<br />
| onclose<br />
| WebSocket の接続が切断したときに呼び出されるハンドラ<br />
|-<br />
| onmessage<br />
| WebSocket でメッセージを受信したときに呼び出されるハンドラ<br />
|-<br />
| onerror<br />
| WebSocket でエラーがおきたときに呼び出されるハンドラ<br />
|}<br />
<br />
== URL ==<br />
{|class="wikitable"<br />
|+ WebSocket URL<br />
! プロトコル<br />
! 説明<br />
|-<br />
| ws://<br />
| WebSocketでの80ポートで通信。通信は、平文でおくられる。<br />
|-<br />
| wss://<br />
| WebSocketでの443ポートで通信。通信は、暗号化される。<br />
|}<br />
<br />
== 開発に使うもの ==<br />
* [[node.js]]で[[WebSocket]]サーバを開発する場合<br />
** [[socket.io]]<br />
* [[WebSocket]]サーバのデバッグ・動作確認<br />
** [[wscat]]<br />
** [[iocat]]<br />
<br />
== 関連項目 ==<br />
{{node websocket}}<br />
<!-- vim: filetype=mediawiki<br />
--></div>
Daemon
https://kaworu.jpn.org/javascript/ws
ws
2014-09-06T03:36:18Z
<p>Daemon: </p>
<hr />
<div>[[node.js]]の[[ws]]は、[[npm]]パッケージとして提供される[[WebSocket]]ライブラリです。[[WebSocket]]の実装を簡単に実現できます。[[ws]]パッケージで提供される[[wscat]]は、netcat(ncat,nc)ライクなコマンドです<br />
[[ws]]は、[[WebSocket]]のサーバアプリケーションの開発時に動作確認を行う簡単なツール([[wscat]])を提供します。<br />
<br />
'''読み方'''<br />
;[[ws]]:だぶるえす<br />
__TOC__<br />
<br />
== 概要 ==<br />
[[node.js]]の[[ws]]は、[[npm]]パッケージとして提供される[[WebSocket]]ライブラリです。[[WebSocket]]の実装を簡単に実現できます。[[ws]]パッケージで提供される[[wscat]]は、netcat(ncat,nc)ライクなコマンドです。サーバモードとクライアントモードを持っています。[[WebSocket]]サーバやクライアントを実装するときのデバッグやテストに利用できます。<br />
<br />
== インストール ==<br />
<syntaxhighlight lang="bash"><br />
$ sudo npm install -g ws<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang="bash"><br />
$ sudo npm install -g ws<br />
/usr/local/bin/wscat -> /usr/local/lib/node_modules/ws/bin/wscat<br />
<br />
> ws@0.4.32 install /usr/local/lib/node_modules/ws<br />
> (node-gyp rebuild 2> builderror.log) || (exit 0)<br />
<br />
gmake: ディレクトリ `/usr/local/lib/node_modules/ws/build' に入ります<br />
CXX(target) Release/obj.target/bufferutil/src/bufferutil.o<br />
gmake: ディレクトリ `/usr/local/lib/node_modules/ws/build' から出ます<br />
ws@0.4.32 /usr/local/lib/node_modules/ws<br />
├── tinycolor@0.0.1<br />
├── options@0.0.5<br />
├── commander@2.1.0<br />
└── nan@1.0.0<br />
</syntaxhighlight><br />
== 使い方 ==<br />
=== WebSocketサーバの実装 ===<br />
==== ws_server1.js ====<br />
[[WebSocket]]クライアントから送信されてきたメッセージをコンソールに表示するだけのプログラムです。<br />
<syntaxhighlight lang="javascript"><br />
/*<br />
* ws_server1.js<br />
* Copyright (C) 2014 kaoru <kaoru@bsd><br />
*/<br />
var WebSocketServer = require('ws').Server;<br />
var wss = new WebSocketServer({port: 8080});<br />
wss.on('connection', function(ws) {<br />
ws.on('message', function(message) {<br />
console.log('received: %s', message);<br />
});<br />
ws.send('something');<br />
});<br />
</syntaxhighlight><br />
==== 実行 ====<br />
<br />
サーバの起動とメッセージ受信時の例です。<br />
<syntaxhighlight lang="bash"><br />
$ node ws_server1.js<br />
received: hello<br />
</syntaxhighlight><br />
<br />
クライアントからサーバに接続します。hello と入力し、エンターを押すと、サーバ側へ送信されます。<br />
<syntaxhighlight lang="bash"><br />
$ wscat -c ws://127.0.0.1:8080<br />
connected (press CTRL+C to quit)<br />
< something<br />
> hello<br />
><br />
</syntaxhighlight><br />
=== WebSocketクライアントの実装 ===<br />
[[WebSocket]]サーバに接続して、メッセージを送信するだけのプログラムです。<br />
==== ws_client1.js ====<br />
<syntaxhighlight lang="javascript"><br />
/*<br />
* ws_client1.js<br />
* Copyright (C) 2014 kaoru <kaoru@bsd><br />
*/<br />
var WebSocket = require('ws');<br />
var ws = new WebSocket('ws://127.0.0.1:8080');<br />
ws.on('open', function() {<br />
var now = new Date();<br />
ws.send('hello, ' + now);<br />
ws.close();<br />
});<br />
</syntaxhighlight><br />
==== 実行 ====<br />
事前に[[WebSocket]]サーバを[[wscat]]で実行しておきます。<br />
<syntaxhighlight lang="bash"><br />
$ wscat -l 8080<br />
</syntaxhighlight><br />
<br />
クライアントの実装方法は、以下の通りです。<br />
<syntaxhighlight lang="bash"><br />
$ node ws_client1.js<br />
</syntaxhighlight><br />
<br />
[[WebSocket]]サーバ[[wscat]]は、以下のような表示をします。<br />
<syntaxhighlight lang="bash"><br />
$ wscat -l 8080<br />
listening on port 8080 (press CTRL+C to quit)<br />
client connected<br />
< hello, Sat Sep 06 2014 20:40:44 GMT+0900 (JST)<br />
disconnected<br />
</syntaxhighlight><br />
== 関連項目 ==<br />
* [[wscat]]<br />
* [[WebSocket]]<br />
* [[iocat]]<br />
<!-- vim: filetype=mediawiki<br />
--></div>
Daemon
https://kaworu.jpn.org/javascript/node.js%E3%81%A7MySQL%E3%81%AE%E7%96%91%E5%95%8F%E7%AC%A6%E3%83%97%E3%83%AC%E3%83%BC%E3%82%B9%E3%83%9B%E3%83%AB%E3%83%80%E3%81%AB%E3%82%88%E3%82%8BSQL%E3%82%A4%E3%83%B3%E3%82%B8%E3%82%A7%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E5%AF%BE%E7%AD%96
node.jsでMySQLの疑問符プレースホルダによるSQLインジェクション対策
2014-09-01T16:38:48Z
<p>Daemon: ページの作成:「node.jsでMySQLサーバに接続し、SQLを実行するときにSQLインジェクション対策を忘れてはいけません。SQLインジェクション対策...」</p>
<hr />
<div>[[node.js]]でMySQLサーバに接続し、SQLを実行するときにSQLインジェクション対策を忘れてはいけません。SQLインジェクション対策として、ここでは、疑問符プレースホルダを使用します。<br />
<br />
'''読み方'''<br />
;SQLインジェクション:えすきゅーえる いんじぇくしょん<br />
;疑問符プレースホルダ:ぎもんふ ぷれーすほるだ<br />
__TOC__<br />
<br />
== 概要 ==<br />
以下は、任意の番号を受け取って、その番号と一致するidのuserのデータを引っ張るときのSQLの例です。<br />
<syntaxhighlight lang="sql"><br />
select * from user where id=番号<br />
</syntaxhighlight><br />
<br />
番号をSQL文と単純に連結するには、適切にエスケープしなければなりません。<br />
<syntaxhighlight lang="javascript"><br />
var sql = 'select * from user where id=' + number;<br />
</syntaxhighlight><br />
<br />
エスケープをプログラマが意識せずに扱うには、疑問符プレースホルダが簡単です。<br />
疑問符というのは、記号 ? のことです。<br />
<syntaxhighlight lang="sql"><br />
select * from user where id=?<br />
</syntaxhighlight><br />
<br />
このSQLを実行するときに、? に部分に値をバインドして、SQLを実行します。自動的にSQLは、エスケープされます。<br />
<br />
コードを部分的に抜粋すると、以下のようなコードになります。<br />
query()の第2引数に、渡したい値を指定します。<br />
<syntaxhighlight lang="javascript"><br />
var sql = 'select * from user where id=?';<br />
var id = 1;<br />
var e = my_client.query(sql, [id], function (err, rows, fields) {<br />
</syntaxhighlight><br />
<br />
== 前提となるデータベースのテーブル ==<br />
<syntaxhighlight lang="sql"><br />
CREATE DATABASE test;<br />
USE test;<br />
CREATE TABLE test.USER (id INT, name VARCHAR(20));<br />
INSERT INTO USER VALUES(1,'a');<br />
INSERT INTO USER VALUES(2,'b');<br />
</syntaxhighlight><br />
== ソースコード ==<br />
<syntaxhighlight lang="javascript"><br />
/*<br />
* mysql_query1.js<br />
* Copyright (C) 2014 kaoru <kaoru@bsd><br />
*/<br />
var db_host = '127.0.0.1';<br />
var db_user = 'root';<br />
var db_pw = '';<br />
var db_name = 'test';<br />
<br />
var mysql = require('mysql');<br />
var mysql_options = {<br />
host: db_host,<br />
user: db_user,<br />
password: db_pw,<br />
database: db_name<br />
};<br />
var my_client = mysql.createConnection(mysql_options);<br />
my_client.connect();<br />
<br />
var sql = 'select * from user where id=?';<br />
<br />
var id = 1;<br />
var e = my_client.query(sql, [id], function (err, rows, fields) {<br />
if (err) {<br />
console.log('can not connect');<br />
console.log(err);<br />
return;<br />
}<br />
<br />
console.log('-- 1 --');<br />
for (var i in rows) {<br />
console.log(rows[i].name);<br />
}<br />
});<br />
<br />
id = 2;<br />
my_client.query(sql, [id], function (err, rows, fields) {<br />
if (err) {<br />
console.log('can not connect');<br />
console.log(err);<br />
return;<br />
}<br />
<br />
console.log('-- 2 --');<br />
for (var i in rows) {<br />
console.log(rows[i].name);<br />
}<br />
});<br />
my_client.end();<br />
</syntaxhighlight><br />
== 実行例 ==<br />
<syntaxhighlight lang="bash"><br />
$ node sql_query1.js<br />
-- 1 --<br />
a<br />
-- 2 --<br />
b<br />
</syntaxhighlight><br />
== SQLインジェクションっぽい値を入れる ==<br />
<br />
このSQLの番号、というところに 0 or 1=1 を入れて、<br />
<syntaxhighlight lang="sql"><br />
select * from user where id=番号<br />
</syntaxhighlight><br />
以下のSQL文を組みたてることができると<br />
<syntaxhighlight lang="sql"><br />
select * from user where id=0 or 1=1;<br />
</syntaxhighlight><br />
以下のような結果になります。<br />
<syntaxhighlight lang="sql"><br />
MariaDB [test]> select * from user where id=0 or 1=1;<br />
+------+------+<br />
| id | name |<br />
+------+------+<br />
| 1 | a |<br />
| 2 | b |<br />
+------+------+<br />
2 rows in set (0.00 sec)<br />
</syntaxhighlight><br />
<br />
たとえば、上のコードを id を以下のようにします。<br />
<syntaxhighlight lang="java"><br />
var sql = 'select * from user where id=?';<br />
var id = '0 or 1=1';<br />
var e = my_client.query(sql, [id], function (err, rows, fields) {<br />
</syntaxhighlight><br />
<br />
実際に、query()が作成したSQLを確認してみると<br />
sql: 'select * from user where id=\'0 or 1=1\'',<br />
となります。結果、テーブルのデータ的には、何もマッチしなくなります。<br />
<br />
以下、query()の戻り値の抜粋です。<br />
<syntaxhighlight lang="javascript"><br />
{ domain: null,<br />
_events:<br />
{ error: [Function],<br />
packet: [Function],<br />
end: [Function],<br />
timeout: [Function],<br />
'start-tls': [Function] },<br />
_maxListeners: 10,<br />
_callback: [Function],<br />
_callSite: [Error],<br />
_ended: false,<br />
_timeout: undefined,<br />
_idleNext: null,<br />
_idlePrev: null,<br />
_idleStart: null,<br />
_idleTimeout: undefined,<br />
_repeat: null,<br />
sql: 'select * from user where id=\'0 or 1=1\'',<br />
</syntaxhighlight><br />
<br />
このように、疑問符プレースホルダを使用すると、自動的に値がエスケープされます。<br />
== 関連項目 ==<br />
{{mysql}}<br />
<!-- vim: filetype=mediawiki<br />
--></div>
Daemon
https://kaworu.jpn.org/javascript/node.js%E3%81%A7MySQL%E3%81%AB%E6%8E%A5%E7%B6%9A%E3%81%99%E3%82%8B
node.jsでMySQLに接続する
2014-08-31T16:40:54Z
<p>Daemon: ページの作成:「node.jsからMySQLのデータベースにアクセスするには、mysqlモジュールを使用します。 '''読み方''' ;mysql:まい えすきゅーえる __...」</p>
<hr />
<div>[[node.js]]からMySQLのデータベースにアクセスするには、mysqlモジュールを使用します。<br />
<br />
'''読み方'''<br />
;mysql:まい えすきゅーえる<br />
__TOC__<br />
<br />
== 概要 ==<br />
[[node.js]]からMySQLサーバに接続する例です。<br />
== データベースの事前準備 ==<br />
mysqlコマンドでmysqlserverに接続します。<br />
<syntaxhighlight lang="bash"><br />
$ mysql -u root -p<br />
</syntaxhighlight><br />
<br />
以下のコマンドで、データベースとテーブルを作成し、テストデータを入れます。<br />
<syntaxhighlight lang="sql"><br />
create database test;<br />
use test;<br />
create table test.user (id int, name varchar(20));<br />
insert into user values(1,'a');<br />
insert into user values(2,'b');<br />
</syntaxhighlight><br />
== インストール ==<br />
mysqlモジュールをインストールします。<br />
<syntaxhighlight lang="bash"><br />
$ sudo npm install -g mysql<br />
</syntaxhighlight><br />
<br />
== ソースコード ==<br />
<syntaxhighlight lang="javascript"><br />
/*<br />
* mysql1.js<br />
* Copyright (C) 2014 kaoru <kaoru@bsd><br />
*/<br />
var db_host = '127.0.0.1';<br />
var db_user = 'root';<br />
var db_pw = '';<br />
var db_name = 'test';<br />
<br />
var mysql = require('mysql');<br />
var mysql_options = {<br />
host: db_host,<br />
user: db_user,<br />
password: db_pw,<br />
database: db_name<br />
};<br />
var my_client = mysql.createConnection(mysql_options);<br />
my_client.connect();<br />
<br />
var sql = 'select * from user';<br />
<br />
var db_host = '127.0.0.1';<br />
var db_user = 'root';<br />
var db_pw = '';<br />
var db_name = 'test';<br />
<br />
var mysql = require('mysql');<br />
var mysql_options = {<br />
host: db_host,<br />
user: db_user,<br />
password: db_pw,<br />
database: db_name<br />
};<br />
var my_client = mysql.createConnection(mysql_options);<br />
my_client.connect();<br />
<br />
var sql = 'select * from user';<br />
<br />
my_client.query(sql, function (err, rows, fields) {<br />
if (err) {<br />
console.log('can not connect');<br />
console.log(err);<br />
return;<br />
}<br />
<br />
for (var i in rows) {<br />
console.log(rows[i]);<br />
}<br />
});<br />
my_client.end();<br />
</syntaxhighlight><br />
== 実行例 ==<br />
=== 正常系 ===<br />
<syntaxhighlight lang="bash"><br />
$ node mysql1.js<br />
{ id: 1, name: 'a' }<br />
{ id: 2, name: 'b' }<br />
</syntaxhighlight><br />
<br />
カラムを参照するときは、 . (ドット) でカラム名をつなぎます。<br />
<syntaxhighlight lang="javascript"><br />
console.log(rows[i].user);<br />
</syntaxhighlight><br />
<br />
=== 接続できないとき ===<br />
MySQLサーバに接続できないときのエラーメッセージです。<br />
以下の例では、MySQLサーバを起動していない状態です。<br />
<syntaxhighlight lang="bash"><br />
$ node mysql1.js<br />
can not connect<br />
{ [Error: connect ECONNREFUSED]<br />
code: 'ECONNREFUSED',<br />
errno: 'ECONNREFUSED',<br />
syscall: 'connect',<br />
fatal: true }<br />
</syntaxhighlight><br />
<br />
== 関連項目 ==<br />
{{mysql}}<br />
<!-- vim: filetype=mediawiki<br />
--></div>
Daemon
https://kaworu.jpn.org/javascript/node.js%E3%81%A7SPDY%E5%AF%BE%E5%BF%9C%E3%82%A6%E3%82%A7%E3%83%96%E3%82%B5%E3%83%BC%E3%83%90
node.jsでSPDY対応ウェブサーバ
2014-08-31T12:07:06Z
<p>Daemon: ページの作成:「node.jsでSPDYに対応したウェブサーバを作成してみます。SPDYは、HTTPを速くするためのもので、HTTPSで利用します。node.jsでSP...」</p>
<hr />
<div>[[node.js]]でSPDYに対応したウェブサーバを作成してみます。SPDYは、HTTPを速くするためのもので、HTTPSで利用します。[[node.js]]でSPDYを扱うには、spdyモジュールを使用します。<br />
<br />
'''読み方'''<br />
;SPDY:すぴーでぃ、えすぴーでぃーわい<br />
__TOC__<br />
<br />
== 概要 ==<br />
SPDYに対応したHTTPSサーバ(ウェブサーバ)を作る方法は、[[node.js]]でHTTPSサーバを作成する要領と変わりません。<br />
<br />
== インストール ==<br />
spdyモジュールをインストールします。<br />
<syntaxhighlight lang="bash"><br />
$ sudo node install -g spdy<br />
</syntaxhighlight><br />
<br />
== ソースコード ==<br />
<syntaxhighlight lang="javascript"><br />
/*<br />
* spdy1.js<br />
* Copyright (C) 2014 kaoru <kaoru@bsd><br />
*/<br />
var spdy = require('spdy');<br />
var fs = require('fs');<br />
var ssl_server_key = 'server_key.pem';<br />
var ssl_server_crt = 'server_crt.pem';<br />
var port = 8443;<br />
<br />
var options = {<br />
key: fs.readFileSync(ssl_server_key),<br />
cert: fs.readFileSync(ssl_server_crt)<br />
};<br />
<br />
var server = spdy.createServer(options, function(req,res){<br />
res.writeHead(200);<br />
res.end("Hello SPDY\n");<br />
});<br />
server.listen(port);<br />
</syntaxhighlight><br />
== 実行例 ==<br />
spdyに対応したウェブサーバを起動します。<br />
<syntaxhighlight lang="bash"><br />
$ node spdy1.js<br />
</syntaxhighlight><br />
<br />
curlコマンドでアクセスしてみます。<br />
<syntaxhighlight lang="bash"><br />
$ curl https://localhost:8443/ --insecure<br />
Hello SPDY<br />
</syntaxhighlight><br />
<br />
-vでcurlの詳細を出してみましたが、これだとわからないですね。<br />
<syntaxhighlight lang="bash"><br />
$ curl -v https://localhost:8443/ --insecure<br />
* Hostname was NOT found in DNS cache<br />
* Trying 127.0.0.1...<br />
* Connected to localhost (127.0.0.1) port 8443 (#0)<br />
* successfully set certificate verify locations:<br />
* CAfile: /usr/local/share/certs/ca-root-nss.crt<br />
CApath: none<br />
* SSLv3, TLS handshake, Client hello (1):<br />
* SSLv3, TLS handshake, Server hello (2):<br />
* SSLv3, TLS handshake, CERT (11):<br />
* SSLv3, TLS handshake, Server finished (14):<br />
* SSLv3, TLS handshake, Client key exchange (16):<br />
* SSLv3, TLS change cipher, Client hello (1):<br />
* SSLv3, TLS handshake, Finished (20):<br />
* SSLv3, TLS change cipher, Client hello (1):<br />
* SSLv3, TLS handshake, Finished (20):<br />
* SSL connection using TLSv1.2 / AES256-GCM-SHA384<br />
* Server certificate:<br />
* subject: C=JP; ST=Tokyo; L=Musashino-shi; O=Foo; OU=Bar; CN=foo.bar.com<br />
* start date: 2014-08-31 06:58:09 GMT<br />
* expire date: 2014-08-31 06:58:09 GMT<br />
* issuer: C=JP; ST=Tokyo; L=Musashino-shi; O=Foo; OU=Bar; CN=foo.bar.com<br />
* SSL certificate verify result: self signed certificate (18), continuing anyway.<br />
> GET / HTTP/1.1<br />
> User-Agent: curl/7.36.0<br />
> Host: localhost:8443<br />
> Accept: */*<br />
><br />
< HTTP/1.1 200 OK<br />
< Date: Sun, 31 Aug 2014 11:10:24 GMT<br />
< Connection: keep-alive<br />
< Transfer-Encoding: chunked<br />
<<br />
Hello SPDY<br />
* Connection #0 to host localhost left intact<br />
</syntaxhighlight><br />
<br />
spdycat を使って、見てみましょう。<br />
<syntaxhighlight lang="bash"><br />
$ spdycat -v https://localhost:8443/<br />
[ 0.004] NPN select next protocol: the remote server offers:<br />
* spdy/3.1<br />
* spdy/3<br />
* spdy/2<br />
* http/1.1<br />
* http/1.0<br />
NPN selected the protocol: spdy/3.1<br />
[ 0.012] Handshake complete<br />
[ 0.012] recv SETTINGS frame <version=3, flags=0, length=20><br />
(niv=2)<br />
[4(1):100]<br />
[7(1):1048576]<br />
[ 0.013] send SYN_STREAM frame <version=3, flags=1, length=217><br />
(stream_id=1, assoc_stream_id=0, pri=3)<br />
:host: localhost:8443<br />
:method: GET<br />
:path: /<br />
:scheme: https<br />
:version: HTTP/1.1<br />
accept: */*<br />
accept-encoding: gzip, deflate<br />
user-agent: spdylay/1.2.5<br />
[ 0.013] recv WINDOW_UPDATE frame <version=3, flags=0, length=8><br />
(stream_id=0, delta_window_size=983040)<br />
[ 0.111] recv SYN_REPLY frame <version=3, flags=0, length=55><br />
(stream_id=1)<br />
:status: 200 OK<br />
:version: HTTP/1.1<br />
date: Sun, 31 Aug 2014 11:09:56 GMT<br />
Hello SPDY<br />
[ 0.111] recv DATA frame (stream_id=1, flags=0, length=11)<br />
[ 0.111] recv DATA frame (stream_id=1, flags=1, length=0)<br />
[ 0.111] send GOAWAY frame <version=3, flags=0, length=8><br />
(last_good_stream_id=0)<br />
</syntaxhighlight><br />
<br />
opensslコマンドをクライアントモードで使用して、TLSの情報をひっぱってみました。<br />
<syntaxhighlight lang="bash"><br />
$ openssl s_client -connect localhost:8443 < /dev/null |ag -i tls<br />
...<br />
New, TLSv1/SSLv3, Cipher is AES256-GCM-SHA384<br />
Protocol : TLSv1.2<br />
TLS session ticket lifetime hint: 300 (seconds)<br />
TLS session ticket:<br />
</syntaxhighlight><br />
<br />
== 関連項目 ==<br />
{{node http server}}<br />
<!-- vim: filetype=mediawiki<br />
--></div>
Daemon
https://kaworu.jpn.org/javascript/node.js%E3%81%AB%E3%82%88%E3%82%8BHTTPS%E3%82%B5%E3%83%BC%E3%83%90%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9
node.jsによるHTTPSサーバの作り方
2014-08-31T07:07:26Z
<p>Daemon: </p>
<hr />
<div>[[node.js]]でHTTPSサーバ(SSL)を作成するには、httpsモジュールを使用します。HTTPSサーバは、SSLにより、経路を暗号化し、サーバ-クライアント間の盗聴を防ぎます。また、サーバ証明書により、サーバの真正性を保証します。セキュリティを強化したいときに、HTTPSを使用します。<br />
<br />
__TOC__<br />
<br />
== 概要 ==<br />
httpsサーバを作るには、以下の手順が必要です。<br />
# SSL証明書の作成<br />
# httpsモジュールを作ったプログラミング<br />
<br />
== 証明書の作成 ==<br />
ここでは、自己署名証明書(俺々証明書、オレオレ証明書)を使用します。自己署名証明書の場合、サイトの真正性の保証はできないので、プログラムの動作テスト目的でのみ、使用してください。<br />
<syntaxhighlight lang="bash"><br />
$ openssl genrsa -out server_key.pem 2048<br />
$ openssl req -batch -new -key server_key.pem -out server_csr.pem \<br />
-subj "/C=JP/ST=Tokyo/L=Musashino-shi/O=Foo/OU=Bar/CN=foo.bar.com"<br />
$ openssl x509 -in server_csr.pem -out server_crt.pem -req \<br />
-signkey server_key.pem -days 73000 -sha256<br />
</syntaxhighlight><br />
<br />
== プログラムの流れ ==<br />
基本的には、HTTPサーバの作りと同じですが、以下の点がことなります。<br />
* サーバの秘密鍵と証明書を読み込む必要がある。<br />
* httpsモジュールのcreateServerにパラーメタとして、証明書と鍵のデータを渡す。<br />
<br />
== ソースコード ==<br />
<syntaxhighlight lang="javascript"><br />
/*<br />
* https1.js<br />
* Copyright (C) 2014 kaoru <kaoru@bsd><br />
*/<br />
var https = require('https');<br />
var fs = require('fs');<br />
var ssl_server_key = 'server_key.pem';<br />
var ssl_server_crt = 'server_crt.pem';<br />
var port = 8443;<br />
<br />
var options = {<br />
key: fs.readFileSync(ssl_server_key),<br />
cert: fs.readFileSync(ssl_server_crt)<br />
};<br />
<br />
https.createServer(options, function (req,res) {<br />
res.writeHead(200, {<br />
'Content-Type': 'text/plain'<br />
});<br />
res.end("Hello, world\n");<br />
}).listen(port);<br />
</syntaxhighlight><br />
== 実行例 ==<br />
<syntaxhighlight lang="bash"><br />
$ node https1.js<br />
</syntaxhighlight><br />
<br />
<br />
<syntaxhighlight lang="bash"><br />
$ curl https://localhost:8443/ --insecure<br />
Hello, world<br />
</syntaxhighlight><br />
<br />
自己署名証明書を使用する時、CAにルート証明書がないため、以下のエラーになります。サンプルプログラムの動作目的で、curlコマンドの-kもしくは、--insecure を指定して実行して試してみください。一般のサイトに対するアクセスは、--insecure を使用するべきでは、ありません。<br />
<syntaxhighlight lang="bash"><br />
$ curl -I https://localhost:8443/<br />
curl: (60) SSL certificate problem: self signed certificate<br />
More details here: http://curl.haxx.se/docs/sslcerts.html<br />
<br />
curl performs SSL certificate verification by default, using a "bundle"<br />
of Certificate Authority (CA) public keys (CA certs). If the default<br />
bundle file isn't adequate, you can specify an alternate file<br />
using the --cacert option.<br />
If this HTTPS server uses a certificate signed by a CA represented in<br />
the bundle, the certificate verification probably failed due to a<br />
problem with the certificate (it might be expired, or the name might<br />
not match the domain name in the URL).<br />
If you'd like to turn off curl's verification of the certificate, use<br />
the -k (or --insecure) option.<br />
</syntaxhighlight><br />
<br />
== HTTPとHTTPSサーバの両方をサポートするには ==<br />
HTTPサーバとHTTPSサーバの両方を同じプログラムでサポートするには、httpモジュールとhttpsモジュールの両方をしようし、2つのサービスを起動します。それぞれ、別ポートでサービスします。<br />
=== https2.js ===<br />
<syntaxhighlight lang="javascript"><br />
/*<br />
* https2.js<br />
* Copyright (C) 2014 kaoru <kaoru@bsd><br />
*/<br />
var https = require('https');<br />
var http = require('http');<br />
var fs = require('fs');<br />
var ssl_server_key = 'server_key.pem';<br />
var ssl_server_crt = 'server_crt.pem';<br />
<br />
var http_port = 8080;<br />
var https_port = 8443;<br />
<br />
var options = {<br />
key: fs.readFileSync(ssl_server_key),<br />
cert: fs.readFileSync(ssl_server_crt)<br />
};<br />
<br />
https.createServer(options, function (req,res) {<br />
res.writeHead(200, {<br />
'Content-Type': 'text/plain'<br />
});<br />
res.end("Hello, world on https\n");<br />
}).listen(https_port);<br />
<br />
http.createServer(function (req,res) {<br />
res.writeHead(200, {<br />
'Content-Type': 'text/plain'<br />
});<br />
res.end("Hello, world on http\n");<br />
}).listen(http_port);<br />
</syntaxhighlight><br />
=== 実行例 ===<br />
サーバを起動します。<br />
<syntaxhighlight lang="bash"><br />
$ node https2.js<br />
</syntaxhighlight><br />
<br />
それぞれにcurlコマンドでアクセスしてみます。<br />
<syntaxhighlight lang="bash"><br />
$ curl https://localhost:8443/ --insecure<br />
Hello, world on https<br />
$ curl http://localhost:8080/<br />
Hello, world on http<br />
</syntaxhighlight><br />
両方にアクセスできました。<br />
== 関連項目 ==<br />
* [[node.jsでファイルを読む]]<br />
{{node http server}}<br />
<!-- vim: filetype=mediawiki<br />
--></div>
Daemon
https://kaworu.jpn.org/javascript/node.js%E3%81%AB%E3%82%88%E3%82%8BHTTP%E3%82%B5%E3%83%BC%E3%83%90%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9
node.jsによるHTTPサーバの作り方
2014-08-31T07:07:19Z
<p>Daemon: ページの作成:「node.jsによるHTTPサーバ(Webサーバ)のHello Worldプログラムの作成方法を説明します。httpモジュールを使用することで、簡単に作...」</p>
<hr />
<div>[[node.js]]によるHTTPサーバ(Webサーバ)のHello Worldプログラムの作成方法を説明します。httpモジュールを使用することで、簡単に作成できます。<br />
<br />
'''読み方'''<br />
;Hello World:はろー わーるど<br />
__TOC__<br />
<br />
== 概要 ==<br />
[[node.js]]による簡単なプログラムを紹介します。JavaScriptでHTTPサーバを起動します。なお、HTTPS(SSLによる暗号化)のサーバを作成する場合には、httpsモジュールを使用します。詳細については、[[node.jsによるHTTPSサーバの作り方]]をご参照ください。<br />
== ソースコード ==<br />
このプログラムは、8080でlistenします。<br />
=== http.js ===<br />
<syntaxhighlight lang="javascript"><br />
/*<br />
* http.js<br />
* Copyright (C) 2014 kaoru <kaoru@bsd><br />
*/<br />
var http = require('http');<br />
var server = http.createServer();<br />
<br />
server.on('request', doRequest);<br />
server.listen(8080);<br />
function doRequest(req, res) {<br />
res.writeHead(200, {'Content-Type': 'text/plain'});<br />
res.write('Hello World\n');<br />
res.end();<br />
}<br />
</syntaxhighlight><br />
== 実行例 ==<br />
まず、サーバを起動します。<br />
<syntaxhighlight lang="bash"><br />
$ node http.js<br />
</syntaxhighlight><br />
http://localhost:8080/<br />
にアクセスします。<br />
<br />
curlコマンドでのアクセスの例です。<br />
<syntaxhighlight lang="bash"><br />
$ curl http://localhost:8080/<br />
Hello World<br />
</syntaxhighlight><br />
<br />
レスポンスヘッダ込みの実行例は以下の通りです。<br />
<syntaxhighlight lang="bash"><br />
$ curl -i http://localhost:8080/<br />
HTTP/1.1 200 OK<br />
Content-Type: text/plain<br />
Date: Sat, 05 Apr 2014 09:55:08 GMT<br />
Connection: keep-alive<br />
Transfer-Encoding: chunked<br />
<br />
Hello World<br />
</syntaxhighlight><br />
<br />
http.jsは、自動的に終了しないため、[[node]]コマンドの終了は、C-c です。<br />
== http.createServerの他の使い方 ==<br />
http.createServerに処理をそのまま渡すこともできます。<br />
<syntaxhighlight lang="javascript"><br />
var http = require ('http');<br />
http.createServer (<br />
function (req, res) {<br />
res.writeHead (200,<br />
{'Content-Type': 'text/plain'}<br />
);<br />
res.end ('Hello World\n');<br />
}<br />
).listen (8080);<br />
</syntaxhighlight><br />
== 関連項目 ==<br />
{{node http server}}<br />
<!-- vim: filetype=mediawiki<br />
--></div>
Daemon
https://kaworu.jpn.org/javascript/node.js%E3%81%A8PHP%E3%81%AE%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%B3%E3%82%B9%E3%81%AE%E6%AF%94%E8%BC%83
node.jsとPHPのパフォーマンスの比較
2014-08-30T17:35:58Z
<p>Daemon: ページの作成:「node.jsのHTTPサーバとPHP, Apache + PHPにおける単純なパフォーマンスの比較を行いました。 __TOC__ == 概要 == 以下のHTTPサーバで...」</p>
<hr />
<div>[[node.js]]のHTTPサーバとPHP, Apache + PHPにおける単純なパフォーマンスの比較を行いました。<br />
<br />
__TOC__<br />
<br />
== 概要 ==<br />
以下のHTTPサーバでテストを行いました。<br />
* node.js http サーバ<br />
* PHP 単体のHTTP サーバ<br />
* Apache 2.4 + PHP (mod_php)<br />
<br />
実行環境は、以下の通りです。<br />
* FreeBSD 10.0<br />
* VM 環境<br />
<br />
測定に使ったコマンドは、Apache Bench (ab) です。<br />
<br />
なお、並列数を200にすると ab が apr_socket_connect(): Connection reset by peer (54) となったので、100より先は、やってません。<br />
<br />
== ベンチマークの結果 ==<br />
ベンチマークの結果は、以下の通りです。<br />
{|class="wikitable"<br />
|+ 秒間のリクエスト数<br />
! 並列<br />
! node.js<br />
! php<br />
! apache+php<br />
|-<br />
| 10<br />
| 2636<br />
| 7080<br />
| 4639<br />
|-<br />
| 100<br />
| 2463<br />
| 7325<br />
| 2978<br />
|}<br />
<br />
== 以下 ab の実行結果 ==<br />
node.js<br />
<syntaxhighlight lang="bash"><br />
$ ab -n 100000 -c 10 http://localhost:8080/<br />
This is ApacheBench, Version 2.3 <$Revision: 1554214 $><br />
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/<br />
Licensed to The Apache Software Foundation, http://www.apache.org/<br />
<br />
Benchmarking localhost (be patient)<br />
Completed 10000 requests<br />
Completed 20000 requests<br />
Completed 30000 requests<br />
Completed 40000 requests<br />
Completed 50000 requests<br />
Completed 60000 requests<br />
Completed 70000 requests<br />
Completed 80000 requests<br />
Completed 90000 requests<br />
Completed 100000 requests<br />
Finished 100000 requests<br />
<br />
<br />
Server Software:<br />
Server Hostname: localhost<br />
Server Port: 8080<br />
<br />
Document Path: /<br />
Document Length: 12 bytes<br />
<br />
Concurrency Level: 10<br />
Time taken for tests: 37.936 seconds<br />
Complete requests: 100000<br />
Failed requests: 0<br />
Total transferred: 11300000 bytes<br />
HTML transferred: 1200000 bytes<br />
Requests per second: 2636.01 [#/sec] (mean)<br />
Time per request: 3.794 [ms] (mean)<br />
Time per request: 0.379 [ms] (mean, across all concurrent requests)<br />
Transfer rate: 290.89 [Kbytes/sec] received<br />
<br />
Connection Times (ms)<br />
min mean[+/-sd] median max<br />
Connect: 0 0 0.1 0 14<br />
Processing: 0 4 1.9 4 85<br />
Waiting: 0 4 1.9 4 85<br />
Total: 1 4 2.0 4 86<br />
<br />
Percentage of the requests served within a certain time (ms)<br />
50% 4<br />
66% 4<br />
75% 4<br />
80% 4<br />
90% 5<br />
95% 5<br />
98% 7<br />
99% 11<br />
100% 86 (longest request)<br />
</syntaxhighlight><br />
<br />
php<br />
<syntaxhighlight lang="bash"><br />
$ ab -n 100000 -c 10 http://localhost:8080/<br />
This is ApacheBench, Version 2.3 <$Revision: 1554214 $><br />
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/<br />
Licensed to The Apache Software Foundation, http://www.apache.org/<br />
<br />
Benchmarking localhost (be patient)<br />
Completed 10000 requests<br />
Completed 20000 requests<br />
Completed 30000 requests<br />
Completed 40000 requests<br />
Completed 50000 requests<br />
Completed 60000 requests<br />
Completed 70000 requests<br />
Completed 80000 requests<br />
Completed 90000 requests<br />
Completed 100000 requests<br />
Finished 100000 requests<br />
<br />
<br />
Server Software:<br />
Server Hostname: localhost<br />
Server Port: 8080<br />
<br />
Document Path: /<br />
Document Length: 12 bytes<br />
<br />
Concurrency Level: 10<br />
Time taken for tests: 14.124 seconds<br />
Complete requests: 100000<br />
Failed requests: 0<br />
Total transferred: 12400000 bytes<br />
HTML transferred: 1200000 bytes<br />
Requests per second: 7079.97 [#/sec] (mean)<br />
Time per request: 1.412 [ms] (mean)<br />
Time per request: 0.141 [ms] (mean, across all concurrent requests)<br />
Transfer rate: 857.34 [Kbytes/sec] received<br />
<br />
Connection Times (ms)<br />
min mean[+/-sd] median max<br />
Connect: 0 0 0.0 0 5<br />
Processing: 0 1 0.5 1 12<br />
Waiting: 0 1 0.5 1 12<br />
Total: 0 1 0.5 1 12<br />
<br />
Percentage of the requests served within a certain time (ms)<br />
50% 1<br />
66% 1<br />
75% 1<br />
80% 1<br />
90% 2<br />
95% 3<br />
98% 3<br />
99% 4<br />
100% 12 (longest request)<br />
</syntaxhighlight><br />
<br />
apache 2.4 + php<br />
<br />
<syntaxhighlight lang="bash"><br />
$ ab -n 100000 -c 10 http://localhost/t/<br />
This is ApacheBench, Version 2.3 <$Revision: 1554214 $><br />
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/<br />
Licensed to The Apache Software Foundation, http://www.apache.org/<br />
<br />
Benchmarking localhost (be patient)<br />
Completed 10000 requests<br />
Completed 20000 requests<br />
Completed 30000 requests<br />
Completed 40000 requests<br />
Completed 50000 requests<br />
Completed 60000 requests<br />
Completed 70000 requests<br />
Completed 80000 requests<br />
Completed 90000 requests<br />
Completed 100000 requests<br />
Finished 100000 requests<br />
<br />
<br />
Server Software: Apache/2.4.9<br />
Server Hostname: localhost<br />
Server Port: 80<br />
<br />
Document Path: /t/<br />
Document Length: 12 bytes<br />
<br />
Concurrency Level: 10<br />
Time taken for tests: 21.556 seconds<br />
Complete requests: 100000<br />
Failed requests: 0<br />
Total transferred: 22500000 bytes<br />
HTML transferred: 1200000 bytes<br />
Requests per second: 4639.06 [#/sec] (mean)<br />
Time per request: 2.156 [ms] (mean)<br />
Time per request: 0.216 [ms] (mean, across all concurrent requests)<br />
Transfer rate: 1019.33 [Kbytes/sec] received<br />
<br />
Connection Times (ms)<br />
min mean[+/-sd] median max<br />
Connect: 0 0 0.4 0 26<br />
Processing: 0 2 2.8 2 205<br />
Waiting: 0 2 2.7 1 204<br />
Total: 0 2 2.9 2 205<br />
<br />
Percentage of the requests served within a certain time (ms)<br />
50% 2<br />
66% 2<br />
75% 2<br />
80% 2<br />
90% 3<br />
95% 4<br />
98% 5<br />
99% 6<br />
100% 205 (longest request)<br />
</syntaxhighlight><br />
<br />
node<br />
<syntaxhighlight lang="bash"><br />
$ ab -n 100000 -c 100 http://localhost:8080/<br />
This is ApacheBench, Version 2.3 <$Revision: 1554214 $><br />
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/<br />
Licensed to The Apache Software Foundation, http://www.apache.org/<br />
<br />
Benchmarking localhost (be patient)<br />
Completed 10000 requests<br />
Completed 20000 requests<br />
Completed 30000 requests<br />
Completed 40000 requests<br />
Completed 50000 requests<br />
Completed 60000 requests<br />
Completed 70000 requests<br />
Completed 80000 requests<br />
Completed 90000 requests<br />
Completed 100000 requests<br />
Finished 100000 requests<br />
<br />
<br />
Server Software:<br />
Server Hostname: localhost<br />
Server Port: 8080<br />
<br />
Document Path: /<br />
Document Length: 12 bytes<br />
<br />
Concurrency Level: 100<br />
Time taken for tests: 40.603 seconds<br />
Complete requests: 100000<br />
Failed requests: 0<br />
Total transferred: 11300000 bytes<br />
HTML transferred: 1200000 bytes<br />
Requests per second: 2462.88 [#/sec] (mean)<br />
Time per request: 40.603 [ms] (mean)<br />
Time per request: 0.406 [ms] (mean, across all concurrent requests)<br />
Transfer rate: 271.78 [Kbytes/sec] received<br />
<br />
Connection Times (ms)<br />
min mean[+/-sd] median max<br />
Connect: 0 0 0.3 0 30<br />
Processing: 12 40 7.1 40 110<br />
Waiting: 12 40 7.0 39 110<br />
Total: 13 40 7.1 40 110<br />
<br />
Percentage of the requests served within a certain time (ms)<br />
50% 40<br />
66% 41<br />
75% 41<br />
80% 43<br />
90% 48<br />
95% 53<br />
98% 58<br />
99% 63<br />
100% 110 (longest request)<br />
</syntaxhighlight><br />
<br />
php<br />
<syntaxhighlight lang="bash"><br />
$ ab -n 100000 -c 100 http://localhost:8080/<br />
This is ApacheBench, Version 2.3 <$Revision: 1554214 $><br />
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/<br />
Licensed to The Apache Software Foundation, http://www.apache.org/<br />
<br />
Benchmarking localhost (be patient)<br />
Completed 10000 requests<br />
Completed 20000 requests<br />
Completed 30000 requests<br />
Completed 40000 requests<br />
Completed 50000 requests<br />
Completed 60000 requests<br />
Completed 70000 requests<br />
Completed 80000 requests<br />
Completed 90000 requests<br />
Completed 100000 requests<br />
Finished 100000 requests<br />
<br />
<br />
Server Software:<br />
Server Hostname: localhost<br />
Server Port: 8080<br />
<br />
Document Path: /<br />
Document Length: 12 bytes<br />
<br />
Concurrency Level: 100<br />
Time taken for tests: 13.652 seconds<br />
Complete requests: 100000<br />
Failed requests: 0<br />
Total transferred: 12400000 bytes<br />
HTML transferred: 1200000 bytes<br />
Requests per second: 7325.00 [#/sec] (mean)<br />
Time per request: 13.652 [ms] (mean)<br />
Time per request: 0.137 [ms] (mean, across all concurrent requests)<br />
Transfer rate: 887.01 [Kbytes/sec] received<br />
<br />
Connection Times (ms)<br />
min mean[+/-sd] median max<br />
Connect: 0 0 0.1 0 13<br />
Processing: 7 14 2.5 13 37<br />
Waiting: 6 13 2.4 13 36<br />
Total: 11 14 2.5 13 37<br />
<br />
Percentage of the requests served within a certain time (ms)<br />
50% 13<br />
66% 13<br />
75% 13<br />
80% 13<br />
90% 14<br />
95% 18<br />
98% 22<br />
99% 28<br />
100% 37 (longest request)<br />
</syntaxhighlight><br />
<br />
apache 2.4 + php<br />
<syntaxhighlight lang="bash"><br />
$ ab -n 100000 -c 100 http://localhost/t/<br />
This is ApacheBench, Version 2.3 <$Revision: 1554214 $><br />
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/<br />
Licensed to The Apache Software Foundation, http://www.apache.org/<br />
<br />
Benchmarking localhost (be patient)<br />
Completed 10000 requests<br />
Completed 20000 requests<br />
Completed 30000 requests<br />
Completed 40000 requests<br />
Completed 50000 requests<br />
Completed 60000 requests<br />
Completed 70000 requests<br />
Completed 80000 requests<br />
Completed 90000 requests<br />
Completed 100000 requests<br />
Finished 100000 requests<br />
<br />
<br />
Server Software: Apache/2.4.9<br />
Server Hostname: localhost<br />
Server Port: 80<br />
<br />
Document Path: /t/<br />
Document Length: 12 bytes<br />
<br />
Concurrency Level: 100<br />
Time taken for tests: 33.570 seconds<br />
Complete requests: 100000<br />
Failed requests: 0<br />
Total transferred: 22500000 bytes<br />
HTML transferred: 1200000 bytes<br />
Requests per second: 2978.84 [#/sec] (mean)<br />
Time per request: 33.570 [ms] (mean)<br />
Time per request: 0.336 [ms] (mean, across all concurrent requests)<br />
Transfer rate: 654.53 [Kbytes/sec] received<br />
<br />
Connection Times (ms)<br />
min mean[+/-sd] median max<br />
Connect: 0 1 7.4 0 704<br />
Processing: 6 33 36.9 30 830<br />
Waiting: 2 30 31.7 29 829<br />
Total: 10 33 37.8 30 830<br />
<br />
Percentage of the requests served within a certain time (ms)<br />
50% 30<br />
66% 32<br />
75% 34<br />
80% 35<br />
90% 42<br />
95% 47<br />
98% 61<br />
99% 82<br />
100% 830 (longest request)<br />
</syntaxhighlight><br />
<br />
== 関連項目 ==<br />
{{nodejs}}<br />
<!-- vim: filetype=mediawiki<br />
--></div>
Daemon
https://kaworu.jpn.org/javascript/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88
オブジェクト
2014-08-30T06:50:58Z
<p>Daemon: </p>
<hr />
<div>名前を付けられた値を集めたものを[[オブジェクト]](Object)と呼びます。個々のデータ値をそのオブジェクトのプロパティを呼びます。<br />
<br />
'''読み方'''<br />
;[[オブジェクト]]:おぶじぇくと<br />
;Object:おぶじぇくと<br />
__TOC__<br />
<br />
== 概要 ==<br />
JavaScriptを書く上で、[[オブジェクト]]は重要な存在です。<br />
JavaScript は、すべてオブジェクトです。<br />
オブジェクトの実装は、HashMap(連想配列)です。<br />
<br />
== オブジェクトの生成 ==<br />
オブジェクトの生成には、コンストラクタ関数が使用されます。<br />
<syntaxhighlight lang="javascript"><br />
var obj = new Ojbect();<br />
var now = new Date();<br />
</syntaxhighlight><br />
<br />
生成したオブジェクトには、好きなプロパティを設定できます。<br />
<syntaxhighlight lang="javascript"><br />
var obj = new Ojbect();<br />
obj.x = 1;<br />
obj.y = 2;<br />
</syntaxhighlight><br />
<br />
== オブジェクトリテラル ==<br />
オブジェクトリテラルは、以下の形式で定義します。<br />
<syntaxhighlight lang="javascript"><br />
{プロパティ1:値, プロパティ2:値}<br />
</syntaxhighlight><br />
オブジェクトのプロパティをあらかじめ定義できます。オブジェクトリテラルは、オブジェクトイニシャライザとも呼ばれます。<br />
<br />
以下のコードは、プロパティを持たないオブジェクトを作成します。<br />
<syntaxhighlight lang="javascript"><br />
var obj = {};<br />
</syntaxhighlight><br />
<br />
プロパティを2つ持つオブジェクトを生成します。<br />
<syntaxhighlight lang="javascript"><br />
var data = { x:1, y:2 };<br />
</syntaxhighlight><br />
<br />
オブジェクトリテラルは、入れ子にできます。<br />
<syntaxhighlight lang="javascript"><br />
var data = { x:{x:1,y:2,z:3} , y:{x:1,y:2,z:3} };<br />
</syntaxhighlight><br />
<br />
オブジェクトリテラルのプロパティ名には、文字列も使用できます。<br />
<syntaxhighlight lang="javascript"><br />
var data = { "foo" : 123 };<br />
</syntaxhighlight><br />
<br />
=== プロパティの短縮記法 ===<br />
ECMAScript6 の Object initializer の機能が V8 で実装されます。<br />
<syntaxhighlight lang="javascript"><br />
var x = 1, y = 2, z = 3;<br />
var obj = { x, y, z };<br />
</syntaxhighlight><br />
<br />
従来では、以下の記法が必要でした。<br />
<syntaxhighlight lang="javascript"><br />
var x = 1, y = 2, z = 3;<br />
var obj = { x:x, y:y, z:z };<br />
</syntaxhighlight><br />
<br />
== プロパティを参照する方法 ==<br />
プロパティの参照は、名前を指定して参照する方法とループを回す方法があります。<br />
=== プロパティの単純な参照 ===<br />
プロパティの参照には、.でプロパティを指定する方法と添字(連想配列)でアクセスする方法があります。<br />
<syntaxhighlight lang="javascript"><br />
var obj = { x:1, y:2, z:3 };<br />
console.log ( obj.x );<br />
console.log ( obj["x"] );<br />
</syntaxhighlight><br />
<br />
=== オブジェクトとfor-in ===<br />
<syntaxhighlight lang="java"><br />
/*<br />
* obj_for_in1.js<br />
* Copyright (C) 2014 kaoru <kaoru@bsd><br />
*/<br />
var obj = { x:1, y:2, z:3 };<br />
for (var key in obj) {<br />
console.log(obj[key]);<br />
}<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang="bash"><br />
$ node obj_for_in1.js<br />
1<br />
2<br />
3<br />
</syntaxhighlight><br />
=== オブジェクトとfor-each-in ===<br />
for-each-inは、JavaScript 1.7で追加されました。<br />
<syntaxhighlight lang="javascript"><br />
/*<br />
* obj_for_each1.js<br />
* Copyright (C) 2014 kaoru <kaoru@bsd><br />
*/<br />
var obj = { x:1, y:2, z:3 };<br />
for each (var value in obj) {<br />
console.log(value);<br />
}<br />
</syntaxhighlight><br />
node v0.10.30,v0.10.31では、動作しません。<br />
== プロパティの存在を確認する ==<br />
オブジェクトのプロパティを存在するか、確認するには、 in を使用します。<br />
<syntaxhighlight lang="javascript"><br />
/*<br />
* object_exist_property.js<br />
* Copyright (C) 2014 kaoru <kaoru@bsd><br />
*/<br />
var obj = { x:17 };<br />
<br />
console.log ( "x" in obj ); // 存在する true<br />
console.log ( "y" in obj ); // 存在しない false<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang="bash"><br />
$ node object_exist_property.js<br />
true<br />
false<br />
</syntaxhighlight><br />
== オブジェクトのプロパティの削除 ==<br />
オブジェクトのプロパティを削除するには、 delete を使用します。<br />
<syntaxhighlight lang="javascript"><br />
delete obj.target;<br />
</syntaxhighlight><br />
<br />
実際の例を示します。<br />
<syntaxhighlight lang="javascript"><br />
/*<br />
* object_delete_property.js<br />
* Copyright (C) 2014 kaoru <kaoru@bsd><br />
*/<br />
var obj = { x:17 };<br />
<br />
console.log ( "x" in obj ); // 存在する true<br />
delete obj.x; // プロパティ x を削除する<br />
console.log ( "x" in obj ); // 存在しない false<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang="bash"><br />
$ node object_delete_property.js<br />
true<br />
false<br />
</syntaxhighlight><br />
<br />
== 関連項目 ==<br />
{{lang data}}<br />
<!-- vim: filetype=mediawiki<br />
--></div>
Daemon
https://kaworu.jpn.org/javascript/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%86%E3%83%A9%E3%83%AB
関数リテラル
2014-08-30T05:13:26Z
<p>Daemon: </p>
<hr />
<div>[[関数リテラル]](function literal)とは、匿名関数、無名関数、ラムダ式と呼ばれます。<br />
<br />
'''読み方'''<br />
;[[関数リテラル]]:かんすう りてらる<br />
;function literal:ふぁんくしょん りてらる<br />
__TOC__<br />
<br />
== 概要 ==<br />
以下のコードは、[[関数リテラル]]の例です。変数 square には、関数への参照が格納されます。<br />
<syntaxhighlight lang="javascript"><br />
var square = function(x) { return x * x; };<br />
</syntaxhighlight><br />
<br />
== 関数リテラル(無名関数)のメリット ==<br />
無名関数を用いることで、名前空間における衝突を回避できます。<br />
<br />
== 関数リテラルの宣言 ==<br />
通常の関数定義は、以下の通りです。<br />
<syntaxhighlight lang="javascript"><br />
function square(x) { return x * x; };<br />
</syntaxhighlight><br />
<br />
上記の関数を関数リテラルとして定義する場合には、以下の通りです。<br />
<syntaxhighlight lang="javascript"><br />
var square = function(x) { return x * x; };<br />
</syntaxhighlight><br />
<br />
Function()を使用して、同様の定義を行えます。<br />
<syntaxhighlight lang="javascript"><br />
var square = new Function("x", "return x * x;");<br />
</syntaxhighlight><br />
<br />
なお、上記のFunction()での定義は、[[jshint]]で下記のエラーが出ます。<br />
<syntaxhighlight lang="bash"><br />
The Function constructor is a form of eval.<br />
</syntaxhighlight><br />
<br />
== 関数リテラルの実行結果を返す例 ==<br />
以下の例では、変数 add に[[関数リテラル]]の参照が格納されます。<br />
<syntaxhighlight lang="javascript"><br />
var add = function(x,y) { return x + y; };<br />
</syntaxhighlight><br />
<br />
参照ではなく、実行した結果が欲しいだけの場合があります。[[関数リテラル]]を実行して、戻り値を変数に格納するには、[[関数リテラル]]の宣言の後ろに()をつけます。<br />
<syntaxhighlight lang="javascript"><br />
var total = function(x,y) { return x + y; } (1,2);<br />
</syntaxhighlight><br />
この例では、変数 total に[[関数リテラル]]を実行した結果得られた3が格納されます。<br />
<br />
たとえば、こういったこともできます。<br />
<syntaxhighlight lang="javascript"><br />
(function(x,y){return x+y;})(1,2) == 3<br />
</syntaxhighlight><br />
<br />
== 関連項目 ==<br />
{{lang data}}<br />
<!-- vim: filetype=mediawiki<br />
--></div>
Daemon
https://kaworu.jpn.org/javascript/%E3%83%AA%E3%83%86%E3%83%A9%E3%83%AB
リテラル
2014-08-30T04:30:11Z
<p>Daemon: ページの作成:「リテラル(literal)とは、プログラムに直接記述するデータ値です。 '''読み方''' ;リテラル:りてらる ;literal:りてらる __TOC__ ...」</p>
<hr />
<div>[[リテラル]](literal)とは、プログラムに直接記述するデータ値です。<br />
<br />
'''読み方'''<br />
;[[リテラル]]:りてらる<br />
;literal:りてらる<br />
__TOC__<br />
<br />
== 概要 ==<br />
下記の表は、[[リテラル]]の例です。<br />
{|class="wikitable"<br />
|+ リテラルの例<br />
! データ値<br />
! 説明<br />
|-<br />
| 123<br />
| 数値 123<br />
|-<br />
| 3.14<br />
| 数値 3.14<br />
|-<br />
| "JavaScript"<br />
| 文字列<br />
|-<br />
| 'JavaScript'<br />
| 文字列<br />
|-<br />
| true<br />
| 真理値<br />
|-<br />
| false<br />
| 真理値<br />
|-<br />
| /javascript/gi<br />
| 正規表現のリテラル<br />
|-<br />
| null<br />
| オブジェクトがないことを意味する<br />
|}<br />
<br />
== 関連項目 ==<br />
{{lang core}}<br />
<!-- vim: filetype=mediawiki<br />
--></div>
Daemon
https://kaworu.jpn.org/javascript/%E4%BA%88%E7%B4%84%E8%AA%9E
予約語
2014-08-28T16:32:02Z
<p>Daemon: ページの作成:「プログラミング言語における予約語とは、処理系で文法や値などの特別に扱われる単語のことを言います。予約語は、変...」</p>
<hr />
<div>プログラミング言語における[[予約語]]とは、処理系で文法や値などの特別に扱われる単語のことを言います。[[予約語]]は、変数、関数、メソッド、オブジェクトの識別子として用いれません。<br />
<br />
'''読み方'''<br />
;[[予約語]]:よやくご<br />
__TOC__<br />
<br />
== 概要 ==<br />
<br />
JavaScript の予約語には、以下のキーワードがあります。<br />
<syntaxhighlight lang="javascript"><br />
break<br />
case<br />
catch<br />
continue<br />
debugger<br />
default<br />
delete<br />
do<br />
else<br />
finally<br />
for<br />
function<br />
if<br />
in<br />
instanceof<br />
new<br />
return<br />
switch<br />
this<br />
throw<br />
try<br />
typeof<br />
var<br />
void<br />
while<br />
with<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang="javascript"><br />
null<br />
true<br />
false<br />
</syntaxhighlight><br />
<br />
== 将来を見越した予約語 ==<br />
<syntaxhighlight lang="javascript"><br />
class<br />
enum<br />
export<br />
extends<br />
import<br />
super<br />
<br />
implements<br />
interface<br />
let<br />
package<br />
private<br />
protected<br />
public<br />
static<br />
yield<br />
</syntaxhighlight><br />
== 関連項目 ==<br />
{{lang core}}<br />
<!-- vim: filetype=mediawiki<br />
--></div>
Daemon
https://kaworu.jpn.org/javascript/%E3%82%B3%E3%83%A1%E3%83%B3%E3%83%88
コメント
2014-08-28T16:26:17Z
<p>Daemon: ページの作成:「JavaScriptのコメントは、Java, C, C++ のコメントの書き方を踏襲してます。 '''読み方''' ;コメント:こめんと __TOC__ == 概要 == ...」</p>
<hr />
<div>JavaScriptの[[コメント]]は、Java, C, C++ のコメントの書き方を踏襲してます。<br />
<br />
'''読み方'''<br />
;[[コメント]]:こめんと<br />
__TOC__<br />
<br />
== 概要 ==<br />
JavaScriptの[[コメント]]は、C/C++やJavaと同様の書式です。<br />
== ソースコード ==<br />
<syntaxhighlight lang="javascript"><br />
// コメント<br />
<br />
/* <br />
* これもコメント<br />
*/<br />
<br />
i = 10; // ここもコメント<br />
<br />
if ( /* コメント */ i == 10 ) {<br />
;<br />
}<br />
</syntaxhighlight><br />
== 関連項目 ==<br />
{{lang core}}<br />
<!-- vim: filetype=mediawiki<br />
--></div>
Daemon
https://kaworu.jpn.org/javascript/JavaScript%E8%A8%80%E8%AA%9E%E8%A7%A3%E8%AA%AC
JavaScript言語解説
2014-08-28T16:20:50Z
<p>Daemon: </p>
<hr />
<div>__TOC__<br />
<br />
== 概要 ==<br />
== JavaScript入門 ==<br />
{{lang core}}<br />
== データ ==<br />
{{lang data}}<br />
== 関連項目 ==<br />
* [[WebSocket]]<br />
* [[ライブラリを使わずにJavaScriptでHTTP cookieをパースする方法]]<br />
<!-- vim: filetype=mediawiki<br />
--></div>
Daemon
https://kaworu.jpn.org/javascript/jshint
jshint
2014-08-28T12:56:58Z
<p>Daemon: </p>
<hr />
<div>[[jshint]](JSHint)とは、JavaScriptのコードのエラーと潜在的な問題を検出するためのツールです。[[jshint]]は、[[jslint]]からフォークしたプログラムです。<br />
<br />
'''読み方'''<br />
;[[jshint]]:じぇーえす ひんと<br />
__TOC__<br />
<br />
== 概要 ==<br />
もし、JavaScriptのコーディングを vim で行っているなら、syntastic から [[jshint]]を使うと便利です。ファイルを保存(上書き)するときに自動的にシンタックスチェックを実行できます。<br />
== インストール ==<br />
[[npm]]コマンドでインストールします。<br />
<syntaxhighlight lang="bash"><br />
$ sudo npm install -g jshint<br />
</syntaxhighlight><br />
== .vimrc の設定 ==<br />
$HOME/.vimrc に下記設定を追加します。<br />
<syntaxhighlight lang="vim"><br />
NeoBundle 'scrooloose/syntastic'<br />
let g:syntastic_enable_signs=1<br />
let g:syntastic_auto_loc_list=2<br />
let g:syntastic_javascript_checker = "jshint"<br />
</syntaxhighlight><br />
<br />
NeoBundleを使ってインストールするには、以下のコマンドを実行します。<br />
<syntaxhighlight lang="bash"><br />
$ vim +":NeoBundleInstall" +:q<br />
</syntaxhighlight><br />
== 実行例 ==<br />
わざとエラーのあるスクリプトファイルに対して[[jshint]]を実行すると以下のエラーが表示されました。<br />
<syntaxhighlight lang="bash"><br />
$ jshint object1.js<br />
object1.js: line 9, col 2, Missing semicolon.<br />
<br />
1 error<br />
[3] 2124 exit 2 jshint object1.js<br />
</syntaxhighlight><br />
== 使い方 ==<br />
=== コマンドラインオプション ===<br />
<syntaxhighlight lang="bash"><br />
Usage:<br />
jshint [OPTIONS] [ARGS]<br />
<br />
Options:<br />
-c, --config STRING Custom configuration file<br />
--reporter STRING Custom reporter (<PATH>|jslint|checkstyle)<br />
--exclude STRING Exclude files matching the given filename pattern<br />
(same as .jshintignore)<br />
--exclude-path STRINGPass in a custom jshintignore file path<br />
--filename STRING Pass in a filename when using STDIN to emulate config<br />
lookup for that file name<br />
--verbose Show message codes<br />
--show-non-errors Show additional data generated by jshint<br />
-e, --extra-ext STRING Comma-separated list of file extensions to use<br />
(default is .js)<br />
--extract [STRING] Extract inline scripts contained in HTML<br />
(auto|always|never, default to never) (Default is never)<br />
--jslint-reporter Use a jslint compatible reporter (DEPRECATED, use<br />
--reporter=jslint instead)<br />
--checkstyle-reporter Use a CheckStyle compatible XML reporter<br />
(DEPRECATED, use --reporter=checkstyle<br />
instead)<br />
-v, --version Display the current version<br />
-h, --help Display help and usage details<br />
</syntaxhighlight><br />
== 関連項目 ==<br />
* [[JavaScript開発環境]]<br />
* [[npm]]<br />
<!-- vim: filetype=mediawiki<br />
--></div>
Daemon
https://kaworu.jpn.org/javascript/npm
npm
2014-08-28T12:38:02Z
<p>Daemon: ページの作成:「npm(Node Packaged Modules)とは、node.jsのパッケージ管理コマンドです。 '''読み方''' ;npm:えぬぴーえむ ;Node Packaged Modules:のー...」</p>
<hr />
<div>[[npm]](Node Packaged Modules)とは、[[node.js]]のパッケージ管理コマンドです。<br />
<br />
'''読み方'''<br />
;[[npm]]:えぬぴーえむ<br />
;Node Packaged Modules:のーど ぱっけーじど もじゅーるず<br />
<br />
__TOC__<br />
<br />
== 概要 ==<br />
[[npm]]は、[[node.js]]のパッケージ管理コマンドです。<br />
<br />
== FreeBSD環境でのインストール ==<br />
<syntaxhighlight lang="bash"><br />
$ sudo pkg install node npm<br />
</syntaxhighlight><br />
== Ubuntu ==<br />
<syntaxhighlight lang="bash"><br />
$ sudo apt-get install nodejs npm<br />
</syntaxhighlight><br />
== CentOS ==<br />
<syntaxhighlight lang="bash"><br />
# 32bit<br />
$ sudo rpm \<br />
-ivh http://ftp.riken.jp/Linux/fedora/epel/6/i386/epel-release-6-8.noarch.rpm<br />
# 64bit<br />
$ sudo rpm \<br />
-ivh http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm<br />
$ yum install nodejs npm --enablerepo=epel<br />
</syntaxhighlight><br />
== 使い方 ==<br />
=== コマンドラインオプション ===<br />
<syntaxhighlight lang="bash"><br />
Usage: npm <command><br />
<br />
where <command> is one of:<br />
add-user, adduser, apihelp, author, bin, bugs, c, cache,<br />
completion, config, ddp, dedupe, deprecate, docs, edit,<br />
explore, faq, find, find-dupes, get, help, help-search,<br />
home, i, info, init, install, isntall, issues, la, link,<br />
list, ll, ln, login, ls, outdated, owner, pack, prefix,<br />
prune, publish, r, rb, rebuild, remove, repo, restart, rm,<br />
root, run-script, s, se, search, set, show, shrinkwrap,<br />
star, stars, start, stop, submodule, t, tag, test, tst, un,<br />
uninstall, unlink, unpublish, unstar, up, update, v,<br />
version, view, whoami<br />
<br />
npm <cmd> -h quick help on <cmd><br />
npm -l display full usage info<br />
npm faq commonly asked questions<br />
npm help <term> search for help on <term><br />
npm help npm involved overview<br />
<br />
Specify configs in the ini-formatted file:<br />
/home/kaworu/.npmrc<br />
or on the command line via: npm <command> --key value<br />
Config info can be viewed via: npm help config<br />
<br />
npm@1.4.6 /usr/local/lib/node_modules/npm<br />
</syntaxhighlight><br />
<br />
== モジュールのリスト ==<br />
インストールしたモジュールは、listオプションで表示できます。<br />
空っぽの場合は、以下の通りです。<br />
<syntaxhighlight lang="bash"><br />
$ npm list<br />
/tmp<br />
└── (empty)<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang="bash"><br />
$ npm list<br />
/tmp<br />
└─┬ forever@0.10.11<br />
├─┬ cliff@0.1.8<br />
│ ├── eyes@0.1.8<br />
│ └─┬ winston@0.6.2<br />
│ ├── async@0.1.22<br />
│ ├── cycle@1.0.3<br />
│ ├── pkginfo@0.2.3<br />
│ ├── request@2.9.203<br />
│ └── stack-trace@0.0.9<br />
├── colors@0.6.2<br />
省略<br />
</syntaxhighlight><br />
<br />
== モジュールのインストール ==<br />
<syntaxhighlight lang="bash"><br />
$ npm install モジュール名<br />
</syntaxhighlight><br />
<br />
[[npm]]は、デフォルトでは、パッケージをカレントディレクトリのインストールします。グローバル(/usr/localのような)にインストールする場合には、 -g オプションを使用します。<br />
<syntaxhighlight lang="bash"><br />
$ npm install -g jshint<br />
</syntaxhighlight><br />
<br />
<br />
<syntaxhighlight lang="bash"><br />
$ npm install forever<br />
npm http GET https://registry.npmjs.org/forever<br />
npm http 200 https://registry.npmjs.org/forever<br />
npm http GET https://registry.npmjs.org/forever/-/forever-0.10.11.tgz<br />
npm http 200 https://registry.npmjs.org/forever/-/forever-0.10.11.tgz<br />
<br />
... 省略<br />
<br />
forever@0.10.11 node_modules/forever<br />
├── watch@0.8.0<br />
├── colors@0.6.2<br />
├── pkginfo@0.3.0<br />
├── timespan@2.3.0<br />
├── utile@0.2.1 (deep-equal@0.2.1, rimraf@2.2.6, ...省略)<br />
├── nssocket@0.5.1 (eventemitter2@0.4.13, lazy@1.0.11)<br />
├── optimist@0.6.1 (wordwrap@0.0.2, minimist@0.0.8)<br />
├── nconf@0.6.9 (ini@1.1.0, async@0.2.9, optimist@0.6.0)<br />
├── cliff@0.1.8 (eyes@0.1.8, winston@0.6.2)<br />
├── winston@0.7.3 (cycle@1.0.3, stack-trace@0.0.9, ...省略)<br />
├── forever-monitor@1.2.3 (watch@0.5.1, minimatch@0.2.14, ...省略)<br />
└── flatiron@0.3.11 (director@1.1.10, optimist@0.6.0, ...省略)<br />
</syntaxhighlight><br />
<br />
== モジュールのアンインストール ==<br />
<syntaxhighlight lang="bash"><br />
$ npm uninstall モジュール名<br />
</syntaxhighlight><br />
== モジュールのアップデート ==<br />
<syntaxhighlight lang="bash"><br />
$ npm update<br />
</syntaxhighlight><br />
<br />
== モジュールの情報を表示する ==<br />
<syntaxhighlight lang="bash"><br />
$ npm info forever<br />
<br />
{ name: 'forever',<br />
description: 'A simple CLI tool for ensuring that a given node script runs continuously (i.e. forever)',<br />
'dist-tags': { latest: '0.10.11' },<br />
versions:<br />
[ '0.6.0',<br />
'0.6.1',<br />
'0.6.2',<br />
<br />
省略<br />
</syntaxhighlight><br />
<br />
== 関連項目 ==<br />
{{node basic}}<br />
<!-- vim: filetype=mediawiki<br />
--></div>
Daemon
https://kaworu.jpn.org/javascript/JavaScript%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83
JavaScript開発環境
2014-08-28T12:09:01Z
<p>Daemon: /* 概要 */</p>
<hr />
<div>JavaScriptを書くための開発環境についてです。JavaScriptを書く環境として、エディタや統合開発環境があります。<br />
<br />
__TOC__<br />
<br />
== 概要 ==<br />
JavaScriptのプログラムを書く環境ですが、統合開発環境、エディタなどいろいろな選択肢があります。<br />
<br />
* Vim<br />
* Eclipse<br />
* Microsoft Visual Studio<br />
** [[Node.js Tools for Visual Studio]]<br />
* Aptana Studio<br />
* NetBenas<br />
<br />
== ツール ==<br />
* lint<br />
** [[jshint]]<br />
** [[jslint]]<br />
* ドキュメントジェネレータ<br />
** [[JSDoc]]<br />
* jsonフォーマット整形・絞込<br />
** [[jq]]<br />
== Vimを統合開発環境 ==<br />
=== .vimrc ===<br />
vim を統合開発環境(IDE)っぽく使うために、補完やシンタックスチェックの機能を追加するための設定(.vimrc)です。<br />
<syntaxhighlight lang="vim"><br />
NeoBundle 'Shougo/neocomplete.vim'<br />
<br />
NeoBundle 'moll/vim-node'<br />
NeoBundle 'mattn/jscomplete-vim'<br />
NeoBundle 'myhere/vim-nodejs-complete'<br />
<br />
autocmd FileType javascript :setl omnifunc=jscomplete#CompleteJS<br />
<br />
NeoBundleLazy 'jelera/vim-javascript-syntax', {'autoload':{'filetypes':['javascript']}}<br />
<br />
NeoBundle 'scrooloose/syntastic'<br />
let g:syntastic_enable_signs=1<br />
let g:syntastic_auto_loc_list=2<br />
<br />
let g:syntastic_javascript_checker = "jshint"<br />
<br />
" ドキュメントジェネレータ<br />
NeoBundle 'heavenshell/vim-jsdoc'<br />
<br />
NeoBundle 'guileen/vim-node-dict'<br />
au FileType javascript set dictionary+=$HOME/.vim/bundle/vim-node-dict/dict/node.dict<br />
</syntaxhighlight><br />
=== vim-javascript-syntax ===<br />
VimでのJavaScriptのシンタックスを改善します。<br />
<syntaxhighlight lang="vim"><br />
NeoBundleLazy 'jelera/vim-javascript-syntax', {'autoload':{'filetypes':['javascript']}}<br />
</syntaxhighlight><br />
<br />
=== vim-node-dict ===<br />
node 用の辞書を追加します。C-x C-k で補完できます。<br />
<syntaxhighlight lang="vim"><br />
NeoBundle 'guileen/vim-node-dict'<br />
au FileType javascript set dictionary+=$HOME/.vim/bundle/vim-node-dict/dict/node.dict<br />
</syntaxhighlight><br />
<br />
== 開発環境構築 ==<br />
=== シンタックスチェック ===<br />
==== jshint ====<br />
[[npm]]で[[jshint]]をインストールします。<br />
<syntaxhighlight lang="bash"><br />
$ sudo npm install -g jshint<br />
...<br />
jshint@2.5.5 node_modules/jshint<br />
├── strip-json-comments@0.1.3<br />
├── underscore@1.6.0<br />
├── exit@0.1.2<br />
├── minimatch@0.4.0 (sigmund@1.0.0, lru-cache@2.5.0)<br />
├── shelljs@0.3.0<br />
├── console-browserify@1.1.0 (date-now@0.1.4)<br />
├── htmlparser2@3.7.3 (domelementtype@1.1.1, domutils@1.5.0, entities@1.0.0, domhandler@2.2.0, readable-stream@1.1.13)<br />
└── cli@0.6.4 (glob@3.2.11)<br />
</syntaxhighlight><br />
=== テンプレートエンジン ===<br />
==== jade ====<br />
[[jade]]をインストールします。<br />
<br />
<syntaxhighlight lang="bash"><br />
$ sudo npm install -g jade<br />
</syntaxhighlight><br />
<br />
== 実行環境 ==<br />
[[node.js]]を使用します。インストールについては、[[node.jsのインストール]]をご参照ください。<br />
<syntaxhighlight lang="bash"><br />
# FreeBSD<br />
$ sudo pkg install nodejs npm<br />
</syntaxhighlight><br />
<br />
実行方法は、以下の通りです。<br />
<syntaxhighlight lang="bash"><br />
$ node run.js<br />
</syntaxhighlight><br />
<br />
[[node.js環境をchefで構築する]]<br />
<br />
== シンタックスチェック ==<br />
[[jshint]]コマンドでチェックします。<br />
<syntaxhighlight lang="bash"><br />
$ jshint main.js<br />
</syntaxhighlight><br />
<br />
== ドキュメント作成 ==<br />
=== ドキュメントジェネレータ ===<br />
[[JSDoc]]などのツールを使用するとHTML形式のドキュメント作成が簡単になります。<br />
<syntaxhighlight lang="bash"><br />
$ sudo npm install -g jsdoc<br />
$ rehash<br />
$ jsdoc hoge.js<br />
</syntaxhighlight><br />
=== ドキュメント作成補助 ===<br />
==== jsdoc.vim ====<br />
Vimの[[jsdoc.vim]]を使用するとコメントブロックが瞬時に作成できます。<br />
== 関連項目 ==<br />
* [[JavaScript言語解説]]<br />
* [[jshint]]<br />
* [[npm]]<br />
<!-- vim: filetype=mediawiki<br />
--></div>
Daemon
https://kaworu.jpn.org/javascript/JavaScript%E3%81%AE%E6%8B%A1%E5%BC%B5%E5%AD%90
JavaScriptの拡張子
2014-08-28T10:33:22Z
<p>Daemon: ページの作成:「JavaScriptの拡張子は、.jsです。 '''読み方''' ;JavaScriptの拡張子:じゃば すくりぷと の かくちょうし __TOC__ == 概要 == JavaScrip...」</p>
<hr />
<div>[[JavaScriptの拡張子]]は、.jsです。<br />
<br />
'''読み方'''<br />
;[[JavaScriptの拡張子]]:じゃば すくりぷと の かくちょうし<br />
__TOC__<br />
<br />
== 概要 ==<br />
JavaScriptの拡張子は、 .js です。<br />
foo.js<br />
== 関連項目 ==<br />
* [[JavaScript言語解説]]<br />
<!-- vim: filetype=mediawiki<br />
--></div>
Daemon
https://kaworu.jpn.org/javascript/node.js%E3%81%A7%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E6%9B%B8%E3%81%8F
node.jsでファイルを書く
2014-08-24T10:36:20Z
<p>Daemon: </p>
<hr />
<div>[[node.js]]でファイルを書き込む方法を紹介します。<br />
__TOC__<br />
<br />
== 概要 ==<br />
ファイルの読み書きには、fsモジュールを使用します。用意されいてる関数は、Unixのファイル操作のシステムコールに似た名前、引数です。<br />
<br />
ファイルシステムの関数には、同期と非同期があります。 同期の関数は、関数名にSyncがついています。 実行の順番を保証する必要がないのであれば、「非同期」を利用するべきです。<br />
== writeFileで書く ==<br />
=== writefile.js ===<br />
<syntaxhighlight lang="javascript"><br />
/*<br />
* writefile.js<br />
* Copyright (C) 2014 kaoru <kaoru@bsd><br />
*/<br />
var fs = require('fs');<br />
var data = "This is node.js program\n";<br />
var file = 'test.txt';<br />
fs.writeFile(file, data, function(err) {<br />
if (err) { throw err; }<br />
console.log ('Save');<br />
});<br />
</syntaxhighlight><br />
=== 実行例 ===<br />
<syntaxhighlight lang="bash"><br />
$ node writefile/writefile.js<br />
Save<br />
</syntaxhighlight><br />
<br />
== 非同期writeFileSyncで書く ==<br />
=== writefile_sync.js ===<br />
<syntaxhighlight lang="javascript"><br />
/*<br />
* writefile_sync.js<br />
* Copyright (C) 2014 kaoru <kaoru@bsd><br />
*/<br />
var fs = require('fs');<br />
var data = "This is node.js program\n";<br />
var file = 'writefile_sync.txt';<br />
<br />
try {<br />
fs.writeFileSync(file, data, null, function(err) {<br />
if (err) {<br />
console.log(err);<br />
return;<br />
}<br />
console.log ('Save');<br />
});<br />
<br />
var data2 = "Append line\n";<br />
fs.appendFileSync(file, data2, null, function(err) {<br />
if (err) {<br />
console.log(err);<br />
return;<br />
}<br />
console.log ('Save');<br />
});<br />
<br />
} catch (e) {<br />
console.log(e);<br />
}<br />
</syntaxhighlight><br />
<br />
こういう書き方もできます。<br />
<syntaxhighlight lang="javascript"><br />
/*<br />
* writefile_sync.js<br />
* Copyright (C) 2014 kaoru <kaoru@bsd><br />
*/<br />
var fs = require('fs');<br />
var data = "This is node.js program\n";<br />
var file = 'writefile_sync.txt';<br />
fs.writeFileSync(file, data);<br />
</syntaxhighlight><br />
<br />
=== 実行例 ===<br />
<syntaxhighlight lang="bash"><br />
$ node writefile/writefile_sync.js<br />
$ cat writefile_sync.txt<br />
This is node.js program<br />
Append line<br />
</syntaxhighlight><br />
<br />
== openで開いてwriteで書く ==<br />
=== fs_open1.js ===<br />
<syntaxhighlight lang="javascript"><br />
/*<br />
* fs_open1.js<br />
* Copyright (C) 2014 kaoru <kaoru@bsd><br />
*/<br />
var fs = require('fs');<br />
var file = 'fs_open1.txt';<br />
var flag = 'w+';<br />
var mode = 0644;<br />
var data = "This is data\n";<br />
fs.open(file, flag, mode, function(err,fd){<br />
if (err) {<br />
console.log(err);<br />
return;<br />
}<br />
var buf = new Buffer(data);<br />
fs.write(fd, buf, 0, buf.length, null, function(err, written, buffer){<br />
if (err) {<br />
console.log(err);<br />
}<br />
console.log("written=" + written);<br />
fs.close(fd);<br />
});<br />
});<br />
</syntaxhighlight><br />
=== 実行例 ===<br />
<syntaxhighlight lang="bash"><br />
$ node writefile/fs_open1.js<br />
written=13<br />
</syntaxhighlight><br />
== 関連項目 ==<br />
{{node file}}<br />
<!-- vim: filetype=mediawiki<br />
--></div>
Daemon
https://kaworu.jpn.org/javascript/node.js%E3%81%A7http%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9%E3%83%98%E3%83%83%E3%83%80%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B
node.jsでhttpレスポンスヘッダを取得する
2014-08-19T16:25:42Z
<p>Daemon: ページの作成:「node.jsでHTTPサーバにリクエストを送ったときに、レスポンスヘッダを取得する方法を説明します。requestモジュールを使用し...」</p>
<hr />
<div>[[node.js]]でHTTPサーバにリクエストを送ったときに、レスポンスヘッダを取得する方法を説明します。requestモジュールを使用します。<br />
<br />
'''読み方'''<br />
__TOC__<br />
<br />
== 概要 ==<br />
<br />
== インストール ==<br />
<syntaxhighlight lang="bash"><br />
sudo npm install request<br />
</syntaxhighlight><br />
== レスポンスヘッダを取得する ==<br />
=== ソースコード ===<br />
<syntaxhighlight lang="javascript"><br />
/*<br />
* request1.js<br />
* Copyright (C) 2014 kaoru <kaoru@bsd><br />
*/<br />
// sudo npm install request<br />
var request = require('request');<br />
<br />
var url = 'http://www.yahoo.co.jp/';<br />
<br />
request(url, function (err, res, body) {<br />
console.log (res.headers);<br />
});<br />
</syntaxhighlight><br />
=== 実行例 ===<br />
<syntaxhighlight lang="bash"><br />
$ node request1.js<br />
{ server: 'nginx',<br />
date: 'Tue, 19 Aug 2014 16:12:04 GMT',<br />
'content-type': 'text/html; charset=UTF-8',<br />
'transfer-encoding': 'chunked',<br />
connection: 'close',<br />
p3p: 'policyref="http://privacy.yahoo.co.jp/w3c/p3p_jp.xml", CP="CAO DSP COR<br />
CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi<br />
PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"',<br />
'cache-control': 'private, no-cache, no-store, must-revalidate',<br />
expires: '-1',<br />
pragma: 'no-cache',<br />
'x-xrds-location': 'https://open.login.yahooapis.jp/openid20/www.yahoo.co.jp/xrds',<br />
vary: 'Accept-Encoding' }<br />
</syntaxhighlight><br />
== 関連項目 ==<br />
== HTTPステータスコードを取得する ==<br />
=== ソースコード ===<br />
<syntaxhighlight lang="javascript"><br />
/*<br />
* request1.js<br />
* Copyright (C) 2014 kaoru <kaoru@bsd><br />
*/<br />
var request = require('request');<br />
<br />
var url = 'http://www.yahoo.co.jp/';<br />
<br />
request(url, function (err, res, body) {<br />
console.log(res.statusCode);<br />
});<br />
</syntaxhighlight><br />
=== 実行例 ===<br />
<syntaxhighlight lang="bash"><br />
$ node request1.js<br />
200<br />
</syntaxhighlight><br />
{{node http}}<br />
<!-- vim: filetype=mediawiki<br />
--></div>
Daemon
https://kaworu.jpn.org/javascript/node.js%E3%81%A7%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E3%82%92%E8%A8%88%E7%AE%97%E3%81%99%E3%82%8B
node.jsでハッシュを計算する
2014-04-06T06:07:41Z
<p>Daemon: ページの作成:「node.jsのcryptoモジュールでハッシュを求めることができます。md4, md5, sha1, sha2(sha224,sha256,sha384,sha512)などのハッシュが求め...」</p>
<hr />
<div>[[node.js]]の[[crypto]]モジュールでハッシュを求めることができます。md4, md5, sha1, sha2(sha224,sha256,sha384,sha512)などのハッシュが求められます。<br />
<br />
'''読み方'''<br />
;[[crypto]]:くりぷと<br />
;createHash:くりえいとはっしゅ<br />
;update:あっぷでーと<br />
;digest:だいじぇすと<br />
;sha1:しゃわん<br />
__TOC__<br />
<br />
== 概要 ==<br />
[[node.js]]の[[crypto]]モジュールは、暗号の機能を提供します。<br />
使用するアルゴリズムをcrypto.createHash()に指定します。<br />
digest()には、16進('hex')か、バイナリ('binary')を指定します。<br />
一度にデータを渡せない場合に、update()は、何度も呼び出して使用します。<br />
== 使用できるアルゴリズムを調べる ==<br />
<syntaxhighlight lang="javascript"><br />
var crypto = require('crypto');<br />
console.log(crypto.getHashes());<br />
</syntaxhighlight><br />
<syntaxhighlight lang="bash"><br />
node get_hashes.js<br />
[ 'DSA-SHA1-old',<br />
'dsa',<br />
'dsa-sha',<br />
'dsa-sha1',<br />
'dsaEncryption',<br />
'dsaWithSHA',<br />
'dsaWithSHA1',<br />
'dss1',<br />
'ecdsa-with-SHA1',<br />
'md4',<br />
'md4WithRSAEncryption',<br />
'md5',<br />
'md5WithRSAEncryption',<br />
'mdc2',<br />
'mdc2WithRSA',<br />
'ripemd',<br />
'ripemd160',<br />
'ripemd160WithRSA',<br />
'rmd160',<br />
'rsa-md4',<br />
'rsa-md5',<br />
'rsa-mdc2',<br />
'rsa-ripemd160',<br />
'rsa-sha',<br />
'rsa-sha1',<br />
'rsa-sha1-2',<br />
'rsa-sha224',<br />
'rsa-sha256',<br />
'rsa-sha384',<br />
'rsa-sha512',<br />
'sha',<br />
'sha1',<br />
'sha1WithRSAEncryption',<br />
'sha224',<br />
'sha224WithRSAEncryption',<br />
'sha256',<br />
'sha256WithRSAEncryption',<br />
'sha384',<br />
'sha384WithRSAEncryption',<br />
'sha512',<br />
'sha512WithRSAEncryption',<br />
'shaWithRSAEncryption',<br />
'ssl2-md5',<br />
'ssl3-md5',<br />
'ssl3-sha1',<br />
'whirlpool' ]<br />
</syntaxhighlight><br />
== sha1を求める ==<br />
=== ソースコード ===<br />
get_hash()の第1引数をsha512などに変更することで、sha1以外のハッシュも求められます。<br />
<syntaxhighlight lang="javascript"><br />
function get_hash(algorithm, plaintext, encoding) {<br />
var crypto = require('crypto');<br />
var hashsum = crypto.createHash(algorithm);<br />
hashsum.update(plaintext);<br />
return hashsum.digest(encoding);<br />
} <br />
function get_sha1(plaintext) {<br />
return get_hash('sha1', plaintext, 'hex');<br />
}<br />
var data = 'hoge';<br />
var hash = get_sha1(data);<br />
console.log(hash);<br />
</syntaxhighlight><br />
=== 実行例 ===<br />
sha1のコマンドと比較した結果、同じ値が求められたことが確認できました。<br />
<syntaxhighlight lang="bash"><br />
$ node sha1.js<br />
31f30ddbcb1bf8446576f0e64aa4c88a9f055e3c<br />
$ sha1 -s hoge<br />
SHA1 ("hoge") = 31f30ddbcb1bf8446576f0e64aa4c88a9f055e3c<br />
</syntaxhighlight><br />
== 関連項目 ==<br />
{{crypto}}<br />
<!-- vim: filetype=mediawiki<br />
--></div>
Daemon
https://kaworu.jpn.org/javascript/node.js%E3%81%A7%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E8%AA%AD%E3%82%80
node.jsでファイルを読む
2014-04-05T15:04:59Z
<p>Daemon: ページの作成:「node.jsでファイルを読む方法を紹介します。 __TOC__ == 概要 == ファイルを読むには、 fs モジュールを使用します。 用意され...」</p>
<hr />
<div>[[node.js]]でファイルを読む方法を紹介します。<br />
<br />
__TOC__<br />
<br />
== 概要 ==<br />
ファイルを読むには、 fs モジュールを使用します。<br />
用意されている関数は、Unixのファイル操作のシステムコールに似た名前、引数です。<br />
<br />
ファイルシステムの関数には、同期と非同期があります。<br />
同期の関数は、関数名にSyncがついています。<br />
実行の順番を保証する必要がないのであれば、「非同期」を利用するべきです。<br />
<br />
== readFileで読む ==<br />
=== ソースコード ===<br />
==== readfile.js ====<br />
<syntaxhighlight lang="javascript"><br />
var fs = require('fs');<br />
var file = 'test.txt';<br />
fs.readFile(file, 'utf8', function(err, text){<br />
console.log(text);<br />
console.log(err);<br />
});<br />
</syntaxhighlight><br />
=== 実行例 ===<br />
==== ファイルが存在する場合 ====<br />
<syntaxhighlight lang="bash"><br />
$ echo 'abc'> test.txt<br />
$ echo 'def'>> test.txt<br />
$ node readfile.js<br />
abc<br />
def<br />
<br />
null<br />
</syntaxhighlight><br />
==== ファイルが存在しない場合 ====<br />
<syntaxhighlight lang="bash"><br />
$ node readfile.js<br />
undefined<br />
{ [Error: ENOENT, open 'test.txt']<br />
errno: 34, code: 'ENOENT', path: 'test.txt' }<br />
</syntaxhighlight><br />
== readFileSyneで読む ==<br />
=== ソースコード ===<br />
==== readfile_sync.js ====<br />
ファイルが存在しないと例外が送出されます。<br />
<syntaxhighlight lang="javascript"><br />
var fs = require('fs');<br />
var file = 'test.txt';<br />
try {<br />
var text = fs.readFileSync(file, 'utf8');<br />
console.log(text);<br />
} catch (e) {<br />
console.log(e);<br />
}<br />
</syntaxhighlight><br />
=== 実行例 ===<br />
<syntaxhighlight lang="bash"><br />
$ node readfile_sync.js<br />
abc<br />
def<br />
<br />
$ <br />
</syntaxhighlight><br />
== 関連項目 ==<br />
{{node file}}<br />
<!-- vim: filetype=mediawiki<br />
--></div>
Daemon
https://kaworu.jpn.org/javascript/Express%E3%81%AB%E3%82%88%E3%82%8BHello_World
ExpressによるHello World
2014-04-05T12:53:58Z
<p>Daemon: /* インストール */</p>
<hr />
<div>ここでは、[[Express]]でHello Worldを作成します。<br />
<br />
__TOC__<br />
<br />
== 概要 ==<br />
<br />
== ひな形の生成 ==<br />
<syntaxhighlight lang="bash"><br />
$ express -t ejs helloapp<br />
<br />
create : helloapp<br />
create : helloapp/package.json<br />
create : helloapp/app.js<br />
create : helloapp/public<br />
create : helloapp/public/images<br />
create : helloapp/public/stylesheets<br />
create : helloapp/public/stylesheets/style.css<br />
create : helloapp/public/javascripts<br />
create : helloapp/routes<br />
create : helloapp/routes/index.js<br />
create : helloapp/routes/user.js<br />
create : helloapp/views<br />
create : helloapp/views/layout.jade<br />
create : helloapp/views/index.jade<br />
<br />
install dependencies:<br />
$ cd helloapp && npm install<br />
<br />
run the app:<br />
$ node app<br />
</syntaxhighlight><br />
<br />
以下のファイル、ディレクトリが作成されます。<br />
<syntaxhighlight lang="bash"><br />
$ ls -1<br />
app.js<br />
package.json<br />
public/<br />
routes/<br />
views/<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang="bash"><br />
$ find .<br />
.<br />
./public<br />
./public/images<br />
./public/stylesheets<br />
./public/stylesheets/style.css<br />
./public/javascripts<br />
./routes<br />
./routes/index.js<br />
./routes/user.js<br />
./views<br />
./views/layout.jade<br />
./views/index.jade<br />
./package.json<br />
./app.js<br />
</syntaxhighlight><br />
<br />
== インストール ==<br />
<syntaxhighlight lang="bash"><br />
$ cd helloapp<br />
$ npm install<br />
</syntaxhighlight><br />
<br />
== 実行 ==<br />
3000ポートでlistenします。<br />
<syntaxhighlight lang="bash"><br />
$ export NODE_PATH=/usr/local/lib/node_modules<br />
$ node app.js<br />
Express server listening on port 3000<br />
</syntaxhighlight><br />
<br />
アクセスすると簡単なログが出ます。<br />
<syntaxhighlight lang="bash"><br />
$ node app.js<br />
Express server listening on port 3000<br />
GET / 200 513ms - 170b<br />
GET / 200 50ms - 170b<br />
GET / 200 22ms - 170b<br />
GET / 200 15ms - 170b<br />
GET / 200 21ms - 170b<br />
GET / 200 20ms - 170b<br />
GET / 200 16ms - 170b<br />
GET / 200 19ms - 170b<br />
GET / 200 13ms - 170b<br />
<br />
</syntaxhighlight><br />
簡単なHTMLが返ってきます。<br />
<syntaxhighlight lang="bash"><br />
$ curl http://localhost:3000/<br />
<!DOCTYPE html><html><head><title>Express</title><link rel="stylesheet"<br />
href="/stylesheets/style.css"></head><body><h1>Express</h1><p>Welcome to<br />
Express</p></body></html><br />
</syntaxhighlight><br />
<br />
== viewを書き換える ==<br />
view/index.jade が indexページのテンプレートです。<br />
<pre><br />
extends layout<br />
<br />
block content<br />
h1= title<br />
p Welcome to #{title}<br />
</pre><br />
<br />
それでは、Welcomeな部分を書き換えます。<br />
<pre><br />
extends layout<br />
<br />
block content<br />
h1= title<br />
p Hello world, #{title}<br />
</pre><br />
== 実行例 ==<br />
これで、Hello World<br />
<syntaxhighlight lang="bash"><br />
$ node app.js<br />
</syntaxhighlight><br />
== エラー ==<br />
=== NODE_PATHの設定を忘れている場合 ===<br />
環境変数 NODE_PATH が設定されてない場合に、以下のエラーがでます。<br />
<syntaxhighlight lang="bash"><br />
$ node app.js<br />
<br />
module.js:340<br />
throw err;<br />
^<br />
Error: Cannot find module 'express'<br />
at Function.Module._resolveFilename (module.js:338:15)<br />
at Function.Module._load (module.js:280:25)<br />
at Module.require (module.js:364:17)<br />
at require (module.js:380:17)<br />
at Object.<anonymous> (/tmp/helloapp/app.js:6:15)<br />
at Module._compile (module.js:456:26)<br />
at Object.Module._extensions..js (module.js:474:10)<br />
at Module.load (module.js:356:32)<br />
at Function.Module._load (module.js:312:12)<br />
at Function.Module.runMain (module.js:497:10)<br />
</syntaxhighlight><br />
=== jadeをインストールし忘れている場合 ===<br />
<syntaxhighlight lang="bash"><br />
Express server listening on port 3000<br />
Error: Cannot find module 'jade'<br />
at Function.Module._resolveFilename (module.js:338:15)<br />
at Function.Module._load (module.js:280:25)<br />
at Module.require (module.js:364:17)<br />
at require (module.js:380:17)<br />
at new View (/usr/local/lib/node_modules/express/lib/view.js:43:49)<br />
at Function.app.render (/usr/local/lib/node_modules/express/lib/application.js:486:12)<br />
at ServerResponse.res.render (/usr/local/lib/node_modules/express/lib/response.js:798:7)<br />
at exports.index (/tmp/helloapp/routes/index.js:7:7)<br />
at callbacks (/usr/local/lib/node_modules/express/lib/router/index.js:164:37)<br />
at param (/usr/local/lib/node_modules/express/lib/router/index.js:138:11)<br />
GET / 500 25ms<br />
</syntaxhighlight><br />
== 関連項目 ==<br />
{{Express}}<br />
<!-- vim: filetype=mediawiki<br />
--></div>
Daemon
https://kaworu.jpn.org/javascript/Express%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B
Expressをインストールする
2014-04-05T12:31:06Z
<p>Daemon: </p>
<hr />
<div>[[node.js]]の[[Express]]をインストールします。<br />
<br />
__TOC__<br />
<br />
== 概要 ==<br />
[[Express]]は、[[npm]]コマンドでインストールします。<br />
== インストール ==<br />
<syntaxhighlight lang="bash"><br />
$ sudo npm install -g express jade express-generator<br />
</syntaxhighlight><br />
<br />
== 環境変数の設定 ==<br />
<syntaxhighlight lang="bash"><br />
export NODE_PATH=/usr/local/lib/node_modules<br />
</syntaxhighlight><br />
== 使い方 ==<br />
<syntaxhighlight lang="bash"><br />
$ express -h<br />
<br />
Usage: express [options] [dir]<br />
<br />
Options:<br />
<br />
-h, --help output usage information<br />
-V, --version output the version number<br />
-s, --sessions add session support<br />
-e, --ejs add ejs engine support (defaults to jade)<br />
-J, --jshtml add jshtml engine support (defaults to jade)<br />
-H, --hogan add hogan.js engine support<br />
-c, --css <engine> add stylesheet <engine> support (less|stylus) (defaults to plain css)<br />
-f, --force force on non-empty directory<br />
</syntaxhighlight><br />
== express コマンドが見つからない場合 ==<br />
express をインストールしたのに、expressコマンドが見つからない!という場合は、express-generatorをインストールしてください。<br />
== 関連項目 ==<br />
{{Express}}<br />
<!-- vim: filetype=mediawiki<br />
--></div>
Daemon
https://kaworu.jpn.org/javascript/Express
Express
2014-04-05T12:28:02Z
<p>Daemon: ページの作成:「Expressとは、node.jsのWebアプリケーションフレームワークです。 '''読み方''' ;Express:えくすぷれす __TOC__ == 概要 == == 使...」</p>
<hr />
<div>[[Express]]とは、[[node.js]]のWebアプリケーションフレームワークです。<br />
<br />
'''読み方'''<br />
;[[Express]]:えくすぷれす<br />
__TOC__<br />
<br />
== 概要 ==<br />
== 使い方 ==<br />
{{Express}}<br />
== 関連項目 ==<br />
{{node framework}}<br />
<!-- vim: filetype=mediawiki<br />
--></div>
Daemon