読者です 読者をやめる 読者になる 読者になる

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); 可変…

高速な同一の文字列結合

クソではないと言ったが、同一の文字列連結に関してはもっと高速なアルゴリズムがある。 たとえばxからxxxxxxxxという文字列を生成するなら x + x xx + xx xxxx + xxxx 普通にループすると8回の結合が必要だが3回で済む。このアルゴリズムを適用したパディン…

left-padの文字列連結はクソではない

例のleftpad, GCを虐めるためとかコンパイラの最適化を確認するために用意する、「無駄に一時オブジェクト量産するクソコードの典型例」みたいな実装なので、こんな小さい関数のために、信頼できない人のコードを、実装を見るでも無く、依存性追加してたって…

nodeをv0.8系からv4系にアップデートした話

リクルートテクノロジー社で自社サービスをv0.8からv4系にアップデートしたという話を目にしたのだが、偶然うちも同じようにv0.8からv4にアップデートしている。当時のメモが出てきたのでここに記しておく。なお、すでに5系が出ていたが新規開発ではないし人…

自分でbuildしたrubyをrbenvで管理する

昔々のrails(2.3系)を動かしたくなったので古いrubyが必要になったのだが、その古いrubyがruby-buildでビルドできなかったので自分でビルドしてrbenvで管理させることにした。 $(rbenv root)/versions の下にインストールするとrbenvの管理対象になるので…

1行のJSONをgit diffで比較

git diffで1行にデータが詰まっているJSONをいい感じに差分表示する方法 jqをインストール $ brew install jq Gitの属性を付ける(*.jsonにマッチするファイルはdiffの前にjsonフィルタを通すように) $ echo "*.json diff=json" >> .gitattributes または $…

snake_caseなプロパティにcamelCaseでアクセス

