カテゴリ:node.js( 13 )
javascriptやnode.jsにおけるプロパティの存在チェック
オブジェクトobjでプロパティxの存在をチェックする方法

// 駄目な例:
if (obj.x) {
// プロパティがある場合
}

もし、obj.xがnull,0,undefined,""の場合、プロパティがないと見なされる。


正しく判断する例1
if (x in obj) {
// プロパティがある場合
}

正しく判断する例2
if (obj.hasOwnProperty('x')) {
// プロパティがある場合
}


[PR]
by mima_ita | 2014-06-27 00:20 | node.js
jasmine-nodeのXML出力で日本語のファイル名にならない場合
jasmine-nodeは--junitreportを使用することでXML形式としてテスト結果を出力できる。
しかし、jasmien-nodeが使用しているjasmine-reportersの不具合で日本語が正常に動作しない。

以下のようなファイルが存在するとする。

describe("test\\足し算の確認", function() {
beforeEach(function() {
// テスト前処理
});

afterEach(function() {
// テスト後処理
});

it("足し算が正しい", function() {
expect(addition(1, 2)).toEqual(3);
});
});


この場合、期待の出力結果としては、記号が除去されたファイル名「TEST-test足し算の確認.xml」が作成されることが期待される。
しかし、げんじょうは「TEST-test.xml」となる。

これを修正するパッチは以下のとおりである。

jasmine-nodeのバージョン:1.14.3
修正パッチ:
http://needtec.sakura.ne.jp/release/jasmine.junit_reporter.js.patch

パッチ適用のコマンド例:
patch -u ../node_modules/jasmine-node/node_modules/jasmine-reporters/src/jasmine.junit_reporter.js < jasmine.junit_reporter.js.patch


[PR]
by mima_ita | 2014-06-19 00:21 | node.js
JSONファイルにコメントをつけたい場合どうするか?
概要
JSONファイルにコメントをつけたい場合どうするか?

対処案1
データにコメントを混ぜる


{
"id":1,
"text":"test",
"comment": "このデータはhogeです"
}


対処案2
コメント行を自力で抜く


// 参考 https://github.com/lorenwest/node-config/blob/master/lib/config.js
var fs = require('fs');
console.log(readJson('/share/test.json'));

