Ruby-1.9.3-RC1がでたので「175倍現象」を再確認してみた

 arton さんがさっそくに Ruby-1.9.3-RC1 の Windows パッケージを作ってくださったのでいれてみた。で、そういえばと思い出した。昨年 1.9.2 で Ruby/Tk 使っていたら異様に遅い現象が起きていて、まつもとさんの目にまで触れるまでになってしまったのだった。

 ということで試してみることに。結果は「早い」。ということで一応公開しておしらせ代わりとしておかなくては。点取り虫ゲームを実行して Window が表示されるまでの時間で計測。

ruby 1.9.2p290 (2011-07-09 revision 32553) [i386-mswin32_100]


13.244424
15.397227
12.246021
13.072823
15.210027

--------
ruby 1.9.3dev (2011-09-23 revision 33323) [i386-mswin32_100]

0.405601
0.561601
0.452401
0.546001
0.546001
(単位は秒数)


| | コメント (0) | トラックバック (0)
|

点取り虫ゲームRuby/Tk版

 点取り虫ゲームはこんなゲーム。テスト用のデモ。

| | コメント (0) | トラックバック (0)
|

メモ:もろもろ結果

WindowsXP(32bit)
ActiveTcl8.5.7.0(x86)
ruby 1.8.7 (2010-06-23 patchlevel 299) [i386-mswin32]
1.020.830.840.840.85
0.830.830.840.840.84
ruby 1.9.2p0 (2010-08-18) [i386-mswin32_100]
4.464.154.604.194.03
4.053.674.234.033.84

Windows7(64bit)
ActiveTcl8.5.8.2(x86)
ruby 1.8.7 (2010-08-16 patchlevel 302) [i386-mswin32]
0.170.170.150.170.17
0.170.170.170.170.15
ruby 1.9.1p243 (2009-07-16 revision 24175) [i386-mswin32]
13.9310.538.589.937.25
8.8613.0714.5712.8215.17
ruby 1.9.2p0 (2010-08-18) [i386-mswin32_100]
18.5929.1518.7319.7328.32
23.7129.0020.8828.3930.04
rubyinstaller1.9.2p0+tk-win-0.2.2-x86-mingw32
3.903.783.563.593.53
3.883.443.343.563.71

Virtual Box on Windows7(x64)
ubuntu9.04 tcl8.4 tk8.4
1.8.7-p72
0.230.240.230.230.23
0.230.240.230.240.23
1.9.0
0.630.871.030.971.29
0.800.710.630.900.99

Virtual Box on Windows7(x64)
ubuntu9.10 tcl8.4 tk8.4
1.8.7-p174
0.270.230.240.230.24
0.220.240.230.230.23
1.9.1-p243
3.082.872.863.192.94
2.903.092.953.012.88

Virtual Box on Windows7(x64)
ubuntu10.04 tcl8.4 tk8.4
1.8.7-p249
0.560.220.220.220.28
0.250.240.240.240.24
1.9.1-p273
4.154.034.294.084.11
4.153.993.993.994.10

Virtual Box on Windows7(x64)
ubuntu10.10 tcl8.4 tk8.4
1.8.7-p299
0.180.160.160.160.16
0.160.160.170.150.16
1.9.2-p0
5.675.985.995.785.78
5.195.765.555.635.64

 [ Ruby-1.9.3-RC1がでたので「175倍現象」を再確認してみた: つらつらぐさ ]

| | コメント (2) | トラックバック (0)
|

うにっくすへの道は険しい

 Windows 環境特有の現象のようでもあるので、ここはひとつ PC-UNIX で試してみたいなあということで、Virtual Box 上の Ubuntu 9.10 に Ruby 1.9.2-p0 をソースからコンパイルしてインストールしてみた。で、require 'tk' してみると、「tk ってなに?」状態。wish で表示を確認したので tcl は入っているようなのだけれど。あれこれ読んで tcl のフォルダなどをこれか? というあたりを指定してみても見つからないらしく「ruby/tk はコンパイルしなかったよん」といわれるだけ。しまいには X11 ってどこ? だったりも。

 これはいけないとパッケージマネージャ? から、最新でなくともきちんとしたパッケージを入れたほうがよさそうだと思い試すも、1.9.2 があるせいかなんだかうまくいかない。ウェブの情報からコンソールで apt-get でやると 1.8.7 をインストールされてしまって、それでは意味がない。

 うーん、なかなか手ごわい。もちろん普段から使い慣れている人にとってはさほど問題なことはないのかもしれないけれど、Windows な環境からくるとさっぱりな感じに。そして、こんなに面倒なの? と思ってしまったり。

 もっとも、それは Windows 用にパッケージしてくださる方がちゃんと使えるように作ってくださっているからこそなわけで、そう思うと改めて感謝の気持ちが。

 結局、これは仕切りなおししたほうが早かろうということで、手持ちの 9.04 をインストールしなおすことに。そしてパッケージマネージャにある Ruby や tcl などもろもろをインストールすることでようやく解決。Ruby/Tk が使えるようになった。

 あるいは PC-BSD のほうが楽かと思ったら、こちらも同様。ports から make を試みても途中でエラーで止まってしまう。tcl をインストールしようとしているのに tcl が見つからないとかなんとか言われてしまっては、いったいどうしろと。(違うのかもしれないけれど)

 PC-UNIX の道はなかなかに険しいです。

