« 2008年6月 | トップページ | 2008年8月 »

2008年7月27日 (日)

[英語] 何度目かのアレックス・ライダーシリーズ第1段

  • Stormbreaker (Anthony Horowitz)

14歳の少年がMI-6のスパイとして活躍するシリーズの第1段。 アレックスがスパイになったいきさつが語られる。

何度か繰り返し聴いたので、ある程度まではストーリーを追いかけることができるようになった。 追いかけるのがやっとで楽しむというところまではいかない...。

ただいま英語多聴 62時間 32分。

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

2008年7月26日 (土)

[Ruby] WIN32OLE_EVENT


WIN32OLE_EVENT#handler= なんてのを追加してみた。
WIN32OLE_EVENT#on_eventとの併用は混乱の元なのでやめた方がいいかも。
仕様を自分でも詰め切れていないところが多々あるので、WIN32OLE_EVENTヘビーユーザの意見を聞きたいところ。
ついでにsampleも追加した。



ienavi.rb が従来の書き方。



ienavi2.rbがWIN32OLE_EVENT#handler=を使った場合の書き方。



従来の書き方は、ちょっとオブジェクト指向っぽく書きづらいところがあったんだけど、
WIN32OLE_EVENT#handler= を使うと自然とオブジェクト指向(クラス指向?)っぽく書ける。
その分、柔軟性が失われているかも知れない...。



method_missing でどんなイベントでも受け取れるというのは、変かなあ。
default_handler という名前のメソッドがあったら、どんなイベントでも受け取れるとした方が自然?



ちなみに、WIN32OLE_EVENT#handler= を使った方が、BeforeNavigate2 みたいに 2がついているのは



ev = WIN32OLE_EVENT.new(ie)


と第2引数を省略している(結果的に第2引数に'DWebBrowserEvents2'を指定したのと同じになる)からです。
(1.8では省略するとエラーになりますが、trunkではもう一踏ん張りしてエラーにならないようにしました。)


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

[日記] audible.com の Sammy Keyes シリーズ


audible.comでログアウトした状態で
Sammy Keyes で検索すると、
Sammy Keyes and the Hotel Thief 他数冊がヒットする。
私のアカウントでログインして検索すると1件も見つからない。
なんか制限があるんだろうか。



前にもなんかSaleのときに、ある作品を買おうとしたら日本はダメとか言われたことがあったんだけど、それと同じか。



Sammy Keyesシリーズは、わりと好きなので、できれば、多聴の題材に利用したかった...。
Amazonでもカセット買えるみたいだけど高いのでパス。



ところで、A modern-day Nancy Drew という表現が使われるぐらいアメリカでは
Nancy Drew ってやっぱり有名らしい。
(Nancy Drewは日本語訳が最近出版されていたので日本でも有名になるかも知れない。)


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

2008年7月25日 (金)

[本] 前半読みづらいけど、後半はテンポよく読むことができる本格ミステリの佳作

アプルビィ警部が登場する本格ミステリ。

前半は、どうにも小難しくて退屈で読みづらい。 事件が起こってからの後半は、いろんな推理が披露される怒濤の展開で一気に読むことができる。

過去に同様のトリックの作品を読んだことがある分、真相に対する衝撃度が低かった。 発表年からすれば、必ずしも使い古されたトリック、真相と言ってしまうのは不公平なんだけど仕方がない。 あと、いろんな推理が披露される割には、どこかしら渋めで、けれん味に欠けている。

そんなこんなで、傑作とは言いづらいんだけど、 ひょっとしたら年間ベスト10の下位ぐらいには入ってくるぐらいの佳作だと思う。

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

2008年7月21日 (月)

[本] 連作短編落語ミステリ

落語家が登場するミステリは、北村薫、大倉崇裕、田中啓文らが手がけているが、 それらの作品よりもさらにもう一歩も二歩も落語に踏み込んでいる。 ただ落語家が登場するミステリというだけでなく、本格落語ミステリに仕上がっている。 実際の落語を真っ向から謎解きの題材として取り上げているところが面白い。 ちょっとした煙管の動かし方の違いによって巧みに噺が変わってしまう表題作が好み。

続編も読んでみたいところだけど、無理に量産しないで、あくまでも本格落語・ミステリ路線を守ってほしい。

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

2008年7月20日 (日)

[本] 今のこのサイトのタイトルの元ネタの本

古典部シリーズ第4段の連作短編集。

