mieki256's diary



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() 等を開くと、その後、マウスクリックが検出できなくなってしまうような…?

とりあえず検証用のスクリプトをメモ。画面の上・中・下でマウスクリックすれば状態を確認できる。
#!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
' フォルダ選択ダイアログを開いて、選択されたフォルダパスを返す 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 に以下を追加。
;; 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 日分です。

過去ログ表示

Prev - 2013/08 - Next
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project