2013/08/02(金) [n年前の日記]
#1 [ruby] DXRuby 1.5.1devをインストールしたら若干不具合が
今まで DXRuby 1.5.0dev?を使ってスクリプトを書いていたのだけど。1.5.1devが公開されていると知り、導入してみたところ不具合が。
ひとまず、公式サイトの掲示板に報告してきたけれど。実は自分の環境に起因する不具合だったらどうしよう、てな不安も。その時はゴメンナサイ。
ひとまず、公式サイトの掲示板に報告してきたけれど。実は自分の環境に起因する不具合だったらどうしよう、てな不安も。その時はゴメンナサイ。
◎ win32oleとの相性。 :
不具合その1。DXRuby と win32ole を同時利用できない。require 'win32ole' を書いただけでエラーが発生してしまう。
以下は想像。
win32oleを使って、フォルダ選択ダイアログを開きたいのですが…何か手はないものか。
require 'dxruby' require 'win32ole'と書くと、以下のようなエラーメッセージが表示される。
C:/ruby193mingw/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `new': fail: OLE initialize (RuntimeError)
HRESULT error code:0x80010106
Cannot change thread mode after it is set.
from C:/ruby193mingw/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
from C:/ruby193mingw/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
from C:/ruby193mingw/lib/ruby/1.9.1/win32ole.rb:1:in `<top (required)>'
from C:/ruby193mingw/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
from C:/ruby193mingw/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
from C:/home/prg/NetBeansProjects/RubyAnimePvEasyMaker/lib/select.rb:9:in `<top (required)>'
from C:/home/prg/NetBeansProjects/RubyAnimePvEasyMaker/lib/main.rb:17:in `require_relative'
from C:/home/prg/NetBeansProjects/RubyAnimePvEasyMaker/lib/main.rb:17:in `<main>'
「Threadを後からムニャムニャはできないよ」と言われてる、のかな? 英語、分からんのですが。以下は想像。
- DXRuby 1.5.1 はスレッド周りで大改革を行ったらしい。
- win32oleはスレッド関連で制限があるらしい。
win32oleを使って、フォルダ選択ダイアログを開きたいのですが…何か手はないものか。
◎ スクリプトが終了してくれない。 :
不具合その2。状況によっては、スクリプトが終了してくれなくなる。
色々試したのだけど、どうも DXRuby の Sound と、Ayame 0.0.3 を同時利用すると、スクリプトが終了しなくなるようで。
ただ、同時利用していても、スクリプトの最後で、Sound#dispose をしたら終了してくれるようになった。
まあ、せっかく Ayame を使うのだから、全部 Ayame で鳴らしてしまってもいいのでは、という気もしていたり。ただ、再生時の遅延等がどうなるか、何個までSEを同時再生できるのか、気になるところではあるけれど。
色々試したのだけど、どうも DXRuby の Sound と、Ayame 0.0.3 を同時利用すると、スクリプトが終了しなくなるようで。
ただ、同時利用していても、スクリプトの最後で、Sound#dispose をしたら終了してくれるようになった。
まあ、せっかく Ayame を使うのだから、全部 Ayame で鳴らしてしまってもいいのでは、という気もしていたり。ただ、再生時の遅延等がどうなるか、何個までSEを同時再生できるのか、気になるところではあるけれど。
◎ 公式サイトの掲示板が気になる。 :
全然関係ない話だけど。DXRuby 公式サイトの掲示板が、SPAM書き込みで荒らされているのが気になったり。対策は難しいのかしら。
どういう cgi を使っているのか、対策可能な cgi かどうかが気になって、掲示板の最下部にあった「ShuttleBoard」なるcgi名で検索したところ、 _CGI-Search:ShuttleBoard:PHPあいらんど というページに遭遇。元々は「PHPあいらんど」なるサイトで公開されていたスクリプトらしいけど、ドメイン?失効、かつ、関係ない業者のサイトが立ち上がってしまったようで、今は入手不可のスクリプトになっている、ように見える。
スクリプトソースが入手できれば、SPAM対策の修正等もできるのかもしれないけど。公開サイトが消滅してしまったのでは…。SourceForge や github で公開してあればこういう悲劇は避けられたのだろうか。
それはともかく。件の掲示板のSPAM対策としては、以下の理由から、email欄に文字列が入ってたらSPAMとして弾く、という処理だけでも効果がありそうな気もしたり。
もっとも、この日記ページのツッコミ欄などは、それだけでは対策として足りなくて、NGワードも使って弾くことにしちゃったのだけど。それでも、email欄を空にしてもらうだけで、英文だらけのSPAMは除去できた記憶が。外人さんは日本語読めないから個別対応できないだろうし。
でも、英語圏の人にも利用してもらおうと考えた場合は、かえってマズイのかな…。本来であれば、英文メッセージも一緒に表示しておかないといかんのだろうか。
どういう cgi を使っているのか、対策可能な cgi かどうかが気になって、掲示板の最下部にあった「ShuttleBoard」なるcgi名で検索したところ、 _CGI-Search:ShuttleBoard:PHPあいらんど というページに遭遇。元々は「PHPあいらんど」なるサイトで公開されていたスクリプトらしいけど、ドメイン?失効、かつ、関係ない業者のサイトが立ち上がってしまったようで、今は入手不可のスクリプトになっている、ように見える。
スクリプトソースが入手できれば、SPAM対策の修正等もできるのかもしれないけど。公開サイトが消滅してしまったのでは…。SourceForge や github で公開してあればこういう悲劇は避けられたのだろうか。
それはともかく。件の掲示板のSPAM対策としては、以下の理由から、email欄に文字列が入ってたらSPAMとして弾く、という処理だけでも効果がありそうな気もしたり。
- そもそも今時、ネット上にメルアドを晒してたら、SPAM業者のクローラーがメルアド収集するものだからSPAMがバンバン届いてしまうわけで。なので、出来る限り public なページ上ではメルアドの入力・表示を避けたほうがいい。
- 業者のSPAM書き込みは、ほとんどの場合、掲示板の入力フォームで入力できる全項目を埋めようとしてくるので、そこに書いてある文章(「○○を空欄にしてね」等)も見ないで埋めてくる書き込みはSPAMだろうと判断できそう。
もっとも、この日記ページのツッコミ欄などは、それだけでは対策として足りなくて、NGワードも使って弾くことにしちゃったのだけど。それでも、email欄を空にしてもらうだけで、英文だらけのSPAMは除去できた記憶が。外人さんは日本語読めないから個別対応できないだろうし。
でも、英語圏の人にも利用してもらおうと考えた場合は、かえってマズイのかな…。本来であれば、英文メッセージも一緒に表示しておかないといかんのだろうか。
[ ツッコむ ]
#2 [ruby] Rubyでフォルダ選択ダイアログを開く方法について
win32oleが封じられた状態で、どうやってフォルダ選択ダイアログを開こうかと悩んでたけど。フォルダ選択ダイアログを開いて結果を返すだけのWSHを書いて、それを Ruby から呼び出したらどうかと思いついた。
こんな感じでどうだろう…?
select_open_folder.vbs
select_open_folder.rb
なんだか上手く行っているような気もする。本番スクリプトに組み込んでみるかな…。
考えてみれば、*NIX文化圏の流儀 ―― 単機能のプログラムを組み合わせて目的を果たす、という考え方を Windows上で利用するのもアリだよな、という気もしてきたり。*NIXを軽くお手本にした、MS-DOSの延長線上にあるOSなんだから、アリなんじゃないかな…。
こんな感じでどうだろう…?
select_open_folder.vbs
' フォルダ選択ダイアログを開いて、選択されたフォルダパスを返す VBScript
Option Explicit
On Error Resume Next
Dim oParam, oShell, oFolder, s, dirname
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
Set dirname = Nothing
Set s = Nothing
Set oFolder = Nothing
Set oShell = Nothing
Set oParam = Nothing
select_open_folder.rb
#!ruby -Ks
#
# DXRubyを使ったスクリプト中から、
# vbsを呼ぶことでフォルダ選択ダイアログを開いて、
# 結果を受け取ってみる
require 'dxruby'
fnt = Font.new(12)
folder = ""
Window.loop do
break if Input.keyPush?(K_ESCAPE)
if Input.keyPush?(K_Z)
title = "画像フォルダを選択してください"
wsh_fname = "select_open_folder.vbs"
folder = %x[ cscript //nologo #{wsh_fname} #{title} ]
folder.chomp! # 返ってきた文字列には改行も含まれているので除去
folder = "" if folder =~ /^::/ # 特殊フォルダを選択された際の対策
end
Window.drawFont(16, 16, "Z : フォルダ選択ダイアログを開く", fnt)
Window.drawFont(16, 32, "ESC : 終了", fnt)
Window.drawFont(16, 64, "Folder : [#{folder}]", fnt)
end
なんだか上手く行っているような気もする。本番スクリプトに組み込んでみるかな…。
考えてみれば、*NIX文化圏の流儀 ―― 単機能のプログラムを組み合わせて目的を果たす、という考え方を Windows上で利用するのもアリだよな、という気もしてきたり。*NIXを軽くお手本にした、MS-DOSの延長線上にあるOSなんだから、アリなんじゃないかな…。
[ ツッコむ ]
以上、1 日分です。