トップ «前の日記(2009-06-05) 最新 次の日記(2009-06-08)» 編集

Route 477



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化というとRubyScript2ExeExerbが有名ですが、 最近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見てからスターターキット余裕でした。

game.exeをダブルクリックするとmain.rbが実行されます。

development.exeはgame.exeと同じですが、DOS窓が出るのでデバッグしたり例外を確認したりできます。

解説

単にカレントディレクトリのmain.rbをloadするようなファイルをOcraで固めただけです。

  1. お使いのRubyにDXRubyを入れる
  2. gem install ocra
  3. rake[Enter]
  4. game.exeとdevlopment.exeができる

ドキュメント書いたりとかはid:mirichiさんに任せました(ひどい!)

[Ruby/SDL] Ruby/SDLスターターキット2

上のやつのRuby/SDL + MyGame版

本日のツッコミ(全9件) [ツッコミを入れる]
mirichi (2009-06-07 05:55)

えええええっ (; ・`д・´)?!<br>あまりに唐突でびっくりだったんですが、<br>なにはともあれありがとうございます!<br>ドキュメントはお任せくださいw

dan5 (2009-06-09 11:52)

どうもです。<br>MyGame版のrskit2.zipなんですが、手元ではsdl.soをgame.exeと同じフォルダにコピーしておかないと動きませんでした。。。

yhara (2009-06-10 00:41)

mirichiさん:<br>ありがとうございます!<br>DXRubyExtensionとかも含めて、再パッケージされるのが良いと思います。<br><br>dan5さん:<br>おお、本当ですね…。とりあえず再アップしました。

mirichi (2009-06-16 22:26)

すみません、連絡先がわからなかったのでここに。<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>それから、同梱のサンプルは画像も添付してしまってよいでしょうか。

yhara (2009-06-17 10:54)

画像・ソースともにパブリックドメインでいいです。好きにお使い下さい。

mirichi (2009-06-17 12:43)

ありがとうございますー

k-zakko (2011-03-16 00:27)

rskit2を使わせていただきました。ありがとうございました。もし配布方法に問題がありましたらコメント下さい。<br>http://www.geocities.jp/keirin_zakko/index.html

yhara (2011-03-17 17:26)

問題ありません。使っていただけて嬉しいです。

k-zakko (2011-03-18 01:22)

了解しました。感謝します。