2010/12/22(水) [n年前の日記]
#1 [ruby] 日常的に使うRubyのバージョンを1.8.7にした
Windows XP + ActiveScriptRuby 1.9.2 上で、wxRuby をインストールしようと試みる。
gem install wxruby-ruby19 と打ったら「序数 xxxx がダイナミックライブラリ LIBEAY32.dll から見つかりませんでした。」とエラーが。
どうも RubyGems を使う際に必要な dll が、1.9.2 環境には入ってないらしい。 _Ruby1.9.1のWindows環境へのインストール - Ruby入門勉強ルーム や _WindowsにRuby1.9.1をインストールする − @IT を参考に、
が、今度は wxruby のインストールで問題が。wxruby の 1.9.7 が入ってしまうように見える。2.0.1 が既にあるんじゃないのか。何故に古いほうが。gem search -r wxruby と打ってみたら、どうも mswin32版用の wxruby は無いっぽい? mingw32版はあるみたいだけど、ActiveScriptRuby は mswin32版なわけで…。
面倒くさくなってきた。Ruby 1.9.2 を使うのは諦めた。日常的に使うのは 1.8.7 にする。path を、1.8.7 のソレに変更。gem install wxruby で、wxruby をインストール。
gem install wxruby-ruby19 と打ったら「序数 xxxx がダイナミックライブラリ LIBEAY32.dll から見つかりませんでした。」とエラーが。
どうも RubyGems を使う際に必要な dll が、1.9.2 環境には入ってないらしい。 _Ruby1.9.1のWindows環境へのインストール - Ruby入門勉強ルーム や _WindowsにRuby1.9.1をインストールする − @IT を参考に、
- openssl-0.9.8q-win32-bin_dynamic.zip
- zlib-1.1.4-1-mswin32.zip
- libeay32.dll
- ssleay32.dll
- zlib.dll
が、今度は wxruby のインストールで問題が。wxruby の 1.9.7 が入ってしまうように見える。2.0.1 が既にあるんじゃないのか。何故に古いほうが。gem search -r wxruby と打ってみたら、どうも mswin32版用の wxruby は無いっぽい? mingw32版はあるみたいだけど、ActiveScriptRuby は mswin32版なわけで…。
面倒くさくなってきた。Ruby 1.9.2 を使うのは諦めた。日常的に使うのは 1.8.7 にする。path を、1.8.7 のソレに変更。gem install wxruby で、wxruby をインストール。
◎ ocra もインストール。 :
gem install ocra でインストールした。
wxRuby を使ってるスクリプトを、exerb と ocra で exe化してみた。(この時点では問題があることに気付いてない。詳細は後述。)
exerb が出力したソレは10MB。ocra が出力したソレは5MB。ただ、ocra のソレはzmaで圧縮されているらしい。exerb版も圧縮しなきゃフェアじゃない。 _UPX: the Ultimate Packer for eXecutables - Homepage から upx307w.zip をDL、解凍。exerb版に upx hoge.exe で圧縮した。3MBまで縮んだ。exerbだけではファイルサイズが大きいが、exerb + UPX なら ocra よりファイルサイズを小さくできる模様。
試しに、VisualuRuby を使ってるスクリプトを exerb で exe化して、更に UPX をかけてみた。0.4MBになった。うーん。
Tcl/Tk スクリプトを exe化したものに UPX をかけてみた。もう圧縮済みだよ、と文句を言われてしまった。
結論。Windows 上で Ruby を使ってGUIのスクリプトを作るときは、VisualuRuby を使って、exerb で exe化して、UPX で圧縮するのがヨサゲかも。ファイルサイズも ocra より小さくなるし、かつ、起動も速い。wxRuby を使うと、ファイルサイズは大きくなるし、起動も遅くなる。…でも、1.9.x では exerb が使えないので、ocra を使うしか。
wxRuby を使ってるスクリプトを、exerb と ocra で exe化してみた。(この時点では問題があることに気付いてない。詳細は後述。)
exerb が出力したソレは10MB。ocra が出力したソレは5MB。ただ、ocra のソレはzmaで圧縮されているらしい。exerb版も圧縮しなきゃフェアじゃない。 _UPX: the Ultimate Packer for eXecutables - Homepage から upx307w.zip をDL、解凍。exerb版に upx hoge.exe で圧縮した。3MBまで縮んだ。exerbだけではファイルサイズが大きいが、exerb + UPX なら ocra よりファイルサイズを小さくできる模様。
試しに、VisualuRuby を使ってるスクリプトを exerb で exe化して、更に UPX をかけてみた。0.4MBになった。うーん。
Tcl/Tk スクリプトを exe化したものに UPX をかけてみた。もう圧縮済みだよ、と文句を言われてしまった。
結論。Windows 上で Ruby を使ってGUIのスクリプトを作るときは、VisualuRuby を使って、exerb で exe化して、UPX で圧縮するのがヨサゲかも。ファイルサイズも ocra より小さくなるし、かつ、起動も速い。wxRuby を使うと、ファイルサイズは大きくなるし、起動も遅くなる。…でも、1.9.x では exerb が使えないので、ocra を使うしか。
◎ Ruby/Tkはダメ。 :
ちなみに、Ruby/Tk も試したのだけど、exerb でも ocra でも exe化できなかった。
exerb で exe化したソレを実行すると、
ocra で exe化しようとすると、
解決策を検索してみても、Ruby/Tkの使用を諦めてる事例しか見つからなかった。自分も諦める。exe化も希望した場合、Ruby/Tkは使えない。
Ruby/Tk-Kit というものもあるらしいが、Windows 用の 1.8.7 のものは無いようで。1.9.x に移行すると wxRuby で面倒なことになりそうだし、exerb は使えなくなるし。かといって 1.8.7 では Ruby/Tk-Kit が試せない。うーん。
Perl/Tk でもドタバタしたことを考えると、Tk を使う時は Tcl/Tk しか使わない、ということにしたほうがいいのかもしれない。が、Tcl は言語仕様が…。つまりは Tk 自体に見切りをつけるのが正解かもしれぬ。という気分にもなってきた。
Perl/Tkを知って「LLでもGUIができるんか」と喜んで触り始めて数年経つような気がする。しかし */Tk はあらかじめ環境を整えないと動かせない。ファイルを1つだけ別PCに持って行っていきなり動かすということがちと面倒。Tk以外の選択肢もあることを知った今では、あえて */Tk を使う必要性は無いのかもしれない。すんなり動いてexe化できるならまだしも、こうも苦労させられるのでは…。
exerb で exe化したソレを実行すると、
tk.rb:902: no such file to load -- tk/event (LoadError)てなエラーが出て実行できない。
ocra で exe化しようとすると、
=== Loading script to check dependencies === WARNING: Object::TkcTagGroup was defined autoloadable, but caused NameError === WARNING: Object::TkNotebook was defined autoloadable, but caused NameError === WARNING: Object::TkProgressbar was defined autoloadable, but caused NameError === WARNING: Object::TkSeparator was defined autoloadable, but caused NameError === WARNING: Object::TkSizeGrip was defined autoloadable, but caused NameError === WARNING: Object::TkTreeview was defined autoloadable, but caused NameError C:/usr/local/ruby-1.8.7/lib/ruby/1.8/tk.rb:1807:in `_invoke_without_enc': can't find package resource (RuntimeError) from C:/usr/local/ruby-1.8.7/lib/ruby/1.8/tk.rb:1807:in `_ip_invoke_core' from C:/usr/local/ruby-1.8.7/lib/ruby/1.8/tk.rb:1843:in `_tk_call_core' from C:/usr/local/ruby-1.8.7/lib/ruby/1.8/tk.rb:1871:in `tk_call_without_enc' from C:/usr/local/ruby-1.8.7/lib/ruby/1.8/tk/macpkg.rb:39 from C:/usr/local/ruby-1.8.7/lib/ruby/gems/1.8/gems/ocra-1.2.0/bin/ocra:186:in `const_get' from C:/usr/local/ruby-1.8.7/lib/ruby/gems/1.8/gems/ocra-1.2.0/bin/ocra:186:in `attempt_load_autoload' from C:/usr/local/ruby-1.8.7/lib/ruby/gems/1.8/gems/ocra-1.2.0/bin/ocra:183:in `each' from C:/usr/local/ruby-1.8.7/lib/ruby/gems/1.8/gems/ocra-1.2.0/bin/ocra:183:in `attempt_load_autoload' from C:/usr/local/ruby-1.8.7/lib/ruby/gems/1.8/gems/ocra-1.2.0/bin/ocra:181:in `each' from C:/usr/local/ruby-1.8.7/lib/ruby/gems/1.8/gems/ocra-1.2.0/bin/ocra:181:in `attempt_load_autoload' from C:/usr/local/ruby-1.8.7/lib/ruby/gems/1.8/gems/ocra-1.2.0/bin/ocra:175:in `loop' from C:/usr/local/ruby-1.8.7/lib/ruby/gems/1.8/gems/ocra-1.2.0/bin/ocra:175:in `attempt_load_autoload' from C:/usr/local/ruby-1.8.7/lib/ruby/gems/1.8/gems/ocra-1.2.0/bin/ocra:325:in `build_exe' from C:/usr/local/ruby-1.8.7/lib/ruby/gems/1.8/gems/ocra-1.2.0/bin/ocra:640と出力されてそもそもexeが出来上がらない。… ActiveTcl の dll が関係してるんだろうか。
解決策を検索してみても、Ruby/Tkの使用を諦めてる事例しか見つからなかった。自分も諦める。exe化も希望した場合、Ruby/Tkは使えない。
Ruby/Tk-Kit というものもあるらしいが、Windows 用の 1.8.7 のものは無いようで。1.9.x に移行すると wxRuby で面倒なことになりそうだし、exerb は使えなくなるし。かといって 1.8.7 では Ruby/Tk-Kit が試せない。うーん。
Perl/Tk でもドタバタしたことを考えると、Tk を使う時は Tcl/Tk しか使わない、ということにしたほうがいいのかもしれない。が、Tcl は言語仕様が…。つまりは Tk 自体に見切りをつけるのが正解かもしれぬ。という気分にもなってきた。
Perl/Tkを知って「LLでもGUIができるんか」と喜んで触り始めて数年経つような気がする。しかし */Tk はあらかじめ環境を整えないと動かせない。ファイルを1つだけ別PCに持って行っていきなり動かすということがちと面倒。Tk以外の選択肢もあることを知った今では、あえて */Tk を使う必要性は無いのかもしれない。すんなり動いてexe化できるならまだしも、こうも苦労させられるのでは…。
◎ wxRubyも実はダメだった。 :
wxRubyを使っているスクリプトをexe化して別PCに持っていったら、msvcp71.dll が見つからないと言われてしまった。うーん。
_vcpvcr71 (msvcp71.dllとmsvcr71.dll同梱):Vector から、該当dllをDL。解凍して Rubyのインストールフォルダにコピー。exe化する際に、これらのdllを同梱する。
exerb の場合は、レシピファイル .exy の最後のあたりに以下のような記述を追加してから、exerb でexe化した。
参考サイト。
_Exerb - Astarisk Works Wiki
_Rubyをexe化するExerbで作ったexeがDLLがないとぼやくときの対処方法 - メモブロ
ocra の 場合は、
_vcpvcr71 (msvcp71.dllとmsvcr71.dll同梱):Vector から、該当dllをDL。解凍して Rubyのインストールフォルダにコピー。exe化する際に、これらのdllを同梱する。
exerb の場合は、レシピファイル .exy の最後のあたりに以下のような記述を追加してから、exerb でexe化した。
msvcp71.dll: file: (Rubyインストールフォルダ)/bin/msvcp71.dll msvcr71.dll: file: (Rubyインストールフォルダ)/bin/msvcr71.dllこうして作った exe を別PCに持っていったら動いてくれた。
参考サイト。
_Exerb - Astarisk Works Wiki
_Rubyをexe化するExerbで作ったexeがDLLがないとぼやくときの対処方法 - メモブロ
ocra の 場合は、
ocra --dll msvcp71.dll --dll msvcr71.dll --windows hoge.rbみたいな。dll は Rubyのインストールフォルダ\bin 以下に無いといかんらしい。…ただ、exeを作る際のログを眺めると、
a bin/rubyw.exe a bin/msvcrt-ruby18.dll a bin/MSVCP71.dll a bin/MSVCR71.dll a bin/zlib1.dll a bin/msvcp71.dll a bin/msvcr71.dllといった行が見える。ファイル名の大文字小文字で別ファイルとして見ているのだろうか。よくわからない…。
◎ 勢い余ってShoesもインストールしてみたが。 :
添付のマニュアルをざっと眺めてみたり、サンプルを動かしてみたけど…。コレ、ActionScript か Processing (Proce55ing)でいいんじゃないのか。何もわざわざ Ruby っぽいソレでやらんでも…。まあ、それを言ったら、何もわざわざ Ruby で Tk だの wxWidgets だのを弄らんでも、という話にも繋がってしまうのだろうけど。
この記事へのツッコミ
[ ツッコミを読む(1) | ツッコむ ]
以上です。
ocra rubyfile.rb --windows C:\Ruby192\lib\tcltk\ --no-autoload --add-all-core
(--add-all-core is optional, don't include it if the exe works without it)