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

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

Recent Posts

Categories

Tool 日々 Web Biz Net Apple MS ことば News Unix howto Food PHP Movie Edu Community Book Security Text TV Perl Ruby Music Pdoc 生き方 RDoc ViewCVS CVS Rsync Disk Mail FreeBSD Cygwin PDF Photo Zebedee Debian OSX Comic Cron Sysadmin Font Analog iCal Sunbird DNS Linux Wiki Emacs Thunderbird Sitecopy Terminal Drawing tDiary AppleScript Life Money Omni PukiWiki Xen XREA Zsh Screen CASL Firefox Fink zsh haXe Ecmascript PATH_INFO SQLite PEAR Lighttpd FastCGI Subversion au prototype.js jsUnit Apache Trac Template Java Rhino Mochikit Feed Bloglines CSS del.icio.us SBS qwikWeb gettext Ajax JSDoc Rails HTML CHM EPWING NDTP EB IE CLI ck ThinkPad Toy WSH RFC readline rlwrap ImageMagick epeg Frenzy sysprep Ubuntu MeCab DTP ERD DBMS eclipse Eclipse Awk RD Diigo XAMPP RubyGems PHPDoc iCab DOM YAML Camino Geekmonkey w3m Scheme Gauche Lisp JSAN Google VMware DSL SLAX Safari Markdown Textile IRC Jabber Fastladder MacPorts LLSpirit CPAN Mozilla Twitter OpenFL Rswatch ITS NTP GUI Pragger Yapra XML Mobile Git Study JSON VirtualBox Samba Pear Growl Mercurial Rack Capistrano Rake Win RSS Mechanize Sitemaps Android JavaScript Python RTM OOo iPod Yahoo Unicode Github iTunes God SBM friendfeed Friendfeed HokuUn Sinatra TDD Test Project Evernote iPad Geohash Location Map Search Simplenote Image WebKit RSpec Phone CSV WiMAX USB Chrome RubyKaigi RubyKaigi2011 Space CoffeeScript Nokogiri Hpricot Rubygems jQuery Node GTD CI UX Design VCS Kanazawa.rb Kindle Amazon Agile Vagrant Chef Windows Composer Dotenv PaaS Itamae SaaS Docker Swagger Grape WebAPI Microservices OmniAuth HTTP 分析基盤 CDN Terraform IaaS HCL Webpack Vue.js BigQuery Middleman CMS AWS PNG Laravel Selenium OAuth OpenAPI GitHub UML GCP TypeScript SQL Hanami Document SVG AsciiDoc Pandoc DocBook Develop Jekyll macOS Node.js Vite Heroku Transformer AI Data Cloud Wasm