JavaScriptのcallbackをstub/mock化できるようにしたいのでbind(this)する

まとめ

JavaScript の callback メソッドを testable にしたい。

  • testable にするには独立して呼べることが大事。つまり独立メソッドにし、名前をつけることが必要。
  • 独立メソッドを callback として渡すにはリファレンスにする
  • リファレンスとして渡されたものは実行時に this が決定するのでそのまま実行すると同じ class 内でも this を見失う
  • リファレンスを bind(this) しておこう

this.method(val, function(err, res) {
  ..
})

みたいなコードはクロージャの中だけをテストすることができないからやめたい。じゃあこれを独立した callback メソッドにするとどうなるか。

this.method(val, this.callback)

これは callback メソッドのリファレンスを渡している形。これで必要な引数は自動的に渡るようになる。

このために method の中身は以下のようになっている。

method (val, cb) {
  ..
  cb(err, res)
  ..
}

これをそのまま実行すると callback は this を見失う。this は lexical scope ではなく dynamic に実行時に bind される。this を共有するには this を与える必要がある。

つまり正解はこう。

this.method(val, this.callback.bind(this))

arrow function を挟んで以下のようにすることもできるが、冗長だし、間違えそうなので避けたい。引数の数が少なく、名前も短いうちは読みやすいとは思うけど。

this.method(val, (err, res) => {
  this.callback(err, res)
})

Yapra で Trac の timeline feed を 1本に

本当は Yapra でやりたかったことナンバーワンだったはずなのに全然やってなかったイントラの Trac の timeline の一本化をやりました。(面倒くさがってただけでやり始めたら割とすぐできた。)

今回のキモはイントラの Trac の URL が

http://host/trac/NAME

の形で統一されているので、/ で split して NAME を引っぱり出すところかな? これで一本化された feed を読んでいてもどの Trac からの情報かが title だけで分かる。(まぁリンクを踏めば間違いなく分かるんだけど。)

- module: RSS::load
  config:
    url:
      - http://host/trac/NAME/timeline?VARIOUS_OPTIONS&format=rss
      - http://host/trac/NAME/timeline?VARIOUS_OPTIONS&format=rss
      - http://host/trac/NAME/timeline?VARIOUS_OPTIONS&format=rss
      - http://host/trac/NAME/timeline?VARIOUS_OPTIONS&format=rss
      - http://host/trac/NAME/timeline?VARIOUS_OPTIONS&format=rss
      - http://host/trac/NAME/timeline?VARIOUS_OPTIONS&format=rss
- module: Filter::sort
  config:
    method: date
- module: Filter::ApplyTemplate
  config:
    title: '<%= "[#{item.link.split( /\// )[4]}] #{item.title}" %>'
- module: RSS::save
  config:
    title: "multitrack"
    link: http://HOST/PATH
    filename: /PATH/TO/FEED

実際の Trac の URL とか保存先のファイル名とかよしなにしてください。

本当は My Tickets の一本化もやりたいんだけど、なんかあまりうまい方法が思いつかないんだなぁ。ユーザーごとに feed を作るようにするしかないかな? 人数少ないうちなら全然それでも問題ないんだよな。

あーあと本当に今いちばん欲しいのは Roadmap の iCal データを merge して出してくれるものだな。あったらすっげー便利だと思う。

trac の情報を引き出す plugin にしちゃった方が応用はやりやすいんだろうなぁ。

文字コードを指定して読み直し

[2007-10-18 追記] イマドキは C-x RET r ( revert-buffer-with-coding-system ) のようです。r は revert の r ? でも reload とか reopen などをイメージしやすくていいですね!

blog.woremacx.com: Emacsで文字コード指定して再読込

ぐぐった時に、そのものずばりの情報に到達できるとうれしくなります。

これが意外とできないんですよね。今回の動作は

  1. 今から実行するコマンドの文字コードを指定して
    • C-x RET c
  2. ファイルを開き直す
    • C-x C-v

という流れ。

そもそもこれが思いつかない。てっきり文字コードを指定してファイルを開くというコマンドが存在するかのような錯覚に陥ってしまうが、そうは問屋が下ろさないのが Emacs クオリティ。dired で C-x RET c して文字コードを指定して open するのと基本的には一緒。

C-x C-v は自動的にカレントバッファの削除を行ってくれるけれどカレントバッファのファイル名をキープしてファイルを開こうとしてくれるので、「開き直す」意味に使いやすい、ということですな。

※ 実は昔から Emacs の挙動はこうして言葉に直さないと頭に入って来ないのです。なんでこんな苦労して使ってるんでしょうなぁ。

移転に伴うレンタルサーバについての考察より

「保証」までできるかどうかはアレとして。。。

  • マイナーなので「あえて」選んでいる理由が何かあるはず
    • ということはそれなりに他の OS との比較をしているということで、比較できるだけの最低限のスキルはあるような気がする
  • 上により Linux インストールしてみました、程度の人でないので、パフォーマンスのチューニングもそれなりに考えてある気がする
    • ソースインストールが基本なので最適化しやすいし
  • (古いが)管理系の資料が実は豊富。レベルの高い管理を実現するための下地は整っている

という、おおむねふにゃふにゃな感じで賛成。ただし、単に古くて正当な Unix っぽい感じが好き、というミーハー層がいることもお忘れなく。

午後3:45段階で目標達成率 85.7%

鼻のむずむずは薬で治まったが代わりに眠い。。。

ところで syouchan5588 の日記にコメントが書けないのは仕様なのだろうか。

写真ねーじゃん

さすがに捨てたのか。撮らなきゃじゃん。ということで行動開始。

Mozilla 1.5 とか

なんか Mozilla のくせに軽い。なんだこりゃ。いいじゃないの。

ついでに LiveHTTPheaders が新しくなってる。お。CSS を適用するとどっからどこまで何のリクエストだかすぐ分かる。いいね。

About

例によって個人のなんちゃらです