| | コメント (3) | トラックバック (0)
|

175倍の2

 [ 175倍: つらつらぐさ ]

 なにやらきむらさんに補足されたり、まつもとさんの Twitter 経由があったりでとんでもないアクセスになっている。

 で、やっぱりいろいろ切り分けるべきかなということで、少し試してみた。まず、175 倍遅いとなったのは arton さんがパッケージされた msi なのだけれど、ウィンドウが表示されるまでは時間がかかっているけれど、表示され方のすばやさとか、その後の実行のスムースさは目に見えてすばやい感じ。

 いったん削除して、RubyInstaller 1.9.2-p0 をインストールしてみた。が、このパッケージには Ruby/Tk が入っていない! たまに「Ruby/Tk インストール」で検索がある理由はそういうことだったのかもしれない。Ruby/Tk は標準添付ライブラリという頭があったのだけれど。ということで、手軽な方法としたら arton さんのパッケージから lib/tk 以下をコピーしたり、lib/mswin32* 以下に tcltklib.so をコピーしたりするか、永井さんが作った Ruby/Tk Kit をコピーするかすれば使える。Ruby/Tk Kit であれば Tcl のインストールも不要ではある。

 で、RubyInstaller による Ruby1.9.2-p0 の結果は、ウィンドウが表示されるまで約 4 秒ほど。ただし、多数のウィジェットが描画されていく様子が目で追えるという状況で、このあたりのすばやさは arton さんのパッケージとは雲泥の差。その後の実行でもややカクカクした印象が。(使えないということではまったくない)

 ちなみに CPU は Core i5 430M 2.27GHz、メモリ 2GB、HDD 320GB。アンチウィルスは Avast! Free を使っている。

 ASR1.8.7-p302 でもコンソールを開いたときの時間は瞬時なのだけれど、1.9.2-p0 のはそれにもかなり時間がかかっているので、なにかが起きているのかなあとは思うのだけれど、ほかにそういう方はいるのだろうか?(ということは ruby-list にでも出すべきかしらん)

 ということで、1.9.2 が遅いというわけではないのだと思われ。

#RubyInstaller では Ruby/Tk がないために、ffi-tk とかを入れろという話らしいが、Ruby/Tk で書いたものを require を修正した程度ではうまく動作しないようでもあるので、ちょっと面倒かもしれない。

追記:(10/27)
 コンソールが開かれるまでの時間は、どちらもさほど変わりはありませんでした。どうやら何度も繰り返しているときの”遅い”という印象がそのまま残ってしまっていたようです。ということで、ひとまず取り消し線。また、一応 ruby-list にも出してみましたが、下にいただいたコメントを見ると、どうやら遅くなっている原因は ActiveTcl 側との関係にありそうな気配。理由はさだかではないですけれど。

追記2:(10/27)
 RubyInstaller の結果が比較的よく見えているのは、あるいは Ruby/Tk Kit を使っているせいかも。ActiveTcl ではなくてTcl をパックした(とでもいうのかな) tcltklib.so になっているようなので。

追記3:(10/28)
 RubyInstaller で tk を使うのであれば、Ruby/Tk Kit を使う。他のパッケージからコピーしても動くわけではない。未確認で書いてしまったので取り消しました。

 [ Ruby-1.9.3-RC1がでたので「175倍現象」を再確認してみた: つらつらぐさ ]

| | コメント (7) | トラックバック (0)
|

175倍

 このところ Ruby は 1.9.x を常用しようということで使っているのだけれど、Ruby/Tk で書いたものの実行がなんだか遅いので(というかウィンドウが表示されるまでが遅い)、やたらとウィジェット生成しているせいかなあ、などと思っていた。ところが、ふと 1.8.7 で実行してみたらそれこそ瞬時に表示されて唖然。なにが違うのかと。

 ということで計測してみたら、1.9.2-p0 では 35 秒平均ほど。一方の 1.8.7-p302 では 0.2 秒弱平均。およそ 175 倍。

 これは Windows だからなのか、たまたま自分の環境によっているのか、はたまた ASR とそうでないとの差なんだろうか。ウィンドウ表示されてからの印象は特に変わりはないのだけれど。

 謎です。