なんか妙に主人公が老成している気がするところに違和感というか居心地の悪さを感じる。 「心あたりのある者は」が最初から最後まで推理が凝縮されている感じがして好み。 日常の謎としては大したことのないミステリかと思いきや、こんな短編が紛れ込んでくるから油断できない。

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

[英語] ペットシッターでもある女性弁護士が主人公のミステリ

主人公がペットシッターでもあり弁護士でもあるという特徴がうまく活かされている。 シリーズ化されているらしい。 今回はオウムが重要な鍵を握る。 敢えて作者が隠そうとしている真犯人は誰だろうと 裏側から予想したら、それが本当に犯人だった。

なんか、英語は難しくて、ちょっと読むのに手こずった。 途中で投げ出そうかと思ったのだが、なんとなく次の台詞をここに引用したくて最後まで読んだ。

"If this was a novel, and a parrot was in the room where
a murder was committed, all you'd have to do is to keep
asking the bird some questions. In mysteries with parrots,
they always reveal the clue that gives the killer away."

日本語訳は『目撃者は鳥カゴのなか

ただいま英語多読 2889627語。

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

[英語] ユーモラスな方法で子供たちをしつけていく小柄な婦人の話

  • Mrs Piggle-Wiggle

子供の躾に悩んだ親たちがPiggle-Wiggle婦人に相談し、ユニークでユーモラスな方法で婦人が解決していく話。 1章ごとに登場する子供と親の悩みが変わるので飽きない。

英語はゆっくりで易しめ。長いけど1章ごとに話が完結するので聴き続けやすい。

ただいま英語多聴 57時間 42分。

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

2008年7月19日 (土)

[Ruby] Win32OLE 対応できるんだったら対応したいもの


その1。[ruby-talk:298615]に対応する。




その2。.NETで作られたOLEサーバー(?)のイベント通知に対応する。



確か、これは、EVENTSINK_GetIDsOfNames などをちゃんと実装しないといけなかったような気がする。


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

[Ruby] Win32OLE 今、実装してみようかと考えているもの


その1。WIN32OLE_EVENT#off_event([arg])



WIN32OLE_EVENT#on_event([arg]) で設定したイベントハンドラを無効にしてイベントが通知されないようにする。



その2。WIN32OLE_EVENT#handler=



handlerオブジェクトを設定する。



class Handler
def navigateComplete(url)
puts url
end
def beforeNavigate(...)
...
end
...
end
ie = WIN32OLE.new('InternetExplorer.Application')
ev = WIN32OLE_EVENT.new(ie)
ev.handler = Handler.new


と書けるようになる。(PythonやPerlに近いスタイルで書けるようにする。)



WIN32OLE_EVENT#on_event で設定したコールバックと WIN32OLE_EVENT#handler で設定したコールバックが重なる場合、
WIN32OLE_EVENT#on_event を優先する。


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

[Ruby] WIN32OLE::VARIANTモジュールとWIN32OLE_VARIANT

bdata = WIN32OLE_VARIANT.new(bstring, 
          WIN32OLE::VARIANT::VT_UI1|WIN32OLE::VARIANT::VT_ARRAY)

bdata = WIN32OLE_VARIANT.new(bstring, 
          WIN32OLE_VARIANT::VT_UI1|WIN32OLE_VARIANT::VT_ARRAY)

と書けると混乱しなくて済むか。

なんか設計間違えたような...

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

[Ruby] Win32OLEの1.8と1.9の違い(その3)


4. WIN32OLE_VARIANTクラスが追加された。



Win32OLEがOLEサーバー側の関数(メソッド)を実行するときに引数はすべて参照渡しで実行するようになってます。
ですが、値渡しを要求する関数(メソッド)も存在します。
そのとき、WIN32OLE_VARIANTクラスを使うことができます。



fso = WIN32OLE.new("Scripting.FileSystemObject")
shell = WIN32OLE.new("Shell.Application")
folder = shell.NameSpace(fso.getFolder(".").path)
item = folder.ParseName("temp.txt")
shortcut = WIN32OLE_VARIANT.new("ショートカットの作成(&S)")
item.invokeVerb(shortcut) # shortcutは値渡し


