ソースの圧縮をする微妙なBimyoモジュール

手段がバレバレになるので見ようと思えばちょっとした細工ですぐ見れるわけだが。
画像とかもそうで、簡単に見れないようにするためにはソース非公開でバイナリの拡張ライブラリを作るほうがよい。
とりあえず参考までに。
このような微妙なモジュールを作る。

require 'zlib'

module Bimyo
  @files = {}
  @startflag = false

  def self.load(filename)
    open(filename, "rb") do |fh|
      @files = Marshal.load(Zlib.inflate(fh.read))
    end
    @startflag = true
  end

  def self.bmrequire(filename)
    if @startflag
      if @files.has_key?(filename)
        eval(@files[filename], TOPLEVEL_BINDING)
        @files.delete(filename)
      end
    else
      open(filename, "rb") do |fh|
        @files[filename] = fh.read
      end
      require filename
    end
  end

  def self.save(filename)
    open(filename,"wb") do |fh|
      fh.write(Zlib.deflate(Marshal.dump(@files)))
    end
  end
end

こう使う。

require './bimyo'
Bimyo.load 'test.dat'
Bimyo.bmrequire './sample_flash.rb'
#Bimyo.save('test.dat')

Bimyo.loadは圧縮ファイルを読み込む処理で、Bimyo.saveは保存する処理。loadはBimyoモジュールを読み込んだ直後、saveはプログラムが終了する直前に使う。基本的にどっちかをコメントアウトする。圧縮ファイルを作りたいときはsaveだけ、圧縮ファイルで動かしたいときはloadだけ、という感じ。
相対パスで指定する自分のスクリプトをrequireするときはBimyo.bmrequireを使うようにする。いまのところ拡張子の省略は不可。中身はevalなのでRubyのソース以外も不可。トップのファイルはこのような形にして、メインのファイルをbmrequireすればソースのすべてを圧縮ファイルにできる。
これでまあ、ソースについてはZLibで圧縮されたファイル1つにまとまる。ダブルクリックしても読めない。Bimyo.rbはそのまま残るから意味がわかる人なら展開して読むこともできる。
Bimyo.rbとトップのファイルを難読化すればもうちょっとマシになるかもしれない。
たいしたテストはしてないのでバグがあるかもしれない。