Node v8.9.0 LTS & v9.0.0リリース

Node v8.9.0 LTSがリリースされました。 今回のリリースで機能的に特筆するようものはありませんが、今後はエッジな変態プログラマじゃない人もasync awaitを積極的に使ってOKという事で記念すべきリリースですね。コールバック地獄も過去のものになりました…

Node v8.xのHTTP/2を試す、その2

続き HTTP/2のpushも試す 今度はこんな感じ。createSecureServerにenablePushオプションを付けないとダメっぽい。 const http2 = require('http2'); const fs = require('fs') const server = http2.createSecureServer({ key: fs.readFileSync('./server.ke…

Node v8.xのHTTP/2を試す

Node v8.8.0がリリースされたが、まだLTSにならない。どうやらv8.x LTSは10/31リリース目標でまだお預けらしい。 気を取り直してv8.8.0のchange logを眺めると、今回のリリースからHTTP/2モジュールがデフォルトで有効になったようだ。実験的実装という位置…

golangのappendの速度比較

Go

appendって毎回新しいスライスが作られているような感じに見えるので、なんか遅そうなイメージがあるんすよね。まぁ、実際には内部で参照している配列のキャパシティに余裕があれば空きに追加されるだけなのでキャパシティさえあれば高速なのだが。 では、実…

Golangの構造体、値のスライスとポインタのスライス

Go

構造体の値のスライスとポインタのスライス、どちらがいいのか? こんな構造体とJSON文字列を定義して… type Hoge struct { Nyan int64 Wang string } const jsonStr = `[{"nyan":1, "wang":"aaaa"}, {"nyan":1, "wang":"bbbb"}]` ポインタのスライスの場合 …

JSコード片をObjectURL化してWeb Workerで実行

今Web WorkerといえばService Workerの話題ばかりですが、これからするのは普通のWorker(Dedicated Worker)の話です。 Web Workerはバックグラウンドでスクリプトを実行できるものです。 重い処理をJSで実行するとUIが固まって何の操作も受け付けなくなり…

Golangの構造体比較

Go

Goでは構造体を == で比較できるらしい。 package main import ( "fmt" "unsafe" ) type Hoge struct { t bool d int s string } func main() { a := Hoge{t: true, d: 1, s:"nyan"} b := Hoge{t: true, d: 1, s:"nyan"} c := a // 値コピー d := &a // ポイ…

絶対ハマるらしいgolangのnilにハマった件

絶対ハマる、不思議なnil - Qiita nil だと思ってやつが nil じゃなかった - Golang · m0t0k1ch1st0ry ハマりましたwwww func main() { var e1 error e1 = x() if e1 == nil { fmt.Printf("e1 == nil: %v\n", e1) } else { fmt.Printf("e1 != nil: %v\n"…

scannerで読み込んだ行を並列でjson.Unmershalすると壊れる

golang歴4時間です。 1行1JSONなファイルを処理するため、以下のようなコードをかいたところjson.Unmarshalでエラーになりました。 func main() { scanner := bufio.NewScanner(os.Stdin) ch := make(chan bool, 3) var wg sync.WaitGroup for scanner.Scan(…

Node.jsでセグメンテーションフォルトが発生したので調査した

Node.js v4.3をv4.8にアップデートしたところsegmentation faultが多発するようになった。 /var/log/messages を見ると以下のようなログが残っている May 15 08:51:32 hostname-hoge001 kernel: node[11262]: segfault at a764a503788 ip 0000000000aecd71 s…

Node.jsのヒープサイズ表示が修正されていた

以前、–max_old_space_sizeに大きな値を指定するとヒープサイズの表示がおかしいなー、もしかして4GB以上は指定できないのかなー、どうせそんな値指定しないからいっかー、とか思っていたのだが、表示のバグで6.10.1で修正されていた。 $ nvm use v6.10.0 No…

Node.js v8とasync function

Node.js v8.0.0のリリースが近い。v8は10月にリリースされるLTSの候補版、マイルストーンとして非常に重要なリリースとなる。 LTSラベルは4系列がArgon(アルゴン)、6系列がBoron(ホウ素)だったので、8系列のLTSはCarbon(炭素)あたりが有力なんすかね?…

mongoDBのcount正しくない問題

mongoDBでは、シャーディングされたコレクションのcountが正しい値を返さないことがあります。これには2つの原因があります。 チャンク移動中である 孤児ドキュメントが存在する 1は、チャンク移動中は正しい値が帰らないということです。シャード間でデータ…

Node.jsの循環参照問題

モジュールの循環参照というNode.jsユーザの間ではよく知られている問題がある。 requireしたモジュールのメソッドやプロパティがundefinedになってしまうという問題だ。これは以下の条件で発生する モジュールaとモジュールbが互いにrequireしている 間に他…

スクリプトのコマンドライン引数にタブを渡す

Node.jsとかRubyとかPythonのスクリプトでコマンドライン引数を受け取る時、引数にタブ文字を指定する方法 var a = process.argv[2]; console.log([1,2,3].join(a)); 実行 > node hoge.js \t 1t2t3 > node hoge.js '\t' 1\t2\t3 正解は > node hoge.js $'\t'…

JavaScriptの型変換に今更刺し殺される

ある日デバッガを見ていたらこんな文字列が目に入った Mon Feb 13 2017 18:55:53 GMT+0900 (JST)1000 ナニコレ…? ソース見たらこんな風になっていた var now = new Date(); var startTime = now - 1000; var endTime = now + 1000; Dateオブジェクトに数値…

mongodb 2系と3系でpropertyの並び順が変わった

mongodbを2.4から3.2にアップグレードする作業を行っている。3.2にするとテストが大量に失敗するようになったのだが、その原因の一つがこれ。 2.4 > db.Test.update({_id: "nyan"}, {$set: {hoge: {b: {x: 1}}}}, {upsert: true}); > db.Test.findAndModify(…

npm 2.15ではdevtoolsetのgccでビルドできません

Node.js v4系のネイティブモジュールをビルドするにはC++11対応のコンパイラが必要です。 CentOS 6のgccは4.4と古くてビルドすることができないのですが、devtoolsetでgcc 4.8を入れることでネイティブモジュールを npm install できるようになります。 sudo…

node.jsでモジュールを再ロードする

requireされたモジュールは、モジュールのフルパスをキーとしてrequire.cacheというオブジェクトに格納されており、これを削除すればモジュールを再びロードできるらしい。というわけでテスト。 # main.js console.log(process.pid); setInterval(function()…

ag(the silver searcher)でリテラル検索

agは内部でpcreを使っているようで、デフォルトで . はワイルドカードとして扱われてしまう。ドットそのものを検索するには ag -Q .save ./lib のように-Q(--literal、または-F)オプションを指定する。 -Qの代わりに2重のバックスラッシュでエスケープし…

ボックス=ミューラー法

よしコクのある乱数の実際のサンプルをアップした。こうやって並べてみると、味の違いは一目瞭然。 https://t.co/esbYaYWYLh— 深津 貴之 (@fladdict) November 4, 2016 ボックスミューラー法の養殖された乱数とはww? 10000.times { x = rand() y = rand()…

乱数にコクを出す?

togetter.com コクとはww? count = (ARGV[0] || 1).to_i 10000.times do puts Array.new(count) { rand() }.inject(&:+) / count end rand.rbとして保存 $ ruby rand.rb 1 | pbcopy これをgoogleスプレッドシートでグラフにする rand - Google スプレッド…

node v6 LTSリリース

node v6.9.0が新しいLTSライン(Boron)としてリリースされた。 Node v6.9.0 (LTS) | Node.js v4系列からアップグレードするにあたって、大きな変更点は ECMAScript機能の追加 Bufferコンストラクタの非推奨化 npm v3 その他はリンク先を参照。 新しいECMASc…

XSSを発見した。またはJSダブルクオートのススメ

もう修正・対策済みなので喋ってしまいますが、自社のサービスにXSS脆弱性を見つけてしまったのです。 サーバサイドは node.js で、テンプレートエンジンは jade(pugjs)。問題のコードを簡略化して書くと以下のようになります。 head script var hoge = { a:…

parseIntを小数点切り捨てに使わない

TwitterのTL上でにわかに話題になっていた。parseIntは引数をstringにしてからint変換するので、小数点以下の切り捨てには使わん方が良いというお話。 > parseInt(0.000001) 0 > parseInt(0.0000001) 1 これは以下のように処理されているのと同じ > (0.00000…

クロージャとbindの引数束縛パフォーマンス

JavaScriptで引数を束縛したい場合、クロージャかbindを使うのだが… function plus(x, y) { return x + y; } function multiply(x, y) { return x * y; } // Function.prototype.bindで束縛 const plus1 = plus.bind(null, 1); plus1(5); // => 6 // closure…

generatorとpromiseで行う非同期処理

2年ぐらい前にgeneratorでコールバック地獄から解放されるぜウェーイと話題になりましたが、今現在、世間ではgeneratorによる非同期処理ってどのくらい使われているんでしょうね? 自分たちのチームでは今更過去のコードを書き直すのも面倒なので使ってませ…

obj && obj.hoge && obj.hoge.fuga ... を少し簡単に書く

Qiitaにも投稿してみた JSerの皆様につきましては、JSON.parseしたデータなど、多段ネストしたオブジェクトのプロパティにアクセスするとき、 const obj = {hoge: {fuga: {piyo: 1}}}; const value = obj && obj.hoge && obj.hoge.fuga && obj.hoge.fuga.piy…

関数の可変長な仮引数を直接コンストラクタに渡す

ある関数が受け取る可変長引数を、コンストラクタに直接渡す方法 要するにコンストラクタが可変長引数を受け取るのでファクトリ関数も可変長引数を使えるようにしたいんですよ。 ES2015ならばこう。 'use strict'; class Hoge { constructor(...args) { cons…

ES2015以前の可変長引数の書き方

LTSのnode 4系ではRest Parametersは使えんのですよね。 'use strict'; function x(a, var_args) { const args = Array.prototype.slice.call(arguments, 1); console.log(a); console.log(args); } x('a'); x('b', 1); x('c', 1, 2); x('d', 1, 2, 3); 可変…