kidoOooOoooOOom

ゲーム開発やってます

[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クックブック

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();
};

upstartで起動・終了周りのtips

upstartのscirptを書いていて、プロセスをkill -TERMで終了させた場合は勝手にstartしないようにしたかったので、normal exit を使用した。

start on started sshd
stop on shutdown
kill timeout 30

normal exit 0 TERM
respawn
respawn limit 2 5

script
 ....
end script

pre-start script
....
end script

pre-stop script
....
end script

また、再起動処理を永遠に繰り返してほしくないので、respawn limit を使用している。respawn limit 2 5 と書くと、5分以内の2回再起動繰り返したらそれ以上起動しないという意味とのこと。

shellで条件式書く時のオプション

dとfを間違えていてハマったのでmemo。

オプション: 使用例: オプションの意味

  • -z: test -z string : string の文字列長が 0 ならば真となる。
  • -n: test -n string : string の文字列長が 0 より大ならば真となる。
  • -d: test -d file : file がディレクトリならば真となる。
  • -f: test -f file : file が普通のファイルならば真となる。
  • -s: test -s file : file が 0 より大きいサイズならば真となる。
  • -e: test -e file : file が存在するならば真となる。
  • -r: test -r file : file が読み取り可能ならば真となる。
  • -w: test -w file : file が書き込み可能ならば真となる。
  • -x: test -x file : file が実行可能ならば真となる。

参考URL
http://shellscript.sunone.me/if_and_test.html