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) | ツッコむ ]
#2 [zatta][digital] デジタル家電のUIについてぼんやり考える
茶の間のREGZAを操作していて、東芝のデジタル家電製品は使っているとイラついてくるなあと思ったり。何故だろう。
コンピュータのUIは、ユーザの操作に対して、リアクションが必要だと思う。
東芝のデジタル家電のUIは、見事にこの2点を満たしてないように思う。
もちろん理想的なのは、メニュー項目を選択した次の瞬間、即座に次のメニューが出てくること。それはユーザの操作に対して即座にリアクションがなされてる状態だから、その場合は何も問題はないのだけど。しかしおそらく、そのように作れない事情があるのだろう。
であれば、次のメニューが出てくるまでの間、工夫しないといけない。
もしかして、そういうアレコレは不要だと思われてるのだろうか。だとしたらとんでもない話。
とにかく、画面上で無反応になる瞬間が頻繁に出現するのはマズイわけですが。そこらへん、問題として認識してるのかなあ。ファミコン=特許が切れてしまったぐらい大昔の『玩具』のレベルにすら達してないUIだったりするあたりがなんというか。どうにかならんのかと。
コンピュータのUIは、ユーザの操作に対して、リアクションが必要だと思う。
- ユーザが何かを選択したら、「ご主人様が選んだのはコレですね。ボクは分かってますよ」と伝える。
- 処理がかかるようであれば、「ボクは今ちゃんと仕事をしてます。壊れてませんよ。ご主人様の命令を無視なんかしてませんよ」と伝える。
- 「コイツ、わかってんのか? 俺が何をしたいか伝わってるのか?」
- 「コイツ、俺の命令を無視してるのか? もしかして壊れたのか?」
東芝のデジタル家電のUIは、見事にこの2点を満たしてないように思う。
- メニューを選択しても、どの項目を選択したのか、積極的に、視覚で伝えてこない。(最近の機種は、SEが鳴るのが、せめてもの救いか…? でもSEでは、何が選択されたかまでは伝えられない)
- 次のメニューが表示されるまで一瞬間が空くが、その間は無反応になる。(画面に何の変化も現れない状態になる)
もちろん理想的なのは、メニュー項目を選択した次の瞬間、即座に次のメニューが出てくること。それはユーザの操作に対して即座にリアクションがなされてる状態だから、その場合は何も問題はないのだけど。しかしおそらく、そのように作れない事情があるのだろう。
であれば、次のメニューが出てくるまでの間、工夫しないといけない。
- 選択した項目を点滅させたり、色を変えたりする。
- 次のメニューが出てくるまで、前のメニュー項目をフェードアウトさせる。
- 前のメニューが横にスライドして消えていく。
もしかして、そういうアレコレは不要だと思われてるのだろうか。だとしたらとんでもない話。
- ファミコンゲームでスタートボタンを押すと、「PUSH START」が点滅するのは何故か?
- コナミのバブルシステムが、電源投入後に磁気メモリからデータをロードする間、音楽を流しながらカウントダウンするのは何故か?
- ナムコのリッジレーサーPS1版が、CDからロードする間、ギャラクシアンを遊べるのは何故か?
- Ajaxを利用したWebサイトが、サーバと通信するたびに、くるくる回るアニメgifを表示するのは何故か?
とにかく、画面上で無反応になる瞬間が頻繁に出現するのはマズイわけですが。そこらへん、問題として認識してるのかなあ。ファミコン=特許が切れてしまったぐらい大昔の『玩具』のレベルにすら達してないUIだったりするあたりがなんというか。どうにかならんのかと。
[ ツッコむ ]
以上、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)