Hatena::Groupkakisute

g5nの書き殴り

2007-12-20

指定した名前のファイルを HTTP GET する

20:48 | 指定した名前のファイルを HTTP GET する - g5nの書き殴り を含むブックマーク はてなブックマーク - 指定した名前のファイルを HTTP GET する - g5nの書き殴り

ふつうのファイルがインターネットに載っててそれの URL のリストがあって、それを GET したい。たぶん wgetオプションで同じことは出来るんだろうけど、難しすぎるので書いてしまった。URLのリストはとりあえず __END__ に書くことに。

httpgetfiles.rb

require "fileutils"
require "logger"
require "uri"
require "open-uri"

include FileUtils
@logger = Logger.new(STDERR)

def http_get(c)
  if !File.exist?(c)
    mkdir_p(File.dirname(c)) unless File.directory?(File.dirname(c))
    atime = Time.now
    begin
      open(c, "w"){|f|
        @logger.info("getting #{c}")
        open("http://#{c}"){|src|
          atime = src.last_modified
          f.write(src.read.to_s)
          File.utime(atime, atime, c) if atime
        }
      }
    rescue
      @logger.warn("#{c}: #{$!.inspect}")
      rm c
    end
  else
    @logger.info("exists #{c} (not get)")
  end
end

DATA.read.scan(/\S+/).each{|path|
  http_get(path)
}
__END__
www.google.co.jp/intl/ja/about.html
www.google.co.jp/intl/ja/contact/index.html

客から戻ってきたコードはうちのどのリリースと同じか

22:41 | 客から戻ってきたコードはうちのどのリリースと同じか - g5nの書き殴り を含むブックマーク はてなブックマーク - 客から戻ってきたコードはうちのどのリリースと同じか - g5nの書き殴り

何回かリリースした後、客から不具合のレポートが来たが再現できない。聞くところによると、いろいろ手を入れたという。ファイルによっては最新リリースではないという。えっと。

とりあえずお客さんの手元にあるソースをみて、これまでのリリースのどれかと同じファイルがどれくらいあるかを調べてみた。

  • /given/files/from/your/client/ ... 客から戻ってきたソース
  • /your/checked/out/releases/*/ ... これまでのリリースのコピー。ディレクトリ名の辞書式順序と新しさの順序は等しいとする。

find_latest_identical_release.rb

require "find"
require "digest/md5"

product = "/given/files/from/your/client/"
set = Dir["/your/checked/out/releases/*/"]

hash = {}
src_base = File.basename(src)
hash[src_base] = {}

Find.find(src){|i|
  next if !File.file?(i)
  path = i.sub(src, "")
  hash[src_base][path] = Digest::MD5.hexdigest(File.read(i))
}

set.each{|dir|
  base = File.basename(dir)
  hash[base] = {}
  Find.find(dir){|i|
    next if !File.file?(i)
    path = i.sub(dir, "")
    hash[base][path] = Digest::MD5.hexdigest(File.read(i))
  }
}

dst_base = hash.keys - [src_base]

printf("%s\t\%s\n", "path", "latest release")

hash[src_base].each{|path, md5|
  match = dst_base.find_all{|version|
    hash[version][path] == md5
  }

  printf("%s\t%s\n", path, match.sort.last)
}

nqjxtqgaqmnqjxtqgaqm 2013/12/17 15:02 rjayolbljtvuf, <a href="http://www.gsecmphkjo.com/">jmmtepgnqn</a> , [url=http://www.ydplktqubr.com/]auhlfysmkq[/url], http://www.bfelbbfnrd.com/ jmmtepgnqn

ゲスト



トラックバック - http://kakisute.g.hatena.ne.jp/g5n/20071220