著作一覧 |
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のソースは、それまでの良い実装からぱくりまくってるからね。そうやってよい実装の食物連鎖みたいなことがあるのかも。
ジェズイットを見習え |
☆☆☆