[日記] OPC
Matrikon OPC Simulation Server。
結局、Matrikon OPC Server(有償) がないと駄目っぽい。
これ以上は、わかんないから自分で試すのはやめる。
| 固定リンク
| コメント (0)
| トラックバック (0)
Matrikon OPC Simulation Server。
結局、Matrikon OPC Server(有償) がないと駄目っぽい。
これ以上は、わかんないから自分で試すのはやめる。
| 固定リンク
| コメント (0)
| トラックバック (0)
Matrikon OPC Simulation Server。
.NET Framework 1.1 Service Pack 1 が必要だと...。
もう面倒くさくなってきた...。
| 固定リンク
| コメント (0)
| トラックバック (0)
元々は、OLE for Process Control の略らしい。
ユーザー登録しないとダウンロードできないのか、Matrikon OPC Simulation Server。
| 固定リンク
| コメント (0)
| トラックバック (0)
とりあえず、bug #2618 のスクリプトが
自分の環境では動くようになったので、コミットした。
結局、Cで書く方法を考えるのが面倒だったので、Thread#initialize の再定義は、win32ole.rb ですることにした。
MTAに切り替えることも考えてみるか。
| 固定リンク
| コメント (0)
| トラックバック (0)
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)
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)
完全に勘違いしていた。
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)
Cで block つきで org_initialize を呼び出すには rb_block_call を使えばよいのかな?
後で試そう。
| 固定リンク
| コメント (0)
| トラックバック (0)
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)
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)
Vine 4.2 の頃は、audible.comのファイルを shuffle に転送できなくて
shuffle を有効活用してなかった。
そういえば、Virtualbox (Ubuntu 9.04) で試してなかったことを思い出し、
試しにやってみたら、ちゃんとshuffleにファイルを転送できた。
ということで、iPod nano を充電中には、iPod shuffle で代用することができるようになった。
これで、iPod shuffle も有効活用できそう。
| 固定リンク
| コメント (0)
| トラックバック (0)
1.8でも試してみた。
が、メモリーリークというほどの現象は確認できず。
1.8 では、mswin32版をコンパイルするのに、bison じゃなくて byacc が必要だったのを忘れていたよ。
| 固定リンク
| コメント (0)
| トラックバック (0)
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)
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)
念のため、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)
とりあえず、単純に 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)
間違い。
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-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. :(
とのことなので、こちらでメモリーリークが発生するスクリプトを作り出さないといけない。
特定しづらいのだが、考えられるのは、
あたりかな。
再現するスクリプトが簡単にできるといいんだけどな。
| 固定リンク
| コメント (0)
| トラックバック (0)
5.0.0 が公開されました(ruby-talk:355016)。
青木さんの、setup.rb の改訂版。
5.0.0 ではsetup.rb のコード自体を大幅にリライトしているようです。
また、「setup」フェーズ が 「make」フェーズに変更されているなど、
青木さんの setup.rb とは互換性が無くなっている部分もある模様です(未確認)。
これまでできる限りruby-talkのANNメールをピックアップしてきましたが、
他のことに時間を割きたいと思うようになったので、
気が向いたとき(気になったとき)だけ、このブログで取り上げることにします。
| 固定リンク
| コメント (0)
| トラックバック (0)
Ruby 1.8.7-p249、1.9.1-p378がリリースされました(ruby-list:46756、ruby-list:46758)。
Webrickの脆弱性の修正がされています。
バージョンアップしましょう。
| 固定リンク
| コメント (0)
| トラックバック (0)
うまや怪談 (愛川晶)
落語の世界を題材にしたミステリ短編集、神田紅梅亭シリーズの第3段。
事件らしい事件は1つも起こらず、落語の世界の日常の謎ミステリになっている。
シリーズ前作が面白かったので、期待して読んだのだが、期待しすぎたせいか、
ミステリ色が薄れているような気がしてちょっと残念。
事件らしい事件が起こらないからとかそういうことではなく、
謎の設定は面白いんだけど、謎解きがちょっと苦しいような印象を持ってしまった。
落語の世界に限定されるため、素人目にも量産ができないタイプの作品で
通常のミステリよりも縛りがキツいことは容易に想像がつくが、
そのハードルを楽々と越えてきた前作に比べて本作はちょっと見劣りする。
馬春師匠の復帰がどうなるのか気になるし、次回作に期待しよう。
落語好きの人にオススメ。
| 固定リンク
| コメント (0)
| トラックバック (0)
0.8.0 が公開されました(ruby-talk:354450)。
囲碁、チェス、バックギャモンなどの二人対戦型ボードゲームの情報を保存したSGF(Simple Game Format)ファイルのパーザ。
ファイルをパーズしてLinked Listを生成するそうです。
| 固定リンク
| コメント (0)
| トラックバック (0)
0.7.7 が公開されました(ruby-talk:354370)。
Ruby で書かれた Ruby のための lexer ライブラリ。
Ruby1.9への対応を進めたり、7bit ascii 以外のエンコーディングへの対応
(UTF-8、EUCには対応したそうですが、SJISは未対応)
の他、いくつかの改訂がされています。
| 固定リンク
| コメント (0)
| トラックバック (0)
0.4.8 が公開されました(ruby-talk:354369)。
文字列だけでなく、Array や Object、Hash などにも Regexp(正規表現)のようなマッチングや変換ができるようにするライブラリ。
Ruby 1.9 に対応した他、いくつかの改善がされています。
+[/^g/-6]
は
+[/^g.{0,6}$/]
と書けたりするんだろうか?
| 固定リンク
| コメント (0)
| トラックバック (0)
0.2.3 が公開されました(ruby-talk:354368)。
文字列、配列、ファイル、IOなどの Sequential なデータにアクセスするための共通APIを提供するライブラリ。
1.9互換のためにArray#to_s の代わりに Array#join を使うように修正した他、いくつかの改善がされています。
| 固定リンク
| コメント (0)
| トラックバック (0)
3.0から3.1.2 にアップグレード。
3.0 をインストールした状態でアップグレードしようとするとファイルの conflicts のエラーが出るので、
apt-get remove virtualbox-3.0
してからインストールした。
3.0 で作っていたイメージファイル(Windows XP)は、何の問題もなく、そのまま起動できた。
| 固定リンク
| コメント (0)
| トラックバック (0)
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冊だった。
コンスタントに読んでいない気がするので、今年は、もうちょっとコンスタントに読んでいきたい。
リスニングはどうしたものか。
去年はぼろぼろだったので、
今年こそ、8月27日から8月29日に照準を合わせて、リベンジしたいところ。
実は、リベンジするために最低限やらなければいけないことはわかりきっている。
単純にリスニングの時間を増やせばいいだけの話である。
日本語でミステリを読むという習慣はあるので、読む方は、ミステリを英語で読めばいいだけの話で、そんなに強い抵抗はない。
なので、さほどリーディングの時間を増やすということを意識せずに英語を読んでいる。
それに比べると、元々、日本語でも何かを聴くということをあまりしないので、リスニングの時間を増やすためには、
動機づけをいかに上手くやるかということがポイントになる。
さて、どうしたもんだか...。
| 固定リンク
| コメント (0)
| トラックバック (0)
0.7.1 が公開されました(ruby-talk:354348)。
pure Ruby の PDF生成ライブラリ。
0.6.x以前のバージョンは今後サポートされないとのことなので、0.7.1にバージョンアップしましょう。
| 固定リンク
| コメント (0)
| トラックバック (0)
1.5.0 が公開されました(ruby-talk:354312)。
その名の通りメールを扱うための TMail の代替ライブラリ。
ActionMailer が、TMail ベースから Mail ベースに変わったそうです。
1.4.x とは一部、互換性が無くなっているので注意が必要です。
| 固定リンク
| コメント (0)
| トラックバック (0)
0.4.beta2 が公開されました(ruby-talk:354264)。
rails 用の Windows サービスの機能を提供するプラグイン。mongrel_rails_service の代替ソフト。
win32-service に依存しなくなるなど、いくつかの改訂がされています。
| 固定リンク
| コメント (0)
| トラックバック (0)
1.1.0 が公開されました(ruby-talk:354184)。
Ruby 用のシンプルなREST クライアントライブラリ。
204が返されたときに、nil の代わりに Response オブジェクトを返すようにしたなどいくつかの改訂がされています。
| 固定リンク
| コメント (0)
| トラックバック (0)
0.90.1 が公開されました(ruby-talk:354035)。
低速な環境で動作するRackアプリケーション用のHTTPサーバ。
ThreadSpawn、ThreadPool、EventMachine のバグフィックスがされています。
| 固定リンク
| コメント (0)
| トラックバック (0)
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)
最近のコメント