A Day in the Life

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
記事の一覧 >