#ちなみに「それこそ」の使い方が、最近妙なことになっていはしないかと思っていたりするのですが。

 [ Ruby-1.9.3-RC1がでたので「175倍現象」を再確認してみた: つらつらぐさ ]

| | コメント (0) | トラックバック (1)
|

TkRadioButtonのメモ

 Ruby/Tk でラジオボタンを使うためのメモ。

 「Ruby アプリケーションプログラミング」とか、「Ruby を 256+ 倍使うための本 場外乱闘編」とかにあるサンプルを実行すると、少なくとも現状ではちょっと「えっ?」な結果になってしまう。

require 'tk'
x = TkVariable.new()
TkRadioButton.new(nil, 'text' => 'male ', 'variable' => x, 'value' => 'Male').pack
TkRadioButton.new(nil, 'text' => 'female', 'variable' => x, 'value' => 'Female').pack
TkButton.new(nil, 'text' => 'show value', 'command' => proc{p x.value}).pack
Tk.mainloop

 これを実行すると、
Tkradiobutton_test

 となって、どちらも選択された状態になってしまう。初期値を x に与えてないと駄目らしい。ということで、

x = TkVariable.new('Male')

 として実行すると、
Tkradiobutton_test02

 初期値のほうだけチェックされた状態で実行される。

 関連するふたつのラジオボタングループがあって、一方の選択によっては、もう一方の選択肢を制限したいといいうときには、こんな感じに。

require 'tk'
x = TkVariable.new("短大")
y = TkVariable.new("1年")
f1 = TkFrame.new.pack
f2 = TkFrame.new.pack
rb_s = TkRadioButton.new(f1, 'text' => "短大", 'variable' => x, 'value' => "短大").pack('side' => 'left')
rb_l = TkRadioButton.new(f1, 'text' => "大学", 'variable' => x, 'value' => "大学").pack('side' => 'left')
TkRadioButton.new(f2, 'text' => "1年", 'variable' => y, 'value' => "1年").pack('side' => 'left')
TkRadioButton.new(f2, 'text' => "2年", 'variable' => y, 'value' => "2年").pack('side' => 'left')
rb_3 = TkRadioButton.new(f2, 'text' => "3年", 'variable' => y, 'value' => "3年").pack('side' => 'left')
rb_4 = TkRadioButton.new(f2, 'text' => "4年", 'variable' => y, 'value' => "4年").pack('side' => 'left')
rb_3.state('disabled')
rb_4.state('disabled')
rb_s.bind 'Button', proc{ rb_3.state('disabled'); rb_4.state('disabled') }
rb_l.bind 'Button', proc{ rb_3.state('normal'); rb_4.state('normal') }

TkButton.new(nil, 'text' => 'show value', 'command' => proc{p x.value, y.value}).pack
Tk.mainloop

 実行するとこんな感じ。
Tkradiobutton_test03

 実用的な例かといえば微妙ではあるけれど、「短大」を選んだ状態では「3年、4年」は選択できないようになっていて、「大学」(4年制というつもりで)を選ぶと「3年、4年」も選択できるようになる。ただ、再び「短大」に戻したときに、「3年」とか「4年」にチェックは残ったままなので、そのあたりの処理は必要。

 で、現状の悩みは、こうした設定用のウィンドウとかダイアログ表示のウィンドウとかを出している間、それを閉じるまではメインの実行を停止させるにはどうしたらよいのかということ。sleep 使ってもうまく復帰してくれない。手順や方法の問題なのかもしれないけれど。

| | コメント (0) | トラックバック (0)
|

ボタンonボタン

 しばらくぶりに Ruby/Tk を使ってみたら、なんとも奇妙な状況に遭遇。一見なんの問題もないように思ったのだけれど、実行してみると奇妙なことに。

require 'tk'
f = b = fb = []
3.times do |i|
 f[i] = TkFrame.new.pack
 3.times do |j|
  k = i * 3 + j
  b[k] = TkFrame.new(f[i]).pack('side' => 'left')
  b[k] = TkButton.new(fb[k], 'text' => "#{k + 1}", 'width' => 7).pack
 end
end
Tk.mainloop

Tkframeeach


 なぜか一行目だけボタンの上にボタンが表示されてしまう。二行目以降は問題ないのに。

 あれこれしている中でふと次のようにしてみたら、なぜか解消された。謎。まあ、こういう例は pack を使わずに grid を使うべきといってしまえば、それまでなのだけれど。

require 'tk'
f = Array.new(3)
fb = b = Array.new(9)
3.times do |i|
 f[i] = TkFrame.new.pack
 3.times do |j|
  k = i * 3 + j
  fb[k] = TkFrame.new(f[i]).pack('side' => 'left')
  b[k] = TkButton.new(fb[k], 'text' => "#{k + 1}", 'width' => 7).pack
 end
