« 2009年12月 | トップページ | 2010年4月 »

2010年1月23日 (土)

[日記] OPC

Matrikon OPC Simulation Server。
結局、Matrikon OPC Server(有償) がないと駄目っぽい。
これ以上は、わかんないから自分で試すのはやめる。

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

[日記] OPC

Matrikon OPC Simulation Server。
.NET Framework 1.1 Service Pack 1 が必要だと...。
もう面倒くさくなってきた...。

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

[日記] OPC

元々は、OLE for Process Control の略らしい。


ユーザー登録しないとダウンロードできないのか、Matrikon OPC Simulation Server。

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

[Ruby] Win32OLE と Thread

とりあえず、bug #2618 のスクリプトが
自分の環境では動くようになったので、コミットした。


結局、Cで書く方法を考えるのが面倒だったので、Thread#initialize の再定義は、win32ole.rb ですることにした。


MTAに切り替えることも考えてみるか。

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

[Ruby] Thread#initialize の再定義(その4)

class Thread
  alias :org_initialize :initialize
  def initialize(*arg, &block)
    org_initialize(*arg) {
       puts "OleInitialize"
       begin
         block.call(*arg)
       ensure
         puts "OleUnitialize"
       end
    }
  end
end

で大体良さそうな感じだけど、これを C レベルで実装するのってどうすればいい?

とりあえず、C レベルで WIN32OLE.ole_initialize と WIN32OLE.ole_uninitialize を用意しておいて

Ruby レベルで

class Thread
  alias :org_initialize :initialize
  def initialize(*arg, &block)
    org_initialize(*arg) {
       WIN32OLE.ole_initialize
       begin
         block.call(*arg)
       ensure
         WIN32OLE.ole_uninitialize
       end
    }
  end
end

として試してみてから、Cの実装は(やるかどうかも含めて)考えよう。

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

[Ruby] Thread#initialize の再定義(その3)

class Thread
  alias :org_initialize :initialize
  def initialize(*arg, &block)
    org_initialize(*arg) {
       puts "OleInitialize"
       begin
         block.call(*arg)
       ensure
         puts "OleUnitialize"
       end
    }
  end
end

でよい?

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

[Ruby] Thread#initialize の再定義(その3)

完全に勘違いしていた。


class Thread
alias :org_initialize :initialize
def initialize(*arg, &block)
puts "OleInitialize call"
org_initialize(*arg, &block)
end
end

では全然駄目。


やりたいことは、


Thread.new {
puts "thread proc"
}

としたとき


Thread.new {
puts "OleInitialize"
puts "thread proc"
puts "OleUninitialize"
}

となるように Thread#initialize を再定義すること。


もう一歩進めると


Thread.new {
puts "OleInitialize"
begin
puts "thread proc"
ensure
puts "OleUninitialize"
end
}

となるように Thread#initialize を再定義すること。

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

[日記] チョコレートとたいやき

世の中、バレンタイン商戦まっさかり。
近所のたいやき屋がアップルカスタードに代わってチョコくるみを売り出した。
去年もチョコのたいやきを売ってたと思うんだけど、去年食べたときにおいしいと思わなかったので今回はパス。
今まで食べた期間限定のメニューの中では、アップルカスタードが一番おいしかった。

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

[日記] チョコレートと炭酸

世の中、バレンタイン商戦まっさかり。
サントリーのチョコレート スパークリング
という飲み物を見かけた。
チョコレートの飲み物というと黒とか茶色を連想してしまうけど、
これは無色透明でしかも炭酸飲料である。
どんな味がするのか想像もつかない。
炭酸飲料は苦手なのだが、物珍しさには勝てず、つい、ふらふらと買ってしまった。
見た目はソーダ水と変わらないのだが、飲んでみると確かにチョコレート味の炭酸飲料である。
そんなに合わないという感じもせず、最後まで、普通に飲めてしまった。


ラベルを読んでみたら、


チョコレートは使用しておりません

と書いてある。おそるべし、サントリー。

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

[Ruby] Thread#initialize の再定義(その2)

Cで block つきで org_initialize を呼び出すには rb_block_call を使えばよいのかな?


後で試そう。

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

[Ruby] Thread#initialize の再定義(その1)

Win32OLEとThreadの話
でThread#initialize を再定義するという話が浮上してきた。


いきなり、Cで実装しようとして再定義のやり方がわからなくてハマる。
(rb_call_super を使おうとして、それは間違いであることに途中で気づいた。)


という訳で、基本に戻って(?)、Rubyレベルでの再定義からやってみる。


