kidoOooOoooOOom

ゲーム開発やってます

nodejsで文字コードがsjisのcsvを取得して出力

svnサーバにあがっているcsvファイルを、httpsで取得してごにょごにょ処理をする必要があったのでメモ。
最初、httpsモジュール使って書いてたけど、文字化けがどうしても解決できなくて request モジュールに変えて enconding = null のオプションを使ったら解決した(http clientライブラリの中でレスポンスをそのまま返してもらえるように)。
sjisの文字をutf-8に変換するのは、iconvモジュール、csvのパースは csv-parseというモジュールを使った。
また、普通にhttpsプロトコルでrequestを送信すると、UNABLE_TO_VERIFY_LEAF_SIGNATUREエラーが帰ってくるので、一旦無視するようにしている。

下記がサンプルコード。

var Iconv = require('iconv').Iconv;
var sjis = new Iconv('SJIS', 'UTF-8//TRANSLIT//IGNORE');
var csvParse = require('csv-parse');
var url = require('url');
var request = require('request');

// for avoid UNABLE_TO_VERIFY_LEAF_SIGNATURE error
process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';

var url = url.parse('https://svnhogehoge');

request({ url: url, encoding: null }, function (error, response, body) {
  if (!error && response.statusCode == 200) {
    body = sjis.convert(body).toString();
    csvParse(body, function(err, csvOutput) {
      console.log(csvOutput);
    });
  }
});

プログラマのための文字コード技術入門 (WEB+DB PRESS plus) (WEB+DB PRESS plusシリーズ)

プログラマのための文字コード技術入門 (WEB+DB PRESS plus) (WEB+DB PRESS plusシリーズ)

mongodbでクエリログを全部みたい

setProfillingLevelを2にする。

$ mongo
> use myDb
switched to db myDb
> db.getProfilingLevel()
0
> db.setProfilingLevel(2)
{ "was" : 0, "slowms" : 1, "ok" : 1 }
> db.getProfilingLevel()
2
> db.system.profile.find().pretty()

これでquery log 見れる。
また、setProfillingLevelの第2引数で slow query の閾値を決める。

参考:
http://stackoverflow.com/questions/15204341/mongodb-logging-all-queries
http://docs.mongodb.org/manual/reference/method/db.setProfilingLevel/


MongoDBイン・アクション

MongoDBイン・アクション



追記
user_idや時間等でクエリを特定したい場合は下記のようなクエリで特定させればok

b.system.profile.find({"query.user_id":40447, "ts": {"$gt": ISODate("2015-05-27T12:18:35.435Z")}});

[JS] スネークケースのstring/object keys を キャメルケースに変換

最近はガリガリ開発していてそっちでアウトプットしているので、ブログには書く頻度が減ってしまった。
今日書いたコードは糞だけど汎用性あるのでこっちにメモ

  /**
   * Convert snake case string or object keys to camel case.
   */
  convertSnakeToCamel: function(snake) {
    if (!snake) {
      return snake;
    }

    var camel;
    var that = this;
    if (typeof snake === 'string') {
      camel = snake.replace(/_./g, function(matched) {
        return matched.charAt(1).toUpperCase();
      });
      return camel;
    }

    _.each(snake, function(value) {
      if(_.isObject(value) === true) {
        return that.convertSnakeToCamel(value);
      }
    });

    for (var prop in snake) {
      if ((prop.indexOf('_') !== -1) && snake.hasOwnProperty(prop)) {
        var tmp = snake[prop];
        delete snake[prop];
        camel = this.convertSnakeToCamel(prop);
        snake[camel] = tmp;
      }
    }
    return snake;


Nodeのcryptoモジュールで AES algorithmの暗号・復号

例えば秘密鍵が 123456789key で、Hello worldという文字列を暗号・復号すると下記のようになる。

var crypto = require('crypto');

var secretKey = '123456789key';
var text = 'Hello world';

var hash = crypto.createHash('md5');
hash.update(secretKey, 'utf8');
var key = hash.digest();

hash = crypto.createHash('md5');
hash.update(secretKey + 'randomToken');
var ive = hash.digest();

var cipher = crypto.createCipheriv('aes-128-cbc', key, ive);
var crypted = cipher.update(text, 'utf8', 'hex');
crypted += cipher.final('hex');
console.log('暗号結果: ' + crypted);

var decipher = crypto.createDecipheriv('aes-128-cbc', key, ive);
var dec = decipher.update(crypted, 'hex', 'utf8');
dec += decipher.final('utf8');
console.log('復号結果: ' + dec);

cipher.update と decipher.update とで引数の input/outputが逆になるのが注意。
また、ivとはCBCモードで必要になるinitialization vector (初期化ベクトル)のこと。
暗号ブロックを使い回して暗号処理をするCBCでは、初期化の値が必要なのでそれを用意してあげる。
このivは第3者に見られても問題はない。

Nodeクックブック

Nodeクックブック

markdownでchecklist

Rebuild.fm を聞いていたら、pull req のコメントに markdown で checklistを書いて進捗具合を可視化するという方法がいいようなので、今後やっていきたい。
markdownでchecklist書く場合は以下のような感じ。

- [ ] チェック項目
- [ ] 未完了タスク
- [x] 完了済みタスク

gitでやり直し系の操作

こちらを見て勉強。
http://d.hatena.ne.jp/idesaku/20091106/1257507849

  • 前回のコミットをちょっとだけ修正したい場合。
git-commit --amend

を使う。ミスコミットをしてしまった後に修正をして、上記コマンドを実行すればおk。

  • もっと前のコミット操作などを修正したい場合
    • git reset と git reflog を使う。git reflogでコミット履歴を見て、git reset --hard で対象のコミットをresetできる。


git rebaseについてはこちらの記事が参考になった。
http://liginc.co.jp/web/tool/79390


GitHub実践入門 ~Pull Requestによる開発の変革 (WEB+DB PRESS plus)

GitHub実践入門 ~Pull Requestによる開発の変革 (WEB+DB PRESS plus)

reponse返却イベントで処理

Nodeでリクエストが来たタイミングと、レスポンスを返すタイミングでログを出したいような場合、下記のようなmiddlewareを登録すればおk。

exports.accessLogger = function(req, res, next) {
  var logResponse = function() {
    res.removeListener('finish', logResponse);
    res.removeListener('close', logResponse);
    // レスポンスに関してのログ出力処理
  };

  // リクエストに関してのログ出力処理

  res.on('finish', logResponse);
  res.on('close', logResponse);
  next();
};