トップ «前の日記(2008-03-08) 最新 次の日記(2008-03-10)» 編集

日々の破片

著作一覧

2008-03-09

_ ASRとMSI

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

プログラミングGauche(Kahuaプロジェクト)

昨年に引き続き、Gauche Nightに行く。

最初は、Kahuaの本のはずだったのが、途中、道具もののHacker本になりそうになり、最終的にオライリー動物シリーズになるまでのハワイの魚の物語。

ファインディング・ニモ [DVD](アルバート・ブルックス)(ニルを探して)

この魚は、単独行動でふらふらしているらしい。

併せて読みたい

セロ弾きのゴーシュ (角川文庫)(賢治, 宮沢)

それはともかく、yharaさんともうひとかた(名前失念)の時間ちょっきりゴングショーの、時間ちょっきりぶりに感動する。

_ これなんだろう

I.D.E.Ainternational LEDブックライト シルバー FDL003-SY 4200037(-)

アフィリエイトでどなたかが買われたものなんだが、評価も高いし、どんなもんなのかな? 今は寒いから白熱電球のフロアスタンドで本を読んでいたりするわけだが、それは夏には使えないから、これ買ってみるかなぁ。

_ とりあえずファイル削除のためのフレームワークは作った

もっとも外部からいじったvdprojをVS2008が処理できるかわからんが、とりあえずここまでだ。
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だと最初のと同じ意味になるよね? 追記:ならない。どうもありがとう)

_ ASR 1.8.6-p114

とりあえず、お試しということで。

変更点:

・Ruby 1.8.6-p114

・Exerb 4.4.0 (単にRUBY_VERSIONがp114になったというだけ)

・Rjb 1.1.2

・VialuRuby 080229

・RubyGems 1.0.1

・ruby consoleは、ユーザーのデスクトップにも配置

ActiveRuby.msi

(特に何もないようなら、明日午前中にinfoseekで公開します)

追記:rexml\undefiendnamespaceexception.rbが不足してた。直した。

_ Gauche Nightから(不正確な)引用

ひげぽん:Gaucheもさわる必要があると思って、ソースを読んだ。
 (会場から、そこかよ、とツッコミ)
ひげぽん:shiroさんのソースは良いって聞いているし。
shiro:Gaucheのソースは、それまでの良い実装からぱくりまくってるからね。そうやってよい実装の食物連鎖みたいなことがあるのかも。
世界は美しい。
本日のツッコミ(全1件) [ツッコミを入れる]
_ yuumi3 (2008-03-09 16:01)

☆☆☆


2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|

ジェズイットを見習え