Node.jsでIPv6を扱う
Node.jsでIPv6を扱う場合はipv6というモジュールを使用するとよい。
https://github.com/beaugunderson/javascript-ipv6

IPを数値に変換した場合、JavaScriptの仕様上、double型と扱われ、精度が落ちる。
このライブラリではbigIntegerというライブラリを用い、それを回避している。
もし、IPの範囲の検査で大小を比較する場合は、bigIntegerが提供しているcompairToを用いて行うこと。
まちがっても自分ですべての配列の大小を比較する車輪の再開発みたいなことはしてはいけない。


なお、ドキュメントなんてものはないから、ソース読んで自分で使い方を調べなければならない。
以下に最低限必要な操作は記述した、サンプルを示す。



var v6 = require('ipv6').v6;
var address1 = new v6.Address('2001:0:ce49:7601:e866:efff:62c3:fffe');
var address2 = new v6.Address('2001:0:ce49:7601:e866:efff:61c3:0002');

// アドレスの比較をする場合はbigIntegerに変換して、compareToで比較すること
var bi1 = address1.bigInteger();
var bi2 = address2.bigInteger();

// thisがでかければ+
console.log(bi1.compareTo(bi2));
// ひとしければ 0
console.log(bi1.compareTo(bi1));
// 引数のほうが大きければ-
console.log(bi2.compareTo(bi1));

// サブネットマスクを指定して、開始アドレス、終了アドレスも取得できる。
address1.subnetMask = 64;
console.log(address1.startAddress());
console.log(address2.endAddress());


// 省略形で表示も可能
address1 = new v6.Address('2001:0:0:0:0:0:0:1');
// 2001::1 と省略形で
console.log(address1.correctForm());


[PR]
# by mima_ita | 2014-06-13 22:17 | node.js
Node.jsのサイトへのIpv6での接続方法
Node.jsで作成したサイトに以下のようにIPv6を指定してアクセスする方法について説明する
http://[fe80::20c:29ff:feb8:6dd1]:3000/

この方法は以下に記述してある。
http://code.danyork.com/2011/01/21/how-to-use-node-js-with-ipv6/

listenする際にipv6のIPを明示しろと書いてあるが、この方法はLanアダプタが複数ある場合に正常に動作しない。
複数LANアダプタが存在しても動作するようにするには下記のようにする。


var server = app.listen(app.get('port'), '::0', function() {
debug('Express server listening on port ' + server.address().port);
});



これにより、ipv4でもipv6でも、複数あるすべてのIPでlistenを行ってくれる。


[PR]
# by mima_ita | 2014-06-13 21:52 | node.js
jquery.tmplの不具合
概要
jquery.tmpl.js はJavaScriptのテンプレートエンジンだ。
勝手はJQueryの公式サイトにものっていたが、現在はメンテナンスされておらず、公式からも削除された。
https://github.com/BorisMoore/jquery-tmpl

新規開発でjquery.tmplを使用してはいけない。
しかし、既存のシステムで使用されており、変更できない場合もあり、今回は、その場合に発生する不具合について説明する

不具合

大量のデータを扱った場合、Chromeでスタックオーバフローを起こす。
http://stackoverflow.com/questions/15908000/maximum-call-stack-size-exceeded-error-in-chrome-using-jquery-templates

大量データを扱った場合、メモリを食いつぶしブラウザがクラッシュする。
tmplではtmplで指定したデータを各要素のjQuery.dataに保持している。
この値は$('hoge').tmplItem()で取得できる。
この機能は通常なら有用だが、大量にデータを扱う場合にメモリーを食いつぶし、ブラウザがクラッシュすることになる。
このことはすでにtmplの問題として報告されている。

このバグはjquery.tmplの問題として報告されており、修正はされていない。
https://github.com/BorisMoore/jquery-tmpl/issues/80

修正後のファイル
以下のファイルは上記の不具合に対応したものである。
http://needtec.sakura.ne.jp/release/jquery.tmpl.js

以下のように使用すれば、データを保持しないようにしている。
$('#id').tmpl(datas,undefined,undefined,false).appendTo('#id2');

なお、フラグとかを付与せず、一括で保持しない場合は、build関数でstoreTmplItemsを呼ばないようにすれば、データは保持しない。



[PR]
# by mima_ita | 2014-06-13 21:32 | JQuery
Jadeで処理を共通化する
概要
Node.jsのexpressで使用するテンプレートエンジンである、Jadeで処理を共通化する方法を説明する。
http://jade-lang.com/reference/

