Rubyの標準ライブラリ及びgemのtagsファイルをロードする
Vimスクリプトを書いた。 https://github.com/yoppi/config/blob/master/vim/dot.vim/ftplugin/ruby/tag.vim
プログラミングしているときに、実装を知りたいときがよくあるので、Vimで素早くタグジャンプできるようにした。 ただ、
- 手動でtagsファイルを生成しておかなければならない https://gist.github.com/yoppi/5508053
- 途中でgemとか追加してももちろん変更されない
という問題があるので、もっと便利なようにtagsファイルを動的に更新していくような感じにしていく。
redisable
というgemを作った。
http://github.com/yoppi/redisable
RubyオブジェクトをRedisとマッピングさせる既存の有名なライブラリに、
- redis-objects(https://github.com/nateware/redis-objects)
- ohm(https://github.com/soveran/ohm)
の2つがあるけど、次の欲しかったものを実現するのが少し遠かったので作った。
- モデル毎に複数のRedisサーバにアクセスできる(sharding)
- オブジェクトをマッピングするというより、そのオブジェクトを通してRedisにアクセスしたい
という意味を込めてredisable
(redis + enable)という名前にしている。
RSpecMocks/rr
TestDoubleライブラリをrr(Double Ruby)からRSpec標準のRSpecMocksに切り替えてるのだけど、やっぱり違和感がある。 rrはTestDoubleの考えをそのままライブラリ化した実装で、xUnit Test Patternsを熟読した人にとって馴染み易いと思う。
だけど、RSpec Mocksはいまいちstub
とmock
の使い分けが不透明だったり...mock
やspy
に当たるのはshould_receive
を使うというのがわかりづらいなーと。
rr、全然メンテナンスされてないのでメンテナになろうか、と、思ったら、
メンテナの人が変わってて活発にコミットが入る様になった模様。これで一安心か...
redis-commander
ローカルで開発しているときに、複数のredis-serverを立ち上げるので、たとえばsessionのテストでkeyを削除したくなったり、 アプリのデータを入れたくなったりしたときに、redis-cliで「どのプロセスに繋げばいいだっけ」ということが多々ある。
redis-commanderはブラウザで経由でredis-serverを管理してくれる。 http://nearinfinity.github.io/redis-commander/
$ npm install -g redis-commander $ redis-commander
便利。
thinのコードネーム
が、rails server
するたびに目に入るので気になって一覧にしてみた。
$ git log -p lib/thin/version.rb | grep '\+\s*CODENAME' | awk 'match($0,/[\047"](.*)[\047"]/) { print substr($0,RSTART,RLENGTH) }' "Straight Razor" "Knife" "Chromeo" "Low-bar Squat" "Triple Espresso" "Double Espresso" "Bat-Shit Crazy" "I'm dumb" "Black Keys Extra Plus Wow" "Black Keys" "Does It Offend You, Yeah?" "No Hup" "Crazy Delicious" "This Is Not A Web Server" "Flaming Astroboy" "Astroboy" "I Find Your Lack of Sauce Disturbing" "Asynctilicious Ultra Supreme" "Asynctilicious Supreme" "Super Disco Power Plus" "Super Disco Power" "?" "That's What She Said" 'The Big' 'Double Margarita' 'Rebel Porpoise' 'Dodgy Dentist' 'No Name Yet' 'Fancy Pants' 'Spherical Cow' 'Ninja Cookie' 'Rambo' 'Cheesecake' 'Big Pony' 'Bionic Pickle' 'Pony' 'Flying Mustard' 'Purple Yogurt' 'Cheezburger' 'LOLCAT' 'lolcat'
awkでシングルクォートをマッチさせるのが死にそうになった。
Amazonで配送先住所を間違って発注してしまった場合
Amazonで本を大量に買ったのだけど届け先を昔の住所で発注してしまって、変更しようとしても、配送準備中で変更できなくて詰んだ感ある。
— Hirokazu Yoshidaさん (@yoppiblog) 2013年4月10日
def 住所変更可能か? 状況 == "未発送" end def 配送先住所をwebから変更する(住所) 変更する 住所 end def 配達センターに電話する(配送会社電話番号, 伝票番号, 住所) 電話する 配送会社電話番号, 伝票番号, 住所, "「配送先を間違えたので住所変更お願いします」" end def main if 住所変更可能か? begin 配送先住所をwebから変更する(住所) rescue => 変更不可エラー # 落ち着く 配達センターに電話する(配送会社の電話番号と伝票番号をメールから調べる, 住所) end else 配達センターに電話する(配送会社の電話番号と伝票番号をメールから調べる, 住所) end end
Enumerable#entries
にはまったというお話。
class Hash def method_missing(method, *args) ret = self[method] || self[method.to_s] return ret if ret super end end h = {root: {hoge: 1, foo: 2}, entries: [{hoge: 3, foo: 4}, {hoge: 5, foo: 6}]} h.entries #=> [[root: {hoge: 1, foo: 2}, entries: [{hoge: 3, foo: 4}, {hoge: 5, foo: 6}]]]
to_a
だけでいいのでは、と思った。Rubyはよくaliasが提供されてるけど不要なんじゃないかと思う時もある。
や、今回のは不用意にmethod_missing
使うなとか、ドキュメント嫁という話ではあるのだけれども...