2008-07-09
だいすきなうた / 國府田マリ子
風呂場で My Best Friend (曲のほう) の出だしのエレピのフレーズがループまくって風呂出たらまず聴こうと思ったら、My Best Friend って My Best Friend (アルバムのほう)に入ってないのかそうだ My Best Friend 2(アルバムのほう)に My Best Friend (曲のほう) が入ってたんだったああ2はどっかにいってしまったよ、というわけで別のアルバムを、つーんでだいすきなうたを。(My Best Friend 2 はマーケットプレイスでぽちっとなしといた)
このアルバムはなかなかの名盤、というかマリ姉アルバムの中では一番好きだなー。b-flower な曲でちょっとビートルズぽいロックだったり、亀田誠治な編曲が多かったり、なんとなくちょっと渋谷系テイストだったりで。
カテゴリは def-review(g:def-review 参照) なので BookOff で250 円だよ!Amazon で1 円(つまり341円)だよ!
- アーティスト: 國府田マリ子,松原みき,八野英史,松浦有希,NOKKO,種ともこ,b-flower,古河昌義,亀田誠治,中村修司,井上うに
- 出版社/メーカー: キングレコード
- 発売日: 1998/07/24
- メディア: CD
- クリック: 9回
- この商品を含むブログ (12件) を見る
set expandtab
ハードタブるには
:set noexpandtab
で。ハードタブなコードをときたま編集するけど、いつも忘れる。普段使わないとなー。
git ユーザ用のログインシェル
github なんかは ssh git@github.com や ssh git@github.com ls すると、エラーではじかれるけど ssh 経由での push はできて、どうやってんだろうとおもった。
で、git-shell なんてのが git のパッケージに含まれているジャンスカ!全然ぐぐるさんにも引っかからないので困る!こいつを git ユーザのログインシェルにすると、うまいこと git でのログイン周り(hooks 以下のファイルはたとえ ruby スクリプトでも普通に実行されてえらい)を制限してくれる。
他にも git-sh-setup でメッセージ等も変更できる模様よよよ。
Ruby でキーワード引数的な Fluent Interface の実装
を読んで。Ruby ではキーワード引数が無いため、大体オプション引数はこんな実装が多い。
def foo(name, options = {})
options = foo_default_options.merge options
...
この書き方だと、option がたくさんある時にかっこわるい。
obj.foo(name, :foo => 'bar', :baz => 2)
なので Hash のオプション引数をメソッドチェインで書けるようにする FluentInterface モジュールを作ってみた。
実際の例だと WEBrick の new のオプションなんかが
server = WEBrick::HTTPServer.new(:DocumentRoot => '/var/www', :BindAddress => '0,0,0,0', :Port => 8001)
server.start
これを FluentInterface を使うと
fluent = FluentInterface.fluent WEBrick::HTTPServer, :new
server = fluent.DocumentRoot('/var/www').BindAddress('0.0.0.0').Port(8001).execute
server.start
ナガレルウウゥ、かどうかはおいといて。オプションは逐一組み立てできる
fluent = FluentInterface.fluent WEBrick::HTTPServer, :new
fluent = fluent.DocumentRoot('/var/www').Port(8001)
fluent = fluent.BindAddress('0.0.0.0')
server = fluent.execute
また、fluent の最後の引数に Array でメソッド名を渡してやると、そのオプションのみ有効になる。これでありがちな typo によるミスが少なくなる、はず。
fluent = FluentInterface.fluent WEBrick::HTTPServer, :new, WEBrick::Config::HTTP.keys
server = fluent.DocumentRoot('/var/www').BindAdress('0.0.0.0').Port(8001).execute
# => undefined method `BindAdress' for # (NoMethodError)
# BindAdress でなく BindAddress が正確。
もちろん Mix-in して利用もできる。
class ExampleAPI
include FluentInterface
fluent :search, :search_fluent, [:type, :limit]
def search(word, options = {})
[word, options]
end
end
p ExampleAPI.new.search('foo', :type => :dict)
p ExampleAPI.new.search_fluent.type(:dict).execute('foo')
api = ExampleAPI.new
api.search_fluent.order(:desc) #=> undefined method `order' for #
Hash#update と組み合わせると、fluent interface な OpenStruct ぽい事もできる。(setter は self を返さないので違うけど)
s = FluentInterface.fluent(Hash.new, :update)
s = s.foo(:bar)
s.foo #=> :bar
s = s.bar(:baz)
s.bar #=> :baz
s.execute #=> {:foo => :bar, :bar => :baz}
fluent interface 流れるようなインターフェイス
jQuery のようなインターフェイス、最近さわった中じゃ ActiveRecord の named_scope による DSL 定義のインターフェイスって fluent interface (流れるようなインターフェイス) と呼ばれてるんだね。つーわけで今日一日 fluent interface ブーム。脳内発音はふるーえんといんたーふぇいす。フルフェス。
bliki の一番下の See ALSO のひがさんの話、流れるようなインターフェースとメソッドチェーンは違うもので、
単に書く文字が減ったとかそんな話ではない。思考を中断せずに流れるようにコーディングができるかどうかが重要なんだ。そして、よくできた流れるようなインターフェースは、可読性が高い。
「単なるメソッドチェーンとは違うのだよ!メソッドチェーンとは!」
とあるけど、Ruby のメソッドチェインは fluent interface な物が多い気がするんだけどどうなんだろう(Ruby 厨オツ)。
Pathname.new(__FILE__).parent.parent.join('lib').join('foo.rb').exist?
(1..10).map{|i| i * i }.select {|i| i % 2 == 0 }
ここらへんは Rubyist 的な Ruby ならこういう挙動するであろうメソッドチェインだから、fluent interface だと思ってしまうのかなぁ(でも Pathname の interface は fluent interface だと思うけど)。本質的なことは
思考を中断せずに流れるようにコーディングができるかどうかが重要なんだ。
なことなんだろうね。
----
また ActiveRecord の named_scope だと
User.not_admin.age(10..20).last_login_time(Time.now.ago(2.weeks)..Time.now)
みたいな感じにかけて。named_scope は自分の好きなように名前をつけられるのでホントに読みやすく find 条件句を定義できる。そういえば ActiveSupport の Time 拡張周りも好きな fluent interface だなー。
Date.parse('2000-10-10').yesterday.ago(1.second).next_year.to_date