WIN32OLE_VARIANT.new メソッドは第二引数にVT_XXXを指定して、指定した型のWIN32OLE_VARIANTオブジェクトを生成することができます。
たとえば、Win32OLEは、デフォルトで文字列をVT_BSTR型に変換しますが、バイナリデータをそのままOLEサーバーの関数(メソッド)に
引数として渡したいときに困ります。1.8では、_invokeを使う方法が提供されていました。
1.9では、従来の方法の他、WIN32OLE_VARIANT.newメソッドを使う方法があります。



bdata = WIN32OLE_VARIANT.new(bstring,
WIN32OLE::VARIANT::VT_UI1|WIN32OLE::VARIANT::VT_ARRAY)


として bstringの代わりにbdataを引数として使うことによってバイナリデータをそのまま渡すことができます。



1.9で Encoding が ASCII-8BIT ならバイナリだと見なしてよいのではないかという議論がありました。
今のところ、Win32OLEでは、Encoding が ASCII-8BIT な文字列が渡されてもバイナリという判断はしません。
VT_BSTR型に変換します。
ASCII-8BIT の String をバイナリとして扱いたいときも、明示的に WIN32OLE_VARIANT.new を使ってください。


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

[英語] 穴を掘る少年

  • Holes

BBC7で、7月25日まで聴くことができる。 最後の結末はなんとか聴き取れたけどストーリーは追いかけられず。聴き取りづらい。

ただいま英語多聴 55時間 2分。

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

[英語] ダグラス少年が遭遇する冒険SF

  • The Touchstone

BBC7で、7月24日まで聴くことができる。 続編がありそうな終わり方だな。 最初はなんとかついていけたけど、途中からさっぱりわからなくなってしまった。 イギリス英語は聴き取りづらい。

ただいま英語多聴 54時間 2分。

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

2008年7月16日 (水)

[Ruby] TODO: fix me


とある事情があって、できれば見ることなく済ませたかったRubyのtrunkのeval.cのソースを
眺めて(ちらっと見て)いるんだけど、
rb_raise_jumpの中の



/* TODO: fix me */


って何だろう?
もしかして何かがfixされるとWin32OLE側では何もしなくてもよくなるのかなあ。


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

2008年7月14日 (月)

[Title] タイトル変更


以前は恒例だったタイトル変更をものすごい久し振りにやってみた。
元ネタは例によって今読んでいる本。


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

[英語] Holes in BBC7


BBC7
英語100万語界隈で面白いとの噂を聞いたことのある有名なHolesが放送中。
でも、The Touchstone の方が、いきなりスリリングな展開で面白そうだと思ったり。


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

2008年7月12日 (土)

[Ruby] WIN32OLE_EVENT#on_event_with_outargs (その3)


簡単にできると思ったのに。
EVENTSINK_Invokeの中でCancelからDispIDを取得する方法がわからん。



簡単に実装できそうなのは、



{:return => 1, 5=> true}


のように何番目の引数の値を設定するかという書き方だけ。



...と思ったけど、ITypeInfo::GetNamesを使えば、DispID取得しなくてもいけそうだ。


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

[Ruby] WIN32OLE_EVENT#on_event_with_outargs (その2)

event.on_event('BeforeNavigate') {|*args|
  {:Cancel => true}
} 

と書けるのがすっきりしていい気がしてきた。

event.on_event('BeforeNavigate') {|*args|
  beforeNavigate(*args)
} 

とメソッドを定義した場合には、メソッドの中で

def beforeNavigate(*args)
  ...
  {:Cancel => true}
end

と書くか、

def beforeNavigate(*args)
  ...
  {5 => true} # 5番目の引数に trueを設定して返す。
end

でよい。メソッドの実行結果を戻り値としてOLEサーバー側に返したい場合は、:return を使って

def beforeNavigate(*args)
  {:return => true, 5 => true} 
end

のように書く。

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

2008年7月 9日 (水)

[Ruby] WIN32OLE_EVENT#on_event_with_outargs


自分で作っといて、アレだけど、使いにくいな。
なんとかならんもんかと考えていたんだけど、on_eventのときでもHashを返すというアイディアはどうだろうか。



event.on_event('BeforeNavigate') {|*args|
beforeNavigate(*args)
}


と書いても



def beforeNavigate(*args)
outargs = []
outargs[5] = true
{:result => 1, :args => outargs}
end


とか、更にoutargsはHashでもいいことにして、



def beforeNavigate(*args)
{:result => 1, :args => {:Cancel => true}}
end


とできるとか...


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

2008年7月 8日 (火)

[Ruby] WIN32OLE_EVENTの第2引数の省略