includeによる共通化
includeを用いることで外部ファイルを使用できる
複数のファイルで共通する処理は別ファイルにまとめて、includeすればよい。

例:
message.jade

div#message(style='display:none')
- for(var key in message) {
div(id='#{key}') #{message[key]}
-}


project.jade

// HTML
doctype html
html
head
title #{message.title}
link(rel='stylesheet', href='/stylesheets/style.css')
link(rel='stylesheet', href='/stylesheets/ui-lightness/jquery-ui-1.10.4.min.css')
link(rel='stylesheet', href='/javascripts/lib/msgbox/msgBoxLight.css')
script(type='text/javascript', src='/javascripts/lib/jquery-1.11.1.min.js')
script(type='text/javascript', src='/javascripts/lib/jquery-ui-1.10.4.min.js')
script(type='text/javascript', src='/javascripts/lib/msgbox/jquery.msgBox.js')
script(type='text/javascript', src='/javascripts/src/ui_util.js')
script(type='text/javascript', src='/javascripts/src/project.js')
body
h2 #{message.title}
include message


mixinによる共通化
同じファイル内で特定のブロックを繰り返したい場合は、mixinを使用するといい。
mixinを使用する際に、引数を与えることができるので、それにより、各繰り返し要素の内容を変更できる。
以下の例では追加用のダイアログと変更用のダイアログのHTMLを共通的に作成している。



// エディット用のダイアログ
// @param id DialogのID
mixin editDialog(dialogId, saveBtnId)
div(id=dialogId, class='dialog', style='display:none')
div #{message.projectName}
input(type='text', name='projectName')#projectName
div #{message.path}
input(type='text', name='path')#inputPath
button#addPath +
button#deletePath -
br
select(multiple style="width:100%;")#selectPath
br
button(id=saveBtnId) #{message.saveBtn}

// HTML
doctype html
html
head
title #{message.title}
link(rel='stylesheet', href='/stylesheets/style.css')
link(rel='stylesheet', href='/stylesheets/ui-lightness/jquery-ui-1.10.4.min.css')
link(rel='stylesheet', href='/javascripts/lib/msgbox/msgBoxLight.css')
script(type='text/javascript', src='/javascripts/lib/jquery-1.11.1.min.js')
script(type='text/javascript', src='/javascripts/lib/jquery-ui-1.10.4.min.js')
script(type='text/javascript', src='/javascripts/lib/msgbox/jquery.msgBox.js')
script(type='text/javascript', src='/javascripts/src/ui_util.js')
script(type='text/javascript', src='/javascripts/src/project.js')
body
h2 #{message.title}
+editDialog('dlgAddProject', 'btnAddProject')
+editDialog('dlgEditProject', 'btnUpdateProject')


[PR]
# by mima_ita | 2014-06-13 21:01 | node.js
Sequelizeでキーを組み合わせてユニーク制約を使う場合
node.jsのSequelizeでキーを組み合わせてユニーク制約を使う場合、次のようにします。

uniqueプロパティはboolean型ならば、その列にユニーク制約を与えます。
文字列の場合は、同じ文字列の列と組み合わせてユニーク制約となります。
もし、別のテーブルと関連づけがあり、自動で生成される列の場合でも、制約をつけたい場合は、明示的に列を指定しなければいけません。明示的に列を作成した場合は、hasManyなどを行う場合、asでどの列が外部キーであるか指定する必要があります。


module.exports = function(sequelize, DataTypes) {
var RootPath = sequelize.define('RootPath', {
path: {
type: DataTypes.STRING,
unique: 'projectPathIndex'
},
ProjectId: {
type: DataTypes.INTEGER,
unique: 'projectPathIndex',
allowNull: false
}
}, {
classMethods: {
associate: function(models) {
RootPath.hasMany(models.Project, {as:'ProjectId'});
}
}
});

return RootPath;
};


[PR]
# by mima_ita | 2014-06-13 14:47 | node.js



実験ですお
検索
カテゴリ
最新の記事
.NET4.5におけるasy..
at 2014-07-02 00:46
.NETでTwitterを検..
at 2014-06-29 00:49
Redmineのプラグインで..
at 2014-06-28 03:29
IO.popenのwrite..
at 2014-06-28 03:25
RedmineのWikiでU..
at 2014-06-28 03:16
以前の記事
最新のトラックバック
その他のジャンル
ブログパーツ