2009/12/29

よみもの

ポール・グレアム「バージョン1.0
これ、めちゃくちゃおもしろかった。

「偉大な」執事とは何か?
と、小説の中の主人公が自問自答する場面を思い出した。なんでだろな...。あんまり関係ないと思うんだけど。

2009/12/28

unless a.nil?

このあいだ
github.com/midore/mdiary

mdiary-main.rb

378       return nil unless @st.nil? || @plus.nil?

だったのを

379       return nil if @st && @plus

に変えた。

前者と後者は同じ動きをする。どちらも
@st は nil ではなく、かつ、@plus もnil でなければ、return nil をかえす。

例えば

  1 # coding: utf-8
  2 
  3 a = 'a'
  4 b = 'b'
  5 print "a,b どちらも not nil です。\n" unless a.nil? || b.nil?
  6 print "a,b どちらも not nil でっす。\n" if a && b

実行すると

a,b どちらも not nil です。
a,b どちらも not nil でっす

となる。

前者(||を使用),後者(&&を使用)ともに

a は nilではない。かつ、b も nil ではない。
であれば print する。

と動く。ちょっと不思議だけど。

条件文が読みやすいのは && を使用した後者。
ただ、
if x
と書いて nil じゃなければとするより
unless x.nil?
と、nil なの?そうじゃないなら と書いてあった方が私にとってはわかりやすい時もあったりする。

...とはいっても || なのに「かつ」 を意図してるとなってると後になって自分がぎょっと驚いてしまうだろうから...変えた。

url for blogger-api

Blogger API 用
日付範囲を指定したURLの生成

line 10:
t に2010/12 が指定された場合、翌月は年も変わるので年に1加算し月にも1加算すると2011/1/1 が得られそこから1秒ひくと2010/12/31の23:59:59
になる。

Time だけ使った場合

  1 require 'time'
  2 
  3 def range_current_month(t=nil, bid)
  4   u = "http://www.blogger.com/feeds/#{bid}/posts/default"
  5   begin
  6     t = Time.parse(t) unless t.nil?
  7   rescue
  8     t = Time.now()
  9   end
 10   t.month == 12 ? x = [t.year+1, 1] : x = [t.year, t.month+1]
 11   min = t.strftime("%Y-%m-%dT00:00:00")
 12   max = (Time.local(x[0], x[1], 1) -1).strftime("%Y-%m-%dT%H:%M:%S")
 13   return u + "?published-min=#{min}" + "&published-max=#{max}"
 14 end
 15 
 16 bloggerid = 'xxxxxxxxxxxx'
 17 t = '2010/12'
 18 p range_current_month(t, bloggerid)
 19 t = '2010/2'
 20 p range_current_month(t, bloggerid)

=>
"http://www.blogger.com/feeds/xxxxxxxxxxxx/posts/default?published-min=2010-12-01T00:00:00&published-max=2010-12-31T23:59:59"
"http://www.blogger.com/feeds/xxxxxxxxxxxx/posts/default?published-min=2010-02-01T00:00:00&published-max=2010-02-28T23:59:59"


Date も使った場合

  1 require 'time'
  2 require 'date'
  3 
  4 def range_current_month(t=nil, bid)
  5   u = "http://www.blogger.com/feeds/#{bid}/posts/default"
  6   begin
  7     t = Time.parse(t) unless t.nil?
  8   rescue
  9     t = Time.now()
 10   end
 11   t.month == 12 ? x = [t.year+1, 1] : x = [t.year, t.month+1]
 12   min = t.strftime("%Y-%m-%dT%H:%M:%S")
 13   max = ((Date.new(x[0], x[1], 1)) - 1).strftime("%Y-%m-%dT23:59:59")
 14   return u + "?published-min=#{min}" + "&published-max=#{max}"
 15 end
 16 
 17 bloggerid = 'xxxxxxxxxxxx'
 18 t = '2010/12'
 19 p range_current_month(t, bloggerid)
 20 t = '2010/2'
 21 p range_current_month(t, bloggerid)
 22 

=>
"http://www.blogger.com/feeds/xxxxxxxxxxxx/posts/default?published-min=2010-12-01T00:00:00&published-max=2010-12-31T23:59:59"
"http://www.blogger.com/feeds/xxxxxxxxxxxx/posts/default?published-min=2010-02-01T00:00:00&published-max=2010-02-28T23:59:59"


もう少し短くできないかなと思うんだけど...。 ?