Pythonでは、COCLASSを求めるようなことをしているみたい。
RubyのWin32OLEでもCOCLASSを探すことにした。



結果として次のようなのが動くようになった。



require 'win32ole'
ie = WIN32OLE.new('InternetExplorer.Application')
ie.visible = true
ev = WIN32OLE_EVENT.new(ie) # ここに注目。
ev.on_event(...){|*args|...}


これを書きながら考えていたのだが、やっぱり、まだ、ちょっと不完全な気がしてきた。
不完全な部分の修正はまた後程。


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

2008年7月 7日 (月)

[Ruby] InternetExplorer.Application から DWebBrowserEvents2 を導く方法


以下のスクリプトをruby 1.9.0(trunk revision 17942)で実行する。



equire 'win32ole'
ie = WIN32OLE.new('InternetExplorer.Application')
ie.visible = true
begin
tname = ie.ole_type.name
coclass = ie.ole_typelib.ole_classes.select {|k|
k.ole_type == "Class"
}.select {|k|
k.default_ole_types.select{|dt|
dt.name == tname
}.size > 0
}
coclass.each do |c|
puts "#{c.name}(#{c.progid}) => #{c.default_event_sources.inspect}"
end
ensure
ie.quit
end


実行結果は、



WebBrowser(Shell.Explorer.2) => [#<WIN32OLE_TYPE:DWebBrowserEvents2>]
InternetExplorer(InternetExplorer.Application.1) => [#<WIN32OLE_TYPE:DWebBrowserEvents2>]
ShellBrowserWindow() => [#<WIN32OLE_TYPE:DWebBrowserEvents2>]


となるので、なんとなく2行目から、DWebBrowserEvents2 が使えるんじゃないかと思うことができる。



もう一度、Pythonのソースを調べてみれば、DWebBrowserEvents2を省略できるようになるかも知れない。


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

2008年7月 6日 (日)

[Ruby] WIN32OLE_EVENT


あまり知られていないと思いますが、WIN32OLE_EVENTの第2引数は省略できます。
ですが、省略してうまくいく例を私は知りません。



WIN32OLE_EVENTもPerlを真似してソースを書いてます。
もしかして、ちゃんと真似できていないのかと思い、
InternetExplorerで試してみたところ、Perlでも省略すると動作しませんでした。



Pythonは指定しなくてもいいので、どうやっているかとちょっとソースを覗いてみたところ
がしがしとタイプライブラリの情報を読んで第2引数に相当する情報を読み取っているみたいです。



まだ、ゴールは遠いのですが、手元のソースをいじったところ、
第2引数のヒントぐらいは出せるようなところまでなら行けそうな雰囲気です。



もうちょっと手元でテストしてみたいと思います。


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

[Ruby] Win32OLEの1.8と1.9の違い(その2)


3. WIN32OLE.codepageの動作が変わった。
Ruby m17n絡みで変わった点です。
まず、WIN32OLE.codepageの初期値は、1.8では、WIN32OLE::CP_ACPでしたが、1.9では、Encoding.default_externalに従って初期値が決まります。



また、1.8では、RubyのStringオブジェクトをOLEサーバー側に渡すときに、WIN32OLE.codepageを参照してUnicode(UTF-16LE)に変換して
渡していましたが、1.9では、StringオブジェクトのEncoding(String#encoding)を参照してUnicode(UTF-16LE)に変換するようになりました。



このため、1.9では、WIN32OLE.codepageの値が意味を持つのは、OLEサーバー側からStringオブジェクトを受け取るときです。
Stringオブジェクトを受けとるときに、WIN32OLE.codepageの値に従って変換されます。



たとえば、



# -*- encodinge:Windows-31J -*-
dict = WIN32OLE.new('Scripting.Dictionary')
dict.add("Windows31J", "あいう") # Windows-31Jの文字列 "あいう"をセット
puts dict["Windows31J"].encoding # => Windows-31
puts("あいう" == dict["Windows31J"]) # => true
WIN32OLE.codepage = WIN32OLE::CP_UTF8
puts dict["Windows31J"].encoding # => UTF-8
puts("あいう" == dict["Windows31J"]) # => false!!!
puts("あいう".encode("UTF-8") == dict["Windows31J"]) # => true


となります。



つまり、WIN32OLE.codepageの設定によっては、OLEサーバー側に渡した文字列のエンコーディングとは異なるエンコーディングの文字列をOLEサーバーから受け取ることになります。



WIN32OLE.codepageのこの動作は、将来、変更される可能性があります。
また、OLEサーバー側から受け取るときだけWIN32OLE.codepageが登場することから、WIN32OLE.codepageという名前が変わる可能性もあります。


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

[本] 白熱した推理合戦で盛り上がるミステリ

お互いを犯人呼ばわりする推理合戦で盛り上がるミステリ。 話の冒頭からいきなり人が死んでいて、いきなりクライマックスかと思わせる展開。 探偵らしからぬヤクザな雰囲気を持つ探偵役。 趣向は面白いんだけど、なんか出来はもう一つ。 謎が不可能犯罪風味満載なわりに、解決の方が地味な感じがするためか。

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

2008年7月 5日 (土)

[Ruby] Win32OLEの1.8と1.9の違い(その1)


1.8と1.9とでは、Win32OLEに違いがあります。
これまで、Win32OLEは互換性をできる限り保ちつつ改訂してきたのですが、
1.9では互換性を保っていないところがあります。



そろそろ、違いをちゃんと整理し始めた方がいいんじゃないかと思っています。
まだ、1.9での仕様を決め兼ねている部分もあるのですが...。
ちょっとずつ、気の向いたときに書いていこうかと思ってます。



変更点



1. WIN32OLE#[], WIN32OLE#[]= を使ったプロパティの設定、参照が1.9ではできない。



つまり、1.9では、



ex = WIN32OLE.new('Excel.Application')
ex['Visible'] = true
puts ex['Visible']


とは書けなくて、



ex = WIN32OLE.new('Excel.Application')
ex.Visible = true
puts ex.Visible


としか書けません。



2. 次のような書き方ができるようになった。



dict = WIN32OLE.new('Scripting.Dictionary')
dict.add("foo", "FOO")
puts dict["foo"]
dict["foo"] = "BAR"
puts dict["foo"]


これは、1.の変更の代わりに新たにできるようになったことです。



技術的に細かい話は、ここでは省略しますが、今まで、



xxxx.item("foo")


と書かなくてはいけなかったものが、運が良ければ、



xxxx["foo"]


とVBScriptライクな書き方ができるようになったということです。



従来通り、



xxxx.item("foo")


と書いても大丈夫です。


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

[英語] 折り返し点


7月に入り、年の半分が過ぎてしまった。
多聴は53時間2分。多読は767200語。
多聴は、ながら聴きを含めるともっと長いはず。
目標100万語で100時間というところなので、
このまま順調に進めば達成できそうな感じ。



もう1つ英語の技術書を1冊読破するという目標がかなり危うい。
全然進んでないのである。
本は、The Ruby Programming Language
Programming Ruby 3(ピッケル本。こっちは、PDFのベータ版)も入手しているので、
準備万端整っている。
後は、読むだけなんだけどな。


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

[英語] ある学校の謎を探るために潜入するアレックス・ライダー・シリーズ第2段

  • Point Blanc (Anthony Horowitz)

イギリスMI6の少年スパイとして活躍するアレックス・ライダーのシリーズ2作目。 2度目の挑戦だからか、設定がわかっているせいか、イギリス英語に慣れてきたのか、ミステリが好きなこともあるせいか、 理由はいろいろあると思うけど、ストーリーを楽しめた。

ただいま英語多聴 53時間 2分。

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

[本] 2009年施行の裁判員制度を題材にした連作ミステリ

芦辺拓ファンには、おなじみの森江春策が登場する連作ミステリ。

まさか、最後にあんな仕掛けが待ち受けているとは思いもしなかった。 必ず順番通りに読むこと。でないと後悔することになる。

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

2008年7月 2日 (水)

[Ruby] WIN32OLE_EVENT


いや、もう、ホント、前からちょっと感じてたことなんですよ。
WIN32OLE_EVENTの実装というか設計というか、なんとなくダメだなと思ってた訳です。
特に、1.9は新たな機能を盛り込もうとして、もうなんかムリしちゃって...。



いや、まあ、ここだけの話ですけどね。



で、今、もう、設計そのものが間違ってたんではないかという気がしてしょうがないんです。
じゃあ、どういうのが正しいのかって聞かれると、全くもって答えられない訳です。



いや、まあ、ホント、ここだけの話にしといてください。


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

« 2008年6月 | トップページ | 2008年8月 »