とあるAPIのレスポンスJSONのキーがsnake_caseだが、JavaScript的にはcamelCaseでプロパティアクセスしたいんだよなー、みたいな話を某所で見かけた。 ES2015 Proxyを使って解決してみる。 function toSnakeCase(name) { name = name.replace(/([A-Z]+)([A-Z…

Hostname/IP doesn't match certificate's altnames

node v0.8時代のアプリをv4.2で起動したら、Hostname/IP doesn't match certificate's altnames というエラーが出て動作しなかった。 HTTPSリクエストで、リクエストホスト名とサーバ証明書に記されたドメインが一致しないというエラーメッセージ。node v0.1…

do式

do式が実装された - JS.next へえ〜 ES7のfeatureなので、正式に標準化されるのは2017年以降になると思われますが、babelでは--stage=0ですでに動くようです。 // hoge.js let x = 3 let y = do { let a = 1; var b = 2; a + b + x; } // console.log(a); //…

toCamelCase / to_snake_case

JavaScriptでcamelCaseとsnake_caseの変換 function toCamelCase(name) { return name.replace(/_(.)/g, function(_, $1) { return $1.toUpperCase(); }) // 先頭も大文字にするならこっち // return name.replace(/(?:^|_)(.)/g, function($$, $1) { return…

不思議なfizzbuzz

社内チャットにて > @here 面白いfizz buzz実装がありました。 https://gist.github.com/kazuho/3300555 > Javaではできなさそうなfizz buzzですね^^ > ですねぇ~(^ω^) https://gist.github.com/kazuho/3300555 innerクラスとか匿名クラス駆使すれば…

ES6で末尾再帰呼び出しの最適化

ECMAScript 6thには仕様として末尾呼び出しの最適化が盛り込まれている(ECMAScript 2015 Language Specification14章の6)。そしてES 6thのコードをES 5thに変換するbabelは末尾再帰呼び出しの最適化を実装しているらしい。試してみた。 再帰といえば定番の…

node.jsのPromiseでTwitter APIにアクセス

ECMAScript 6thが正式版になったのでPromiseを使ってみたい! というわけで、Twitter APIにアクセスしてOAuth 1.0のアクセストークンをゲットするコマンドラインツールをPromiseで書いてみました。 OAuth 1.0ではアクセストークンを取得する過程で、ブラウザ…

homebrewでGitHub API rate limit exceeded

brew updateやsearchのコマンドを実行したときにGitHub API rate limit exceededと表示されてエラーになった場合の対策メモ まず、https://github.com/settings/tokens でGithubのAPIトークンを作成する。権限はrepoがあればよさそう。 次に作成したトークン…

小笠原諸島西方沖地震M8.5

はい、みなさん巨大地震ですよ。 M8.5という数字にも驚きですが、今回の地震の震源はなんと地下590km。 実は、小笠原や鳥島の近くではこのような地下深くで大きな地震がよく発生します。最近では2012年の1月1日に鳥島近海の地下390kmでM7.0の深発地震が発生…

cursorを回しつつupdateすると同じドキュメントが二回更新される

mongoDBでcursorでコレクションを取得しつつupdateすると、同じドキュメントが二回updateされたり、全くされなかったりすることがあるようだ。 たとえば次のようなクエリをmongoシェルから流すと db.Hoge.find().forEach(function(result) { db.Hoge.update(…

fluentdとrewrite-tag-filterプラグインで任意のmongoDBコレクションにログを保存

fluentdでログの内容によって保存先のmongoDBコレクションを変えたくなったので調べてみた。 mongoプラグインにはタグをコレクション名とするtag_mappedオプションがある rewrite-tag-filterプラグインはログ内容によってタグを変更できる 求めているものは…

node v0.12の公開鍵暗号API

Added APIs for RSA public/private key encryption/decryption. Node v0.12.0 (Stable) cryptoモジュールに公開鍵暗号のAPIが追加されたそうなので試す。 鍵生成 $ openssl genrsa 2048 > test_private.key $ openssl rsa -pubout < test_private.key > tes…

postgresのJSONカラムに触ってみた

準備 まずメモリ上にDB用の領域を確保。MacOSXではhdiutilというコマンドでディスクイメージを作成するのがお手軽。Linuxなら普通にtmpfsでどうぞ。 $ hdiutil attach -nomount ram://256000 /dev/disk2 $ newfs_hfs /dev/disk2 Initialized /dev/rdisk2 as …

securityコマンド

Mac

MacOSXにはsecurityというコマンドがあって、これを使うとシェルからキーチェーンにアクセスできる。OSXのコマンドはLinuxではなくBSD由来だが、securityはOSXの機能にアクセスするコマンドなのでたぶんOSX専用だろう。 MacOSX - シェルスクリプトで使用する…

Apple Careに登録

Mac

購入したMacのApple Careの登録を忘れていたので、さきほど行った。 Apple Storeで本体と同時に購入すれば、ストアのスタッフが登録してくれるが、今回は本体と別に購入したので自分で登録した。 この登録は購入から1年以内しかできない。Macは1年だが、iPho…

新Mac購入と移行作業

Mac

3年ぶりにMacを買い替えた。新しいマシンは13インチ MacBook Pro (mgx92j/A) 。 13インチ Retina MacBook Proのモニタピクセル数は2560 * 1600。標準解像度は1280 x 800。液晶の4pixelで1dotが構成されるイメージだが、もちろん4pixelを一つの固まりとして…

Excelにエビデンス貼り付けする理由

Excelにスクリーンショットを貼るのは"テストしました"って証拠だから。してないのにテストしたって言う開発者とか、テストしないで納品しようとする会社なんて普通にあるので、対策として一番手っ取り早い方法。 SIerの闇・Excelにエビデンス貼付け - Toget…

pecoでlaunchctl start/stopを呼びやすくする

Mac

最近社内の一部でpecoが流行っているので、流行に乗ってlaunchctl start/stopの対象をペコるシェル関数を作ってみた。 function launchctl-start() { local SERVICE_NAME SERVICE_NAME=$(launchctl list | grep "^-" | peco | head -n 1 | cut -f 3) if [ -n…

node.jsのrequire相対パスうざい問題

node.jsのrequire相対パスうざい問題 - Qiita 結局シンボリックリンク方式が採用されました。

廃止されるかもしれないautoloadの代わりを用意する

Rubyのautoloadは廃止されるかもしれないので、代わりの方法を用意しておきたい。 Rubyにはconst_missingというヤバいメソッドがある。このメソッドは未定義の定数にアクセスした時、NameErrorが発生する前に処理をフックする事ができる。superを呼べばその…

Rubyのautoloadって無くなるの?

Rubyにautoloadという機能がある。 autoload :Hoge, "hoge.rb" と書いておくと、定数Hogeが最初に使用された時にhoge.rbがrequireされる。Rubyのクラスは定数に入っているので、Hogeクラスの定義をhoge.rbに書いておくだけで、Hogeクラスの遅延ロードができ…

Rubyのlオプションがつらい

Rubyのnまたはpオプションは標準入力からテキストを読み込み、行ごとに-eで指定したRubyスクリプトに渡して処理を行う。 $ echo "123" | ruby -pe "" 123 さらにlオプションを付けると行末の改行コードを削除してから処理を行うのだが、chomp!じゃなくてchop…

デフォルト引数でフィボナッチ in JavaScript

Rubyのメソッド引数は奥が深い(その2)または別のフィボナッチ ES6にはデフォルト引数があるのでJavaScriptでも書けそう。 Firefoxでは動いた。 function fib(n, m = (n === 0 || n === 1 ? n : fib(n-2) + fib(n-1))){ return m } undefined fib(1) 1 fib(2…

日本語ページを除外するGoogle検索グリモン修正

Google検索結果のHTMLに変更が入って動作しなくなっていたので直しました〜 https://github.com/paulownia/greasemonkey/blob/master/googleNotInJapanese.user.js Firefox 29とChrome 34で動作確認しております。

REPEATABLE READの話

SQL

MySQL5系で、REPEATABLE READな環境があったのですが、ん?と思うことがあったので、備忘録。 結論から言うと、MySQL5.5 + InnoDBでファジーリードやファントムリードと思われる挙動が確認できた(気がする)。 InnoDBのREPEATABLE READでハマった話 - カイ…

Generator of ECMAScript 6th

ECMAScript 6thのジェネレータについてのスライドです。ネット上にある資料がどれもこれも適当な説明ばかりなのでカッとなって作成しました。 内容を一言でまとめると「ジェネレータは本来、非同期処理のための機能ではなく反復処理のための機能」という事な…

nodeモジュールとしてC++でLinked listを実装

node.jsのアドオン作成の練習として、先日書いたJavaScriptのlinked listをネイティブ実装に移植してみた。 https://github.com/paulownia/node-linkedlist 先日のJS実装と速度を比較した。リスト先頭への大量の要素追加にかかる時間(ms)を表に示す。 1000…

Linked listをJavaScriptで実装

JavaScriptで双方向連結リストを書いてみる。 function List() { this._length = arguments.length; for (var i = 0; i < arguments.length; i++) { this.addLast(arguments[i]); } } Object.defineProperties(List.prototype, { length: { get: function() …