| 著作一覧 |
VS2008(以前のVIでも同じだが)が、扱うファイル量が想定範囲を数100倍は上回っている(たぶん、平均的なアプリケーションのファイル数なんて10個前後だろう)からか、とにかく動作が遅すぎる。
ファイル1個入れ替えるだけで冗談抜きに3分程度必要となる。
というわけで、RubyGemsのメンテ中についにやる気がゼロになった。
が、それではASRが作れない。
別の方法を考える必要がある。
・候補1: MSIの中にgzファイルを入れて、post-installでRubyでgunzipする。
・候補2: MSIの生成方法を解析してコマンドラインツールを作る
1の問題は、MSIが把握するファイルと実際にインストールするファイルの極端な乖離だ。アンインストールちゃんとできるのか?(たぶん、できるはずだが)
2の問題は、時間だなぁ。
というわけで、とりあえず1の方向で、2をやるという感じに決めた。
というわけで、ASR-1.8.6-P114のリリースは少し伸びます。
追記:vdprojってのは、レジストリのテキストエンコーディング形式なんだな。ってことは、こいつを操作すればよいのだろう。さがせばちょこちょこ情報があるようだな。
昨年に引き続き、Gauche Nightに行く。
最初は、Kahuaの本のはずだったのが、途中、道具もののHacker本になりそうになり、最終的にオライリー動物シリーズになるまでのハワイの魚の物語。
ファインディング・ニモ [DVD](アルバート・ブルックス)(ニルを探して)
この魚は、単独行動でふらふらしているらしい。
併せて読みたい
それはともかく、yharaさんともうひとかた(名前失念)の時間ちょっきりゴングショーの、時間ちょっきりぶりに感動する。
I.D.E.Ainternational LEDブックライト シルバー FDL003-SY 4200037(-)
アフィリエイトでどなたかが買われたものなんだが、評価も高いし、どんなもんなのかな? 今は寒いから白熱電球のフロアスタンドで本を読んでいたりするわけだが、それは夏には使えないから、これ買ってみるかなぁ。
require 'fileutils'
class Through
def initialize(a, line)
@proj = a
@line = line
end
def read(x)
nil
end
def save(f)
f.puts @line
end
end
class Entry
def initialize(a, line)
@proj = a
@key = nil
@MsmKey = nil
@OwnerKey = nil
@MsmSig = nil
end
def read(x)
if x.strip == '}'
return nil
elsif x =~ /MsmKey.+:([_0-9A-F]+)"/
@MsmKey = x
@key = $1
elsif x =~ /OwnerKey/
@OwnerKey = x
elsif x =~ /MsmSig/
@MsmSig = x
end
self
end
def save(f)
if @proj.key?(@key)
f.puts ' "Entry"'
f.puts ' {'
f.puts @MsmKey
f.puts @OwnerKey
f.puts @MsmSig
f.puts ' }'
end
end
end
class Hierarchy
def initialize(a, line)
@proj = a
@entries = []
@state = nil
end
def read(x)
unless @state
if x =~ /\A\s*"Entry"\s*\Z/
@entries << @state = Entry.new(@proj, x)
elsif x.strip == '}'
return nil
end
else
@state = @state.read(x)
end
self
end
def save(f)
f.puts ' "Hierarchy"'
f.puts ' {'
@entries.each do |e|
e.save(f)
end
f.puts ' }'
end
end
class FileEntry
def initialize(a, line, key)
@key = key
@proj = a
a.add_file(key, self)
@lines = [line]
@SourcePath = nil
@removed = false
@nest = 0
end
attr_accessor :removed
def read(x)
@lines << x
@nest += 1 if x.strip == '{'
if x =~ /\A\s*"SourcePath".+?"8:(.+?)"\Z/
@SourcePath = $1.gsub(/\\\\/, '/')
elsif x.strip == '}'
@nest -= 1
return nil if @nest == 0
end
self
end
def save(f)
unless @removed
@lines.each do |x|
f.puts x
end
end
end
def contains?(fn)
if String === fn || Symbol === fn
fn = [fn.to_s]
end
fn.each do |f|
if @SourcePath =~ /#{f}/
STDOUT.puts "remove #{@SourcePath}"
return true
end
end
nil
end
end
class FileSection
def initialize(a, line)
@proj = a
@entries = []
@state = nil
end
def read(x)
unless @state
if x =~ /\A\s*"\{[-0-9A-F]+\}:([_0-9A-F]+)"\s*\Z/
@entries << @state = FileEntry.new(@proj, x, $1)
elsif x.strip == '}'
return nil
end
else
@state = nil unless @state.read(x)
end
self
end
def save(f)
f.puts ' "File"'
f.puts ' {'
@entries.each do |x|
x.save(f)
end
f.puts ' }'
end
end
class MergeModule < FileSection
def initialize(a, line)
super(a, line)
end
def save(f)
f.puts ' "MergeModule"'
f.puts ' {'
@entries.each do |x|
x.save(f)
end
f.puts ' }'
end
end
class VdProj
def initialize(fn = nil)
@lines = []
@files = {}
@state = nil
read(fn) if fn
end
def read(fn)
File.open(fn).each_line do |line|
line.rstrip!
if @state
@state = @state.read(line)
else
if line =~ /\A\s*"Hierarchy"\s*\Z/
@lines << @state = Hierarchy.new(self, line)
elsif line =~ /\A\s*"File"\s*\Z/
@lines << @state = FileSection.new(self, line)
elsif line =~ /\A\s*"MergeModule"\s*\Z/
@lines << @state = MergeModule.new(self, line)
else
@lines << Through.new(self, line)
end
end
end.close
end
def save(fn)
File.open(fn, 'w') do |f|
@lines.each do |line|
line.save(f)
end
end
end
def add(x)
@lines << x
end
def key?(key)
@files[key]
end
def add_file(k, v)
@files[k] = v
end
def remove(files)
@files.each do |k, v|
next unless v
if v.contains?(files)
v.removed = true
@files[k] = nil
end
end
self
end
end
if __FILE__ == $0
if ARGV.size == 0
STDERR.puts 'usage: ruby delnode.rb vdproj node-name [node-name ...]'
exit
end
fn = ARGV.shift
FileUtils.cp fn, "#{fn}.back"
VdProj.new(fn).remove(ARGV).save("#{fn}.new")
end
追記:ファイルの削除(あとから上に追加)は期待通りに動くことがわかった。あと、フォルダの削除も実行しておけば、追加はまだ我慢できるからとりあえずはここまでだと思う。
さらに追記:役に立ったので、一応コミットしておこう。vdprojtools
str << elemみたいなのを書いていてはまりまくり。イミュータブルなStringに慣れ親しみ過ぎたのか、とんでもないことになった。もちろん、
str = "#{str}#{elem}"
でよいわけだが。(str += elemだと最初のと同じ意味になるよね? 追記:ならない。どうもありがとう)
とりあえず、お試しということで。
変更点:
・Ruby 1.8.6-p114
・Exerb 4.4.0 (単にRUBY_VERSIONがp114になったというだけ)
・Rjb 1.1.2
・VialuRuby 080229
・RubyGems 1.0.1
・ruby consoleは、ユーザーのデスクトップにも配置
(特に何もないようなら、明日午前中にinfoseekで公開します)
追記:rexml\undefiendnamespaceexception.rbが不足してた。直した。
ひげぽん:Gaucheもさわる必要があると思って、ソースを読んだ。世界は美しい。
(会場から、そこかよ、とツッコミ)
ひげぽん:shiroさんのソースは良いって聞いているし。
shiro:Gaucheのソースは、それまでの良い実装からぱくりまくってるからね。そうやってよい実装の食物連鎖みたいなことがあるのかも。
ジェズイットを見習え |
☆☆☆