更新取得保存つづき

uri-info.rb (2007/8/26修正)
(2007/08/28 だめだな 保存しなくても読み込んでしまっているようだ)

# 指定秒数置きにlast_modifiedをチェック、更新されていたらデータを取得保存
# 秒数は目安
# 保存ファイル名は日時をうしろにつける、とりあえず拡張子はチェックなし、"/"は置き換え

require 'open-uri'

# 10分。これ以下の指定は無視される
min =600

if ARGV[0]==nil
  puts "usage: uri-info %0 [%1] =>type last-modified of %0  [timer:%1sec.]"
  puts "       default interval= #{min}sec."
  exit
end

def getext(a)
  ext =a.scan(/[^\.]+/)[-1] 
  if ext =~ /\// then ext="" end
  ext
end

url =ARGV[0]
$out ="uri-info-log.txt"
$savf ="ss"
$ans =""
$savf = url.scan(/([^\/]+\.){1,}/)[-1][0] +url.scan(/[^\.]+/)[-1] 
$savf.gsub!(/\//,'_')
$ext =getext(url)
print "保存ファイル名: #{$savf} [enter]"
$stdin.gets


def mainfn(url,flag)
  exist =false
  open(url) {|f|
    newdata ="last_modified: "+f.last_modified.to_s
    puts "ok: "+newdata
    
    open($out,"a+"){|log|
      log.each_line{|line|
        data =line.chomp
        if flag
          print "  > #{data}\n"
        end
        if data =~ /^last_modified:/
          exist =true
          if data == newdata
            $ans ="not modified"
          else
            $ans ="new"
          end
        end
      }
    }
    if $ans != "" 
      puts $ans
    else
      puts "?"
    end
    if ($ans =="new" || $ans =="")
      save(f,f.last_modified)
    end
  
    ou =open($out,"w")
    ou.puts url
    ou.puts newdata
    ou.close
  }
end

def save(f,tm)
  print "getting: "
  name =getname($savf,$ext,tm)
  open(name,"wb"){|writ|
    writ.puts f.read 
  }
  puts name,"ok"
end

def tprint(tm)
  sprintf("-%d%02d%02d%02d%02d",tm.year,tm.month,tm.day,tm.hour,tm.min)
end

def getname(name,ext,tm)
  #tm =Time.now
  tim=tprint(tm)
  name +tim +'.' +ext
end


timer=min
if ( ARGV[1]!=nil and ARGV[1].to_i>min ) then timer=ARGV[1].to_i end
loop{
  mainfn(url,false)
  puts
  # count down
  timer.times{|co|
    sleep 1
    print "\r#{Time.now} (#{timer-co-1})      \r"
  }
  puts
}

実行例,Ctrl+Cで中断 (テスト用にmin=15に変えてあります)

d:\ruby>uri-info
usage: uri-info %0 [%1] =>type last-modified of %0  [timer:%1sec.]
       default interval= 600sec.

d:\ruby>uri-info http://d.hatena.ne.jp/hatecha/ 20
保存ファイル名: d.hatena.ne.jp_hatecha_ [enter]
ok: last_modified: Sat Aug 25 12:29:37 +0900 2007
getting...
d.hatena.ne.jp_hatecha_-200708260118
new

Sun Aug 26 01:18:55 +0900 2007 (0)
ok: last_modified: Sat Aug 25 12:29:37 +0900 2007
not modified

Sun Aug 26 01:19:15 +0900 2007 (0)
ok: last_modified: Sat Aug 25 12:29:37 +0900 2007
not modified

d:/ruby/uri-info.rb:81:in `sleep': Interrupt
        from d:/ruby/uri-info.rb:81
        from d:/ruby/uri-info.rb:80:in `times'
        from d:/ruby/uri-info.rb:80
        from d:/ruby/uri-info.rb:76:in `loop'
        from d:/ruby/uri-info.rb:76

d:\ruby>

#hoge
=>コメント開始
/([^\/]+\.){1,}/
=>('/'以外の文字1文字以上のあとに'.')の1回以上の繰り返し
配列[-1]
=>マイナスは後ろから数える
$foo
=>大域変数
print "... #{hensuuなど}..."
=>#{}置き換え, #$foo
url.scan(/[^\.]+/)[-1]
=>'.'以外の文字1文字以上でマッチするもののリストのうち最後
( aa.bb.cc => cc )
ARGV
=>実行時のコマンドライン引数の配列


\\\\あれ\\\?バックスラッシュだ\/\/\/\/