2013/08/04(日) [n年前の日記]
#1 [ruby] DXRuby 1.5.2dev版を導入
DXRuby 1.5.2dev版が公開されていたので、Ruby 1.9.x対応版のほう導入してみたり。
手元の環境では、先日気付いた不具合2点が ―― win32oleとの同時利用、SoundとAyameの同時利用時の不具合が解決されているように見えました。ありがたや。あまりにも迅速な対応に頭が下がります。
と喜んでたら、1.5.2dev版にも気になる動作を見つけてしまったかもしれず。Window.openFilename() 等を開くと、その後、マウスクリックが検出できなくなってしまうような…?
とりあえず検証用のスクリプトをメモ。画面の上・中・下でマウスクリックすれば状態を確認できる。
手元の環境では、先日気付いた不具合2点が ―― win32oleとの同時利用、SoundとAyameの同時利用時の不具合が解決されているように見えました。ありがたや。あまりにも迅速な対応に頭が下がります。
と喜んでたら、1.5.2dev版にも気になる動作を見つけてしまったかもしれず。Window.openFilename() 等を開くと、その後、マウスクリックが検出できなくなってしまうような…?
とりあえず検証用のスクリプトをメモ。画面の上・中・下でマウスクリックすれば状態を確認できる。
#!ruby -Ks # -*- mode: ruby; encoding: sjis -*- # DXRuby で openFilename() 等の実行後、マウスクリックが検出不可になる症状のテスト require 'dxruby' require 'win32ole' fnt = Font.new(12) fpath, dpath = "", "" Window.loop do Window.bgcolor = [0, 0, 0] break if Input.keyPush?(K_ESCAPE) if Input.mousePush?(M_LBUTTON) my = Input.mousePosY if my < Window.height / 3 Window.bgcolor = [255, 0, 0] # 背景色を赤に elsif my < Window.height * 2 / 3 path = Window.openFilename([["ALL Files (*.*)", "*.*"]], "ファイル選択") fpath = (path != nil)? path : "cancel" else app = WIN32OLE.new('Shell.Application') path = app.BrowseForFolder(0, "フォルダ選択", 0) if path begin dpath = path.Items.Item.path rescue dpath = "?" end else dpath = "cancel" end end end l = ["画面の上側でクリック : 画面フラッシュ", "画面の真ん中でクリック : Window.openFilename()", "[#{fpath}]", "画面の下側でクリック : WIN32OLE + ダイアログ", "[#{dpath}]", ] x, y = 16, 16 l.each do |s| Window.drawFont(x, y, s, fnt) y += fnt.size + 16 end x0, x1 = 0, Window.width y = Window.height / 3 Window.drawLine(x0, y, x1, y, C_WHITE) y = Window.height * 2 / 3 Window.drawLine(x0, y, x1, y, C_WHITE) end
[ ツッコむ ]
#2 [ruby] RubyからWSHを呼び出して結果を受け取るソレ
先日、RubyからWSHを呼び出してフォルダ選択ダイアログを開いて結果を受け取る、というやり方を試してみたわけだけど。このやり方は問題があることが分かってしまって。
コマンドプロンプト上から hoge.rb を呼び出して、その中からWSHを呼び出した時しか、標準出力に出てきた結果を受け取れない模様。また、wscript.exe を使えばおそらくコマンドプロンプトは開かないけど、標準出力は利用できなくなるそうで。つまり、CUIで作業してるときは問題ないけど、GUIアプリでやろうとすると、これではいかんなあ、と。
どうやって結果を受け取ればいいのか悩んだけど。クリップボード経由ではどうだろうかと思いついたり。以下のような感じにしてみたけれど…。
select_open_folder.vbs
select_folder_use_vbs.rb
これでどや!? と思ったけど、ダメだった。なんか知らんけど、上手く行く時と、Rubyスクリプトが固まる時がある…。
キャンセルを押したときに正常動作しないことにも気付いたり。おそらく、"" をクリップボードに入れようとした際には、クリップボード内容を更新しない、という仕組みになってそうな気がする。何かしらの文字列を無理矢理にでも投入してやらないといかんらしい。
日本語フォルダを選択した時にエラーが発生することにも気付いたり。 win32-clipboard は英数字しか扱えないそうで。かなり致命的。 _cygwin ruby1.9.3 と win32-clipboard-0.5.2 - 世界はアルゴリズムでできている。 によると、パッチを当てれば日本語も通るようになるらしいけど…。標準では日本語文字列が使えないのって、やっぱり厳しい気がする。
- ocra --windows hoge.rb で作った exe から呼び出すと、WSH(cscript.exe)を呼んだタイミングでコマンドプロンプトが開いてしまう。
- しかも、結果文字列を受け取れない。
コマンドプロンプト上から hoge.rb を呼び出して、その中からWSHを呼び出した時しか、標準出力に出てきた結果を受け取れない模様。また、wscript.exe を使えばおそらくコマンドプロンプトは開かないけど、標準出力は利用できなくなるそうで。つまり、CUIで作業してるときは問題ないけど、GUIアプリでやろうとすると、これではいかんなあ、と。
どうやって結果を受け取ればいいのか悩んだけど。クリップボード経由ではどうだろうかと思いついたり。以下のような感じにしてみたけれど…。
select_open_folder.vbs
' フォルダ選択ダイアログを開いて、選択されたフォルダパスを返す VBScript ' 結果文字列をクリップボードに入れてから終了する。 Option Explicit On Error Resume Next Dim oParam, oShell, oFolder, s, dirname, objIe Set oParam = WScript.Arguments If oParam.Length > 0 Then s = oParam(0) Else s = "フォルダを選択してください" End If dirname = "::" Set oShell = WScript.CreateObject("Shell.Application") If Err.Number = 0 Then Set oFolder = oShell.BrowseForFolder(0, s, 0) If Not oFolder Is Nothing Then ' フォルダ選択がされた場合 dirname = oFolder.Items.Item.Path Else ' キャンセルされた場合 dirname = "" End If Else ' エラーが発生した場合 ' WScript.Echo "エラー:" & Err.Description dirname = "" End If ' 結果を出力 ' WScript.Echo dirname ' 結果をクリップボードにコピー Const OLECMDID_COPY = 12 Const OLECMDID_SELECTALL = 17 Const OLECMDEXECOPT_DODEFAULT = 0 Set objIe = CreateObject("InternetExplorer.Application") ' objIe.Visible = true objIe.Navigate "about:blank" Do While objIe.Busy WScript.Sleep 100 Loop objIe.Document.Body.InnerText = dirname objIe.ExecWB OLECMDID_SELECTALL, OLECMDEXECOPT_DODEFAULT objIe.ExecWB OLECMDID_COPY, OLECMDEXECOPT_DODEFAULT objIe.Quit Set objIe = Nothing Set dirname = Nothing Set s = Nothing Set oFolder = Nothing Set oShell = Nothing Set oParam = Nothing
select_folder_use_vbs.rb
#!ruby -Ks # -*- mode: ruby; encoding: sjis -*- # # DXRubyを使ったスクリプト中から、 # WSH(.vbs)でフォルダ選択ダイアログを開き、結果を受け取ってみる # # 以前は、cscript.exe を呼び、標準出力経由で結果を受け取っていたが、 # それだとコマンドプロンプトが開いてしまって鬱陶しいので、 # wscript.exe を呼び、かつ、クリップボード経由で受け取るようにしてみた。 require 'rubygems' require 'dxruby' require 'win32/clipboard' include Win32 fpath = ENV['OCRA_EXECUTABLE'] || $0 cdir = File.dirname(File.expand_path(fpath)) fnt = Font.new(12) folder = "" cnt = 0 Window.loop do break if Input.keyPush?(K_ESCAPE) if Input.keyPush?(K_Z) title = "フォルダを選択してください (・ωー)〜☆" wsh_fname = File.join(cdir, "select_open_folder.vbs") %x[wscript "#{wsh_fname}" "#{title}"] # WSH呼び出し # クリップボードにフォルダパスが入っているはず folder = Clipboard.data puts folder folder.chomp! # 返ってきた文字列には改行も含まれているので除去 folder = "" if folder =~ /^::/ # 特殊フォルダを選択された際の対策 end l = [ "#{cnt}", "Zキー : フォルダ選択ダイアログを開く", "ESC : 終了", "[#{folder}]", ] x, y = 16, 16 l.each do |s| Window.drawFont(x, y, s, fnt) y += fnt.size + 8 end cnt += 1 end
これでどや!? と思ったけど、ダメだった。なんか知らんけど、上手く行く時と、Rubyスクリプトが固まる時がある…。
キャンセルを押したときに正常動作しないことにも気付いたり。おそらく、"" をクリップボードに入れようとした際には、クリップボード内容を更新しない、という仕組みになってそうな気がする。何かしらの文字列を無理矢理にでも投入してやらないといかんらしい。
日本語フォルダを選択した時にエラーが発生することにも気付いたり。 win32-clipboard は英数字しか扱えないそうで。かなり致命的。 _cygwin ruby1.9.3 と win32-clipboard-0.5.2 - 世界はアルゴリズムでできている。 によると、パッチを当てれば日本語も通るようになるらしいけど…。標準では日本語文字列が使えないのって、やっぱり厳しい気がする。
[ ツッコむ ]
#3 [emacs] emacsでVBScriptを編集したいのだけど
emacs には vbs用のモードってないのかな…?
_[emacs][vbscript][LotusNotes]VBScript(+Lotus Script)を emacs で使う為の設定 - ichirocのブログ が参考になりました。vbnet-mode てのがあるのか…。
_EmacsWiki: vbnet-mode.el にあるみたいなので、M-x install-elisp-from-emacswiki でインストール。
参考にしたページと同様、~/.emacs に以下を追加。
_[emacs][vbscript][LotusNotes]VBScript(+Lotus Script)を emacs で使う為の設定 - ichirocのブログ が参考になりました。vbnet-mode てのがあるのか…。
_EmacsWiki: vbnet-mode.el にあるみたいなので、M-x install-elisp-from-emacswiki でインストール。
参考にしたページと同様、~/.emacs に以下を追加。
;; vbnet-mode (require 'vbnet-mode) (add-to-list 'auto-mode-alist '("\\.vbs$" . vbnet-mode)) ; .vbsに関連付け ;; auto-complete の対象にする (add-to-list 'ac-modes 'vbnet-mode)
[ ツッコむ ]
#4 [nitijyou] ちょっと大きめの地震
昼頃地震。ちと揺れが長く続いて、またあのクラスが来るんじゃないのかと不安になったり。
古文書には、貞観地震の数年後〜十数年後にまたデカい地震が来た、といった記述があるらしいから、また来るかもと思っておいたほうがいいんだろうな。というか、それぞれがどんな周期で来るのかわからんのだから、もうあのクラスは来ないと思い込んでたら完全にマズいのだろうけど。
原発再稼働派はそのへんどう思ってるんだろう。もちろん、来ること前提で対策しとけば随分違うはずなので、真(?)の再稼働派・推進派なら、対策強化と再稼働の両方を要求すべきなのだけど。というか停止しても対策は必要なんだけど。
古文書には、貞観地震の数年後〜十数年後にまたデカい地震が来た、といった記述があるらしいから、また来るかもと思っておいたほうがいいんだろうな。というか、それぞれがどんな周期で来るのかわからんのだから、もうあのクラスは来ないと思い込んでたら完全にマズいのだろうけど。
原発再稼働派はそのへんどう思ってるんだろう。もちろん、来ること前提で対策しとけば随分違うはずなので、真(?)の再稼働派・推進派なら、対策強化と再稼働の両方を要求すべきなのだけど。というか停止しても対策は必要なんだけど。
[ ツッコむ ]
以上、1 日分です。