2009-06-06
■ [ruby][memo] DXRubyスターターキットとか作れんじゃねーの
DXRuby使ったRubyスクリプトをOcraで普通に固められたので、 これはDXRubyスターターキット作るしかない。
と思ったけどexeのパスがスクリプトから取れなくて困った。リクエスト は上がってるみたいなんでそのうちできるようになるかなぁ。
まあとりあえずは、カレントディレクトリとexeのパスが一致すると仮定して問題ないんかな。
以下は製作過程のメモです。
構造
exeに含めるのは、ruby本体といくつかのファイルだけ。
D:\proj2\rskit2>ocra.rb.bat --no-autodll dxtest.rb === Loading script to check dependencies === Building dxtest.exe m src a src\dxtest.rb m bin a bin\ruby.exe a bin\msvcrt-ruby191.dll m lib m lib\ruby m lib\ruby\1.9.1 m lib\ruby\1.9.1\i386-mswin32 m lib\ruby\1.9.1\i386-mswin32\enc a lib\ruby\1.9.1\i386-mswin32\enc\encdb.so a lib\ruby\1.9.1\i386-mswin32\enc\shift_jis.so m lib\ruby\1.9.1\i386-mswin32\enc\trans a lib\ruby\1.9.1\i386-mswin32\enc\trans\transdb.so a lib\ruby\1.9.1\rubygems.rb m lib\ruby\site_ruby m lib\ruby\site_ruby\1.9.1 m lib\ruby\site_ruby\1.9.1\i386-msvcrt a lib\ruby\site_ruby\1.9.1\i386-msvcrt\dxruby.so e RUBYOPT e RUBYLIB l bin\ruby.exe ruby.exe \src\dxtest.rb === Compressing === Finished (Final size was 804769)
Rubyスクリプトは、起動用のファイルのみを含める。そこから、main.rbを動的にrequireする。
ただしmain.rbはexeファイルと同じディレクトリ(←これはカレントディレクトリとは限らない)から探さなくてはならない。 なので、まずexeファイルのパスを取得する必要がある。
が、
kicker.exe -> ファイル展開 -> bin/ruby src/kicker.rb
となるので、kicker.rbからはkicker.exeの情報を知るすべがない。これは困った。
■ [web] いまひどいCAPTCHAを見た
http://narabete.com/ にユーザ登録しようとしたんだが
真ん中の数字が読めねえwww 1か3か5か6か7か0のどれかだと思う。
まあ何回かリロードしたら普通に読めるようなの( )が出てきたのでなんとかなった。
…って、これじゃ強度が足らなくないか?ロボットが防げる程度なら良いってことかな。
■ [ruby] Rubyスクリプトをexe化するためのソフト、Ocra
Rubyスクリプトのexe化というとRubyScript2ExeかExerbが有名ですが、 最近Ocraというソフトウェアがリリースされたので紹介してみる。
まずはインストール。
c:\> gem install ocra c:\> gem install win32-api # Ruby 1.8系のみ(今のところ)
あとは適当なスクリプトを用意して、
c:\> ocra.rb.bat hello.rb
すれば*1、hello.exeの出来上がり。ね、簡単でしょ?
仕組みはわりと簡単で、hello.rbを実行して必要なファイルを収集し、Ruby本体とそれらをexe内に格納する。 exeが実行されたら、テンポラリディレクトリに一式を解凍して、Ruby本体にスクリプトを実行させる。という感じ。
おまけ
比較してみた。
- Ocra
- 必要なものだけを圧縮・展開するので、速度・サイズともに悪くない。
- 試験実行を行うため、クロスコンパイルはできない(今のところ)。
- 1.9も対応済み。
- Exerb
- 必要なものだけを圧縮する。
- さらに、requireをハックしてexe内部からスクリプトを読み込むので、テンポラリディレクトリを使わない。かっこいい。
- コアファイル(ruby本体)を外だしできるので、アプリケーション(exe)がたくさんある場合もファイルサイズを抑えられる。
- しかしRubyGemsと相性が悪いという弱点が。
- ファイルサイズと(展開不要による)実行速度がメリットだが、どちらも昨今は余剰気味である。
- そういえばクロスコンパイルができた。
- RubyScript2Exe
- 使ってるRuby環境をまるごとexeにして、実行時にはテンポラリディレクトリに展開する。
- lib以下をぜんぶ圧縮・展開するので遅い。おすすめできない。
- ただし作戦がシンプルなのでLinux/Macも対応しているようだ(未確認)。
- 2007年以来更新されてない。
- Crate
- まだWindowsに対応してない。
- バイナリを作るのにCコンパイラが必要。
- スクリプトはsqliteのDBに圧縮して格納する。実行時は(requireをハックして)DBからRubyスクリプトを読み込む。
- (作者の根気が続けば)テンポラリディレクトリなし・クロスコンパイル可能と、Exerbの上位互換になり得る。
*1 Ruby 1.9系の人は --no-autodllを付けてください
■ [ruby] DXRubyスターターキットできたよー
Ocra見てからスターターキット余裕でした。
dxkit1.zip最新版はDXRubyの公式サイトからどうぞ。
game.exeをダブルクリックするとmain.rbが実行されます。
development.exeはgame.exeと同じですが、DOS窓が出るのでデバッグしたり例外を確認したりできます。
解説
単にカレントディレクトリのmain.rbをloadするようなファイルをOcraで固めただけです。
- お使いのRubyにDXRubyを入れる
- gem install ocra
- rake[Enter]
- game.exeとdevlopment.exeができる
ドキュメント書いたりとかはid:mirichiさんに任せました(ひどい!)
えええええっ (; ・`д・´)?!<br>あまりに唐突でびっくりだったんですが、<br>なにはともあれありがとうございます!<br>ドキュメントはお任せくださいw
どうもです。<br>MyGame版のrskit2.zipなんですが、手元ではsdl.soをgame.exeと同じフォルダにコピーしておかないと動きませんでした。。。
mirichiさん:<br>ありがとうございます!<br>DXRubyExtensionとかも含めて、再パッケージされるのが良いと思います。<br><br>dan5さん:<br>おお、本当ですね…。とりあえず再アップしました。
すみません、連絡先がわからなかったのでここに。<br>dxkit1_devel.zipを使わせて頂いて、<br>Ruby1.9.1+Win32API+DXRuby1.0.4+DXRubyExtension0.0.5<br>という構成でスターターキットを作成中です。<br>その際、game.rb、development.rb、main.rbを少し修正しました。<br>これらのライセンスって何も記述が無いんですが、どう扱ったらよいでしょうか。<br>修正版もアップしといたほうがいいですか?<br>それから、同梱のサンプルは画像も添付してしまってよいでしょうか。
画像・ソースともにパブリックドメインでいいです。好きにお使い下さい。
ありがとうございますー
rskit2を使わせていただきました。ありがとうございました。もし配布方法に問題がありましたらコメント下さい。<br>http://www.geocities.jp/keirin_zakko/index.html
問題ありません。使っていただけて嬉しいです。
了解しました。感謝します。