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シリーズ)
- 作者: 矢野啓介
- 出版社/メーカー: 技術評論社
- 発売日: 2010/02/18
- メディア: 単行本(ソフトカバー)
- 購入: 34人 クリック: 578回
- この商品を含むブログ (132件) を見る
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/
- 作者: Kyle Banker,Sky株式会社玉川竜司
- 出版社/メーカー: オライリージャパン
- 発売日: 2012/12/14
- メディア: 大型本
- 購入: 5人 クリック: 55回
- この商品を含むブログ (7件) を見る
追記
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;
コーディングを支える技術 ~成り立ちから学ぶプログラミング作法 (WEB+DB PRESS plus)
- 作者: 西尾泰和
- 出版社/メーカー: 技術評論社
- 発売日: 2013/04/24
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (33件) を見る
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者に見られても問題はない。
- 作者: David Mark Clements,和田祐一郎
- 出版社/メーカー: オライリージャパン
- 発売日: 2013/02/23
- メディア: 大型本
- 購入: 2人 クリック: 4回
- この商品を含むブログ (5件) を見る
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)
- 作者: 大塚弘記
- 出版社/メーカー: 技術評論社
- 発売日: 2014/03/20
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (17件) を見る
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(); };