class Thread
alias :org_initialize :initialize
def initialize(*arg)
puts "OleInitialize call"
org_initialize(*arg)
end
end
t = Thread.new{puts "in thread"}
t.join

実行してみたら


OleInitialize call
a.rb:5:in `org_initialize': must be called with a block (ThreadError)
from a.rb:5:in `initialize'
from a.rb:8:in `new'
from a.rb:8

となってしまった。


class Thread
alias :org_initialize :initialize
def initialize(*arg, &block)
puts "OleInitialize call"
org_initialize(*arg, &block)
end
end
t = Thread.new{puts "in thread"}
t.join

これで、


OleInitialize call
in thread

となった。


えーと。
Cで実装するときは、alias は、rb_define_alias を使えばいいとして、
block つきで org_initialize を呼び出すにはどうするんだっけ?


続く...。

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

[Ruby] COM と STA と MTA

自分用のメモ。



COMの素人の私には、わかりやすくて面白い解説。...私もCOMは嫌いです。

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

2010年1月21日 (木)

[Ruby] Win32OLE と Thread

Bug #2618 の件。


結局、Thread 毎に、OleInitialize() を呼び出さなくてはならないのだと思うのだが、うまい解決方法が思いつかない。


とりあえず、WIN32OLE.ole_initialize と WIN32OLE.ole_uninitialize とか用意して


t = Thread.new do
begin
WIN32OLE.ole_initialize
ie = WIN32OLE.new( "InternetExplorer.Application" )
ie.visible = true
ie.navigate( "http://google.com" )
WIN32OLE.ole_uninitialize
puts "OK"
rescue Exception => e
puts e.class
puts e
puts e.backtrace
end
end

みたいにするか、もう少しRubyっぽく


WIN32OLE.ole_initialize{
ie = WIN32OLE.new( "InternetExplorer.Application" )
ie.visible = true
ie.navigate( "http://google.com" )
}

みたいな書き方ができるようにして、
WIN32OLE.ole_uninitialize は、Win32OLE側で実行するようにしてあげるぐらいしか思いつかない...。

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

2010年1月18日 (月)

[日記] iPod shuffle と Windows XP on Virtualbox on Ubuntu 9.04

Vine 4.2 の頃は、audible.comのファイルを shuffle に転送できなくて
shuffle を有効活用してなかった。


そういえば、Virtualbox (Ubuntu 9.04) で試してなかったことを思い出し、
試しにやってみたら、ちゃんとshuffleにファイルを転送できた。


ということで、iPod nano を充電中には、iPod shuffle で代用することができるようになった。
これで、iPod shuffle も有効活用できそう。

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

2010年1月17日 (日)

[Ruby] Win32OLE のメモリーリーク その7

1.8でも試してみた。
が、メモリーリークというほどの現象は確認できず。


1.8 では、mswin32版をコンパイルするのに、bison じゃなくて byacc が必要だったのを忘れていたよ。

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

[Ruby] Win32OLE のメモリーリーク その6

60MBぐらいのHTMLを読み込ませて、しばらく実行させてみた。


require 'win32ole'
def bnavigate2(url, flags,target, post, headers, cancel)
urls = {}
urls[url.locationURL] = url.document.body.innerText
end
ie = WIN32OLE.new('InternetExplorer.Application')
ie.visible = TRUE
ie.gohome
ev = WIN32OLE_EVENT.new(ie, 'DWebBrowserEvents2')
ev.on_event("BeforeNavigate2") {|url, flags, target, post, headers, cancel|
bnavigate2(url, flags, target, post, headers, cancel)
}
while 1
ie.navigate2("file:///c:/.../60mb.html") # 60MBぐらいのHTMLファイル
while ie.readystate !=4 || ie.busy
WIN32OLE_EVENT.message_loop
sleep 0.1
end
ie.navigate2("http://www.ruby-lang.org")
while ie.readystate !=4 || ie.busy
WIN32OLE_EVENT.message_loop
sleep 0.1
end
ie.navigate2("http://www.google.com")
while ie.readystate !=4 || ie.busy
WIN32OLE_EVENT.message_loop
sleep 0.1
end
end

が、やっぱり、メモリーリークというほどの明らかなメモリーの増加は見られない。
もう少し bnavigate2 の中身を工夫しないと駄目か。
あと、trunk以外は試してないので、1.8 でも試してみるか。

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

2010年1月16日 (土)

[Ruby] Win32OLE のメモリーリーク その5

WIN32OLE_EVENTを使ってこんなのを試してみた。


require 'win32ole'
$urls = {}
def bnavigate2(url, flags,target, post, headers, cancel)
$urls[url.locationURL] = url.locationName
end
 
ie = WIN32OLE.new('InternetExplorer.Application')
ie.visible = TRUE
ie.gohome
 
ev = WIN32OLE_EVENT.new(ie, 'DWebBrowserEvents2')
ev.on_event("BeforeNavigate2") {|url, flags, target, post, headers, cancel|
bnavigate2(url, flags, target, post, headers, cancel)
}
 
while 1
ie.navigate2("http://www.ruby-lang.org")
while ie.readystate !=4 || ie.busy
WIN32OLE_EVENT.message_loop
sleep 0.1
end
ie.navigate2("http://www.google.com")
while ie.readystate !=4 || ie.busy
WIN32OLE_EVENT.message_loop
sleep 0.1
end
end

が、やっぱり、メモリーリークというほどの明らかなメモリーの増加は見られない。


30MBぐらいのデータを組合せたスクリプトにしないと駄目かな。

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

[日記] 行列のできるラーメン屋さん

外出したら、あまりに寒かったので、ラーメンでも食べて、あったまろうと思い、
ふらふらと歩いていたら新しいラーメン屋さんを発見。
新装開店らしく店頭は派手でかなり目立っている。
店の外に4、5人並んでいて、店内にも立って待っている人がいるのが外からも見えた。
並ぶのが苦手な私は、また別の機会に訪問することに決めて、とっとと違うラーメン屋さんへ。


風風ラーメンってそんなに旨いの?

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

[Ruby] Win32OLE のメモリーリーク その4

念のため、WIN32OLE#ole_free も使うことにて


require 'win32ole'
 
def listname(files)
files.each do |f|
name = f.name
f.ole_free
end
files.ole_free
end
 
fso = WIN32OLE.new('Scripting.FileSystemObject')
i = 0
while 1
i = i + 1
n = i % 3
files = fso.getspecialfolder(n).files
listname(files)
end

としてもメモリーリークは発生しなかった。
やっぱり、on_eventを攻めるか。

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

[Ruby] Win32OLE のメモリーリーク その3

とりあえず、単純に IEnumVARIANT を扱うスクリプトということでこんなのを試してみた。


require 'win32ole'
 
def listname(files)
files.each do |f|
name = f.name
end
end
 
fso = WIN32OLE.new('Scripting.FileSystemObject')
i = 0
while 1
i = i + 1
n = i % 3
files = fso.getspecialfolder(n).files
listname(files)
end

メモリーリークは発生しない。

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

[Ruby] Win32OLE のメモリーリーク その2

間違い。


VT_ARRAY は、Win32OLE で Array に変換するので、[ruby-talk:355014]には該当しない。


correction.ole_free とole_free が呼べるので、correction は Array じゃなくて
IEnumVARIANT インターフェースを持つ WIN32OLE(OLE) オブジェクトが正解。


なので、3. と 4. は


3. on_event のブロック引数が WIN32OLE オブジェクトでかつIEnumVARIANTインターフェースを 
  もつ場合のメモリーリーク
4. 単純に IEnumVARIANT インターフェースをWin32OLEで扱うときのメモリーリーク

が正しい。

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

[Ruby] Win32OLE のメモリーリーク

ruby-talk:355014 の話。


これから、ちょっと調べてみようと思うのだが、厄介なのが、完全に同じ現象を再現できる
スクリプトを提供してもらえないということ。


Unfortunately this application is not available to the general public so I
can't provide a script for someone to independently verify this. :(

とのことなので、こちらでメモリーリークが発生するスクリプトを作り出さないといけない。


特定しづらいのだが、考えられるのは、



  1. on_event でメモリーリーク

  2. on_event のブロック引数が WIN32OLE オブジェクトである場合にメモリーリーク

  3. on_event のブロック引数が WIN32OLE オブジェクトでかつVT_ARRAYである場合にメモリーリーク

  4. 単純に VT_ARRAY を扱うときのメモリーリーク

  5. 参照カウンタのデクリメント忘れ(IDispatch::Release の呼び忘れ)

  6. それ以外のWin32OLE側のどこかでメモリーリーク


あたりかな。


再現するスクリプトが簡単にできるといいんだけどな。

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

[Ruby] Ruby Setup 5 (setup.rb)

5.0.0 が公開されました(ruby-talk:355016)。


青木さんの、setup.rb の改訂版。


5.0.0 ではsetup.rb のコード自体を大幅にリライトしているようです。
また、「setup」フェーズ が 「make」フェーズに変更されているなど、
青木さんの setup.rb とは互換性が無くなっている部分もある模様です(未確認)。


これまでできる限りruby-talkのANNメールをピックアップしてきましたが、
他のことに時間を割きたいと思うようになったので、
気が向いたとき(気になったとき)だけ、このブログで取り上げることにします。

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

2010年1月11日 (月)

[Ruby] Ruby 1.8.7-p249 1.9.1-p378

Ruby 1.8.7-p249、1.9.1-p378がリリースされました(ruby-list:46756ruby-list:46758)。


Webrickの脆弱性の修正がされています。


バージョンアップしましょう。

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

[本] 本格落語・ミステリ

うまや怪談 (愛川晶)


落語の世界を題材にしたミステリ短編集、神田紅梅亭シリーズの第3段。
事件らしい事件は1つも起こらず、落語の世界の日常の謎ミステリになっている。


シリーズ前作が面白かったので、期待して読んだのだが、期待しすぎたせいか、
ミステリ色が薄れているような気がしてちょっと残念。
事件らしい事件が起こらないからとかそういうことではなく、
謎の設定は面白いんだけど、謎解きがちょっと苦しいような印象を持ってしまった。


落語の世界に限定されるため、素人目にも量産ができないタイプの作品で
通常のミステリよりも縛りがキツいことは容易に想像がつくが、
そのハードルを楽々と越えてきた前作に比べて本作はちょっと見劣りする。


馬春師匠の復帰がどうなるのか気になるし、次回作に期待しよう。


落語好きの人にオススメ。

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

2010年1月 6日 (水)

[Ruby] exlap.rb

exlap.rb が公開されました(ruby-list:46725)。


Ruby から Excelを操作するための専用ライブラリ。
Win32OLEをベースとして使っているようです。

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

2010年1月 5日 (火)

[Ruby] SgfParser

0.8.0 が公開されました(ruby-talk:354450)。


囲碁、チェス、バックギャモンなどの二人対戦型ボードゲームの情報を保存したSGF(Simple Game Format)ファイルのパーザ。
ファイルをパーズしてLinked Listを生成するそうです。

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

[Ruby] RedParse

0.8.4 が公開されました(ruby-talk:354371)。


pure Ruby で書かれた Ruby のパーザ。


Ruby1.9でも動作するようになった他、いくつかの改訂がされています。

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

[Ruby] RubyLexer

0.7.7 が公開されました(ruby-talk:354370)。


Ruby で書かれた Ruby のための lexer ライブラリ。


Ruby1.9への対応を進めたり、7bit ascii 以外のエンコーディングへの対応
(UTF-8、EUCには対応したそうですが、SJISは未対応)
の他、いくつかの改訂がされています。

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

[Ruby] Reg

0.4.8 が公開されました(ruby-talk:354369)。


文字列だけでなく、Array や Object、Hash などにも Regexp(正規表現)のようなマッチングや変換ができるようにするライブラリ。


Ruby 1.9 に対応した他、いくつかの改善がされています。


+[/^g/-6]


+[/^g.{0,6}$/]

と書けたりするんだろうか?

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

[Ruby] Sequence

0.2.3 が公開されました(ruby-talk:354368)。


文字列、配列、ファイル、IOなどの Sequential なデータにアクセスするための共通APIを提供するライブラリ。


1.9互換のためにArray#to_s の代わりに Array#join を使うように修正した他、いくつかの改善がされています。

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

[Ruby] Ron

0.1.2 が公開されました(ruby-talk:354367)。


Ruby 版 JSON (のようなライブラリ)。


Ruby 1.9 に対応した他、いくつかの改訂。

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

2010年1月 4日 (月)

[Soft] VirtualBox on Ubuntu 9.0.4

3.0から3.1.2 にアップグレード。


3.0 をインストールした状態でアップグレードしようとするとファイルの conflicts のエラーが出るので、


apt-get remove virtualbox-3.0

してからインストールした。


3.0 で作っていたイメージファイル(Windows XP)は、何の問題もなく、そのまま起動できた。

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

[Ruby] 2009 から 2010

ruby -v の結果が


ruby 1.9.2dev (2009-12-29 trunk 26197) [i686-linux]

となるのが微妙に気になってしまったので、


make up && make && sudo make install

して、


ruby 1.9.2dev (2010-01-04 trunk 26238) [i686-linux]

となるようにした。

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

[英語] 去年は10冊、今年は...

数えてみたら去年読んだ英語の本は10冊だった。
コンスタントに読んでいない気がするので、今年は、もうちょっとコンスタントに読んでいきたい。


リスニングはどうしたものか。
去年はぼろぼろだったので、
今年こそ、8月27日から8月29日に照準を合わせて、リベンジしたいところ。
実は、リベンジするために最低限やらなければいけないことはわかりきっている。
単純にリスニングの時間を増やせばいいだけの話である。


日本語でミステリを読むという習慣はあるので、読む方は、ミステリを英語で読めばいいだけの話で、そんなに強い抵抗はない。
なので、さほどリーディングの時間を増やすということを意識せずに英語を読んでいる。
それに比べると、元々、日本語でも何かを聴くということをあまりしないので、リスニングの時間を増やすためには、
動機づけをいかに上手くやるかということがポイントになる。


さて、どうしたもんだか...。

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

[Ruby] Miyako

2.1.7 が公開されました(ruby-list:46724)。


ゲーム作成用ライブラリ。


SimpleStory クラスが追加された他、いくつかの改善がされています。

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

[Ruby] Prawn

0.7.1 が公開されました(ruby-talk:354348)。


pure Ruby の PDF生成ライブラリ。


0.6.x以前のバージョンは今後サポートされないとのことなので、0.7.1にバージョンアップしましょう。

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

[Ruby] rdp-arguments

rdp-arguments が公開されました(ruby-talk:354314)。


Ruby に名前つき引数の機能を追加するライブラリ。


1.8.x でも 1.9.x でも動作するそうです。

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

[Ruby] gem_file_conflict_checker

0.2.1 が公開されました(ruby-talk:354313)。


その名の通り、rubygems のファイル名が衝突したときにワーニングを出してくれるプラグイン。


これが最初の公開リリースです。

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

[Ruby] Mail

1.5.0 が公開されました(ruby-talk:354312)。


その名の通りメールを扱うための TMail の代替ライブラリ。


ActionMailer が、TMail ベースから Mail ベースに変わったそうです。


1.4.x とは一部、互換性が無くなっているので注意が必要です。

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

[Ruby] posix_mq

0.2.0 が公開されました(ruby-talk:354289)。


System V message queues と同様の機能を提供するRuby用message queues。

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

[Ruby] mongrel_service

0.4.beta2 が公開されました(ruby-talk:354264)。


rails 用の Windows サービスの機能を提供するプラグイン。mongrel_rails_service の代替ソフト。


win32-service に依存しなくなるなど、いくつかの改訂がされています。

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

[Ruby] rest-client

1.1.0 が公開されました(ruby-talk:354184)。


Ruby 用のシンプルなREST クライアントライブラリ。


204が返されたときに、nil の代わりに Response オブジェクトを返すようにしたなどいくつかの改訂がされています。

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

[Ruby] Rainbows!

0.90.1 が公開されました(ruby-talk:354035)。


低速な環境で動作するRackアプリケーション用のHTTPサーバ。


ThreadSpawn、ThreadPool、EventMachine のバグフィックスがされています。

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

2010年1月 3日 (日)

[英語] 追いつ追われつノンストップのサスペンスノベル

The Bodies Left Behind(Jeffery Deaver)


女性警官が主人公のノンシリーズのサスペンス。


ある別荘に押し入った男二人組と、女性警官ともう一人の女性の二人組の追いかけっこの話。
男二人は女二人を殺そうと森の中を追いかけ、女二人は逃げ回るという話。
この手の話は、単調になりがちなので、いかに単調にならずにストーリーに起伏を持たせるかが鍵である。
そこは、さすがにDeaverのこと、手を変え、品を変え、小さなサプライズを随所に仕込みつつ、
ストーリーを転がしているので、読んでいて飽きることはない。
また、追いかける男二人と逃げる女性二人のお互いに相手の先手を取ろうとするための騙し合いの駆け引きが面白い。


残念な点は、最大のどんでん返しが予想できてしまうこと。
Deaverと言えば、どんでん返しがつきもの。
このため、手品の種をあれこれ予想しながら手品を見るかのごとく、
どんでん返しが何か予想しながら読んでしまう自分が悪いのかも知れない。
そこに拘らず、素直に楽しめばよいのかも知れないのだけど、Deaver なので、つい予想してしまうんだよなあ。


最大の大技のどんでん返しに気を取られてしまったせいか、他の小技は、全て、ふいをつかれてしまった。
特に事件の黒幕と動機は、全く予想外だった。


Deaver なので、期待してしまう分、点数は、どうしても辛くなってしまうのだけど、それでも十分楽しめるサスペンス。


ノンシリーズの作品なので、誰が主人公なのか役回りがわからなかったためか、
リンカーン・ライムシリーズより英語はちょっと難しく感じてしまった。


She wasn't a dupty now. Not a wife or a mother. She was the
wolf, a primitive creature, survival its only thought.

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

« 2009年12月 | トップページ | 2010年4月 »