function readJson(fullFilename) {
var fileContent;
try {
fileContent = fs.readFileSync(fullFilename, 'UTF-8');
} catch (e2) {
throw new Error('Config file ' + fullFilename + ' cannot be read');
}
var configObject = JSON.parse(_stripComments(fileContent));
return configObject;

function _stripComments(fileStr) {

var uid = '_' + +new Date(),
primitives = [],
primIndex = 0;

return (
fileStr

/* Remove strings */
.replace(/(['"])(\\\1|.)+?\1/g, function(match){
primitives[primIndex] = match;
return (uid + '') + primIndex++;
})

/* Remove Regexes */
.replace(/([^\/])(\/(?!\*|\/)(\\\/|.)+?\/[gim]{0,3})/g, function(match, $1, $2){
primitives[primIndex] = $2;
return $1 + (uid + '') + primIndex++;
})

/*
- Remove single-line comments that contain would-be multi-line delimiters
E.g. // Comment /* <--
- Remove multi-line comments that contain would be single-line delimiters
E.g. /* // <--
*/
.replace(/\/\/.*?\/?\*.+?(?=\n|\r|$)|\/\*[\s\S]*?\/\/[\s\S]*?\*\//g, '')

/*
Remove single and multi-line comments,
no consideration of inner-contents
*/
.replace(/\/\/.+?(?=\n|\r|$)|\/\*[\s\S]+?\*\//g, '')

/*
Remove multi-line comments that have a replaced ending (string/regex)
Greedy, so no inner strings/regexes will stop it.
*/
.replace(RegExp('\\/\\*[\\s\\S]+' + uid + '\\d+', 'g'), '')

/* Bring back strings & regexes */
.replace(RegExp(uid + '(\\d+)', 'g'), function(match, n){
return primitives[n];
})
);
};
}



[PR]
by mima_ita | 2014-06-18 19:56 | node.js
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
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
seleniumを使ってJavaScriptのみでWebUIを自動操作する
目的
seleniumをnode.jsで操作する
これによりJavaScriptのみでWebUIの自動操作が可能になる。

前提
 node.jsがインストールされている

Chromeでの自動操作
1. 下記のコマンドを実行
npm install selenium-webdriver

2. 以下のソースコードを実行


var webdriver = require('selenium-webdriver');
require('webdriver-helper');

var driver = new webdriver.Builder().
withCapabilities(webdriver.Capabilities.chrome()).
//withCapabilities(webdriver.Capabilities.ie()).
//withCapabilities(webdriver.Capabilities.firefox()).
build();

driver.get('https://secure.nicovideo.jp/secure/login_form');
driver.findElement(webdriver.By.xpath('//div[@class="loginFormWrap"]//form//input[@id="mail"]')).sendKeys('test');
driver.findElement(webdriver.By.xpath('//div[@class="loginFormWrap"]//form//input[@type="submit"]')).click();
driver.wait(function() {
return driver.findElement(webdriver.By.xpath('//div[@class="loginFormWrap"]//div[@class="wrongPass"]/p')).getText().then(function(txt) {
return '入力したメールアドレスまたはパスワードが間違っています' === txt;
});
}, 5000);
driver.quit();


IEでの自動操作
1. selenium-server-standaloneとIEDriverServerを入手する
http://docs.seleniumhq.org/download/

2. selenium-server-standaloneを起動する
java -jar selenium-server-standalone-2.39.0.jar -Dwebdriver.ie.driver=C:\dev\node\selenium\IEDriverServer32.exe

3. 以下を実行

var webdriver = require('selenium-webdriver');
require('webdriver-helper');

var driver = new webdriver.Builder().
//withCapabilities(webdriver.Capabilities.chrome()).
withCapabilities(webdriver.Capabilities.ie()).
//withCapabilities(webdriver.Capabilities.firefox()).
build();

driver.get('https://secure.nicovideo.jp/secure/login_form');
driver.findElement(webdriver.By.xpath('//div[@class="loginFormWrap"]//form//input[@id="mail"]')).sendKeys('test');
driver.findElement(webdriver.By.xpath('//div[@class="loginFormWrap"]//form//input[@type="submit"]')).click();
driver.wait(function() {
return driver.findElement(webdriver.By.xpath('//div[@class="loginFormWrap"]//div[@class="wrongPass"]/p')).getText().then(function(txt) {
return '入力したメールアドレスまたはパスワードが間違っています' === txt;
});
}, 5000);
driver.quit();

注意
Selectの操作はoptionに対してclick()を行う。
Javaとかと違って便利なSelectクラスなどはない。

IEのSendKeyが遅い場合は、IEDriverServerを64bitにしたり、32bitにしてみる。
http://devadjust.exblog.jp/19305561/


[PR]
by mima_ita | 2014-06-11 18:04 | node.js
node.js + expressにおける多言語化の考察
目的:
本稿はnode.js+expressにおいて多言語化をどのようにするか考察する。

サンプル:
http://needtec.sakura.ne.jp/release/node_globalization_sample.zip

このサンプルはログイン画面とユーザ登録画面について、多言語化対応できるように実装している。
Sequelizeのエラーメッセージについては、対応できていない


More
[PR]
by mima_ita | 2014-06-08 00:09 | node.js
sequelizeによるマイグレーションの方法
sequelize-cliをインストールすることにより、DBのマイグレーションが可能になる。
この機能により、本来は困難であるはずのDBスキーマーの更新を容易にすることが可能になる。

下記を参考にすること。
http://sequelizejs.com/docs/latest/migrations

More
[PR]
by mima_ita | 2014-06-05 22:46 | 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
以前の記事
最新のトラックバック
その他のジャンル
ブログパーツ