end
Tk.mainloop

Tkframeeach2


| | コメント (0) | トラックバック (0)
|

テケテケな日々(Ruby/Tkメモのまとめ)

 永井さんによる Ruby/Tk の 256 倍シリーズは出ているのだけれど、残念ながら絶版状態で入手は不可。ただ、せめてリファレンスマニュアルがひととおり整備されていれば、一応の下地は揃うので利用のための壁が低くなるのだろうなとは思います。で、先の RubyKaigi2009 の LT では、ドキュメント整備がはじまっているといった話もあったので、そのあたりにも期待したいところ。(ちょうど案内がでましたね)

 実際に今回使ってみて思うのは、手軽に GUI 環境を作るには案外簡単で便利、そしてまずまず必要十分なものが作れるのではないかなということ。

 もちろん昨今の華やかな印象の GUI と比べたら、やや貧相に思うこともあるかもしれないけれど、あるいはそのあたりはテクニックでカバーできるのかもしれないし、手軽な GUI ということで割り切れるのであればなんら問題はないともいえるかも。

 ただ、汎用として提供しようとしたときには問題もあるのだろうなとは思うけれど。Ruby そのものについては exerb とかがあるので実行ファイル化することができるけれど、Ruby/Tk を使うにあたっては Tcl/Tk のインストールが必要なので、そこまでは一緒にしにくいだろうと。別に Active Tcl をインストールしてもらうということもあるけれど、たとえば今回作ったものなどは、さらに ImageMagick のインストールも必要になってきてさらに困難を増すという。

 そうなってくるとウェブアプリケーションというのは、そこにアクセスすれば誰でも使えるという意味で、便利な存在なのだなとちょっと思う。(Ruby/TkORCA がそれになるのかも)

 とはいえ個人的に使うのであったらまったく問題はないので、手軽な GUI プログラムとするにはよいのではないかなと。ドキュメントの不足についてはおいおい充足されていくであろうし、現状でもウェブ上にはそれなりの情報がある。いくつかの書籍についてはいまだに入手可能でもある。最終的にはソースを読むとかもあるけれど、ひとまずは Tcl/Tk の Tk の項を読めば(英語だけど)、どんなオプションなどがあってどう使えばよいかはわかる。

 なにしろ Ruby/Tk は Ruby にそもそも同梱されているのだし、お手軽さは十分。とりあえずの GUI 環境としてはじめてみるのがよいのではないかなと。

 折りよく永井さんが Ruby/Tk の情報サイト(wiki)を公開されたというので、こちらのほうがいろいろ情報がまとまっていてよさそうです(わたしのメモよりも)。

 Ruby/TkORCA と聞いて、NaCl で作られたレセプトシステムの ORCA を連想したのだけれど、まったく違っていた。電子レセプト化は推進の動きがあるものの、なにかと問題も多くてなかなかに険しいところもあるらしい。せっかくの ORCA が標準として導入されたらよいのに、などと素人目には思ってしまう。

#今回はこれでお初にしようかとも思ったのだけれど、まごまごしているうちに時間が過ぎてしまったのでした。

 カンバーック!

4756139930Rubyを256倍使うための本 界道編
アスキー 2001-12

by G-Tools

 抑えておきたい。

4274064611Rubyアプリケーションプログラミング
オーム社 2002-04

by G-Tools

| | コメント (0) | トラックバック (0)
|

テケテケな日々(Ruby/tkメモの4)

 いずれも逆引き Ruby/tk からをベースに、部分的に Tk マニュアルを参照して。

■ファイルオープンダイアログを使う

require 'tk'
b_fopen = TkButton.new('text' => 'ファイル').pack
b_fopen.command proc {
      filepath = Tk.getOpenFile
      p filepath
}
Tk.mainloop

 Tk.getOpenFile を使うと標準のファイルオープンダイアログが開くらしい。
 同様にして保存ダイアログを使うには、getSaveFile があるようだ。


■リストボックス

require 'tk'
LIST = ['red', 'blue', 'black']
lst = TkListbox.new {
#      selectmode 'browse'
      pack
}
lst.insert 0, *LIST
lst.bind '<ListboxSelect>', proc {
      p lst.get(lst.curselection)
}
Tk.mainloop

selectmode
 single, browse, multiple, extended
 ひとつを選択するのは、single か browse モード。複数選択は、multiple か extended モード。基本的には browse か extended を利用するのがよいようだ。デフォルトは browse ということなので、ひとつを選択するのであれば指定しなくてもよい。

 insert で実際にリストボックスに表示する文字列を取り込む。
 bind はイベント処理で、'<ListboxSelect>' でリストボックスの項目を選択したときの処理が定義されているものらしい。実際の値は proc 以下のようにして取得。

| | コメント (0) | トラックバック (0)
|