2010年3月21日日曜日
2010年3月18日木曜日
Ruby:XML:REXML vs. Nokogiri
REXMLとNokogiriの比較のため、先に書いたxmlファイルを使って次のようなプログラムを走らせました。REXMLもXpathを利用しています(どうやって同じような処理をさせたら良いのか分からなかったので(^^;)
require 'nokogiri'
require "rexml/document" # to parse the xml files
max = 30000
#REXML処理
include REXML
puts 'REXML'
f=File.open('abc.xml')
dayRs = Time.now
doc2 = REXML::Document.new(f)
count = 0
for i in 1..max
XPath.each( doc2, "/a/c/d/attribute::type").each do |d|
if d.to_s == 'AB' then
count = count + 1
# puts 'RE: '+d.to_s
end
end
end
dayRe = Time.now
f.close
puts dayRs
puts dayRe
puts dR=dayRe-dayRs
puts count
#Nokogiri処理
puts 'Nokogiri'
f=File.open('abc.xml')
dayNs = Time.now
doc=Nokogiri::XML(f)
count = 0
for i in 1..max
doc.xpath("/a/c/d/attribute::type").each do |d|
if d.to_s == 'AB' then
count = count + 1
# puts 'noko: '+d.to_s
end
end
end
dayNe = Time.now
puts dayNs
puts dayNe
puts dN=dayNe-dayNs
puts count
puts dR/dN #比を取る
結果は、
REXML
Thu Mar 18 21:17:15 +0900 2010
Thu Mar 18 21:19:56 +0900 2010
161.166115 # (秒)
90000
Nokogiri
Thu Mar 18 21:19:56 +0900 2010
Thu Mar 18 21:20:01 +0900 2010
4.852485 # (秒)
90000
33.2131093656137 <= 比 33倍Nokogiriの方が高速
50MBのXMLファイルも普通に(めちゃくちゃ待たされることなく)読み込めました(^^V
require 'nokogiri'
require "rexml/document" # to parse the xml files
max = 30000
#REXML処理
include REXML
puts 'REXML'
f=File.open('abc.xml')
dayRs = Time.now
doc2 = REXML::Document.new(f)
count = 0
for i in 1..max
XPath.each( doc2, "/a/c/d/attribute::type").each do |d|
if d.to_s == 'AB' then
count = count + 1
# puts 'RE: '+d.to_s
end
end
end
dayRe = Time.now
f.close
puts dayRs
puts dayRe
puts dR=dayRe-dayRs
puts count
#Nokogiri処理
puts 'Nokogiri'
f=File.open('abc.xml')
dayNs = Time.now
doc=Nokogiri::XML(f)
count = 0
for i in 1..max
doc.xpath("/a/c/d/attribute::type").each do |d|
if d.to_s == 'AB' then
count = count + 1
# puts 'noko: '+d.to_s
end
end
end
dayNe = Time.now
puts dayNs
puts dayNe
puts dN=dayNe-dayNs
puts count
puts dR/dN #比を取る
結果は、
REXML
Thu Mar 18 21:17:15 +0900 2010
Thu Mar 18 21:19:56 +0900 2010
161.166115 # (秒)
90000
Nokogiri
Thu Mar 18 21:19:56 +0900 2010
Thu Mar 18 21:20:01 +0900 2010
4.852485 # (秒)
90000
33.2131093656137 <= 比 33倍Nokogiriの方が高速
50MBのXMLファイルも普通に(めちゃくちゃ待たされることなく)読み込めました(^^V
2010年3月13日土曜日
Ruby:XML:nokogiri(属性を取り出す)
次のxmlファイル’abc.xml'をnokogiriで読んでみました。
ここからnokogiriプログラムです。
require 'nokogiri'
puts 'Nokogiri'
f=File.open('abc.xml')
doc=Nokogiri::XML(f)
puts doc.xpath("//d[@id='0']") <= 属性id=0のものを表示
puts doc.xpath("//d[@type='AB']") <= 属性type='AB'のものを表示
doc.xpath("//d[@type='AB']").each do |d| <= 属性type='AB'のものを選んで、それごとに表示
puts d.xpath('descr').text
end
出力は
となります。XPathのパス指定はこの辺に書いてあるようです。
2010年3月12日金曜日
Ruby:XML:nokogiri
今までXMLはREXMLで処理してましたが、今日50MBのXMLファイルの処理に延々と待たされ高速なライブラリを探してみました。ここにあるようにnokogiriやlibxmlを使うとREXMLに比べて50倍以上の高速化が図れそうです。もちろんプログラムは面倒になるでしょうが。
インストールはgemを使って
gem install nokogiri
だけ。
使い方は、例えばここに例があります。
require 'nokogiri'
f = File.open("blossom.xml")
doc = Nokogiri::XML(f)
doc.xpath("//character")
f.close
のような感じ。
これで50MBのXMLファイルに耐えられるかどうかはこれから。
インストールはgemを使って
gem install nokogiri
だけ。
使い方は、例えばここに例があります。
require 'nokogiri'
f = File.open("blossom.xml")
doc = Nokogiri::XML(f)
doc.xpath("//character")
f.close
のような感じ。
これで50MBのXMLファイルに耐えられるかどうかはこれから。
2010年3月11日木曜日
Ruby:Hashリストへのデータの追加
Hashリストにデータを書き込み、それをファイルにしようと思い、Rubyでやってみました。
C:\>irb
irb(main):001:0> a = Hash.new
=> {}
irb(main):002:0> a['abc']='' <=初期化、ここはシングルクォーテーションでもOK。
=> ""
irb(main):003:0> a['abc'] << "1 2 3\n" <= ここでシングルクォーテーションを使うと\nが開業にならない(^^;
=> "1 2 3\n"
irb(main):004:0> a['abc'] << "1 2 3\n"
=> "1 2 3\n1 2 3\n"
irb(main):005:0> a['abc'] << "1 2 3\n"
=> "1 2 3\n1 2 3\n1 2 3\n"
irb(main):006:0> a['abc'] << "1 2 3\n"
=> "1 2 3\n1 2 3\n1 2 3\n1 2 3\n"
irb(main):007:0> f=File.open('cc','w')
=> #
irb(main):008:0> f.write(a['abc'])
=> 28
irb(main):009:0> f.close
=> nil
で、このようなファイルが出きました。
irb(main):010:0> a['def']=''
=> ""
irb(main):011:0> a['def'] << "4 5 6\n"
=> "4 5 6\n"
irb(main):012:0> a['def'] << "4 5 6\n"
=> "4 5 6\n4 5 6\n"
irb(main):013:0> a['def'] << "4 5 6\n"
=> "4 5 6\n4 5 6\n4 5 6\n"
irb(main):014:0> a['def'] << "4 5 6\n"
=> "4 5 6\n4 5 6\n4 5 6\n4 5 6\n"
irb(main):015:0> f=File.open('cc','w')=> #
irb(main):016:0> f.write(a['def'])
=> 28
irb(main):017:0> f.close
=> nil
で、ちゃんと書き換わってます。
C:\>irb
irb(main):001:0> a = Hash.new
=> {}
irb(main):002:0> a['abc']='' <=初期化、ここはシングルクォーテーションでもOK。
=> ""
irb(main):003:0> a['abc'] << "1 2 3\n" <= ここでシングルクォーテーションを使うと\nが開業にならない(^^;
=> "1 2 3\n"
irb(main):004:0> a['abc'] << "1 2 3\n"
=> "1 2 3\n1 2 3\n"
irb(main):005:0> a['abc'] << "1 2 3\n"
=> "1 2 3\n1 2 3\n1 2 3\n"
irb(main):006:0> a['abc'] << "1 2 3\n"
=> "1 2 3\n1 2 3\n1 2 3\n1 2 3\n"
irb(main):007:0> f=File.open('cc','w')
=> #
irb(main):008:0> f.write(a['abc'])
=> 28
irb(main):009:0> f.close
=> nil
で、このようなファイルが出きました。
irb(main):010:0> a['def']=''
=> ""
irb(main):011:0> a['def'] << "4 5 6\n"
=> "4 5 6\n"
irb(main):012:0> a['def'] << "4 5 6\n"
=> "4 5 6\n4 5 6\n"
irb(main):013:0> a['def'] << "4 5 6\n"
=> "4 5 6\n4 5 6\n4 5 6\n"
irb(main):014:0> a['def'] << "4 5 6\n"
=> "4 5 6\n4 5 6\n4 5 6\n4 5 6\n"
irb(main):015:0> f=File.open('cc','w')=> #
irb(main):016:0> f.write(a['def'])
=> 28
irb(main):017:0> f.close
=> nil
で、ちゃんと書き換わってます。
a自体は
irb(main):021:0> puts a
{"abc"=>"1 2 3\n1 2 3\n1 2 3\n1 2 3\n", "def"=>"4 5 6\n4 5 6\n4 5 6\n4 5 6\n"}
このようになっています。
2010年3月9日火曜日
OpenOffice:Writer:マスタードキュメントでのページスタイル
マスタードキュメントでサブドキュメントのページスタイルを変更しても反映されないことがあります。そのときにはそのサブドキュメントを一度マスタードキュメントから削除し、再度設定してみるとページスタイルが変更されていました。
2010年3月6日土曜日
Ruby:wxRuby:裏でイベントループを回し続けるには
wxRubyからエディタを開いていると、イベントループが止まってしまい、何もできない(^^;
何故か「wxRubyでハマったこととかまとめ」にある
Wx::get_app.dispatch while Wx::get_app.pending
を入れるとOKとなった。イベントループを回すおまじないか?
何故か「wxRubyでハマったこととかまとめ」にある
Wx::get_app.dispatch while Wx::get_app.pending
を入れるとOKとなった。イベントループを回すおまじないか?
Ruby:RubyInstaller
RubyInstallerが出ました。
すばらしい。
1.8.7でもgemもインストールしてくれて、それでクリップボードも
gem install win32-clipboard
で関係するライブラリもインストールしてくれました(^^V
zlib.dllなども自動的にインストールされています(^^V
wxRubyは
gem install wxruby
1.9系の方では
http://www.up-cat.net/wxRuby%2B%252B%2BExerb%2B2009.html
gem install wxruby-ruby19
楽ちんになりました(^^V
すばらしい。
1.8.7でもgemもインストールしてくれて、それでクリップボードも
gem install win32-clipboard
で関係するライブラリもインストールしてくれました(^^V
zlib.dllなども自動的にインストールされています(^^V
wxRubyは
gem install wxruby
1.9系の方では
http://www.up-cat.net/wxRuby%2B%252B%2BExerb%2B2009.html
gem install wxruby-ruby19
楽ちんになりました(^^V
2010年3月5日金曜日
2010年3月3日水曜日
OpenOffice:カラードキュメントを白黒のPDFにするには
カラーのドキュメントを白黒のPDFにしようと思いやってみました。
結論からいうとPDFエクスポートでは白黒になりませんでした。それで通常のPDFのドライバ(プリンタのところに出てくるCutePDFのようなもの)を使ってやってみました。
Writerでやったのですが、やり方は、
ファイル→印刷 でオプションのボタンを押して出てくるWindowの内容の欄の白黒印刷をチェック
OKで印刷Windowに戻り、プリンタの名前でPDFのドライバを選択
プロパティボタンで用紙/品質タブを選び、色を白黒に設定する。
OKで印刷Windowに戻り、さらにOKで印刷(白黒PDFファイルの作成)が出きます。
PDFファイルはしばらくしてからファイル名などを聞いてきますので、それまで気長に待ちましょう。
結論からいうとPDFエクスポートでは白黒になりませんでした。それで通常のPDFのドライバ(プリンタのところに出てくるCutePDFのようなもの)を使ってやってみました。
Writerでやったのですが、やり方は、
ファイル→印刷 でオプションのボタンを押して出てくるWindowの内容の欄の白黒印刷をチェック
OKで印刷Windowに戻り、プリンタの名前でPDFのドライバを選択
プロパティボタンで用紙/品質タブを選び、色を白黒に設定する。
OKで印刷Windowに戻り、さらにOKで印刷(白黒PDFファイルの作成)が出きます。
PDFファイルはしばらくしてからファイル名などを聞いてきますので、それまで気長に待ちましょう。
2010年3月1日月曜日
Ruby:Windowsのクリップボード
RubyからWindowsのクリップボードを扱いたいと思い、探してみましたが結構面倒なんですね(^^;
ここのWin32Utilsというツールを使うとよいようです。wxRubyのコンボボックスで選択した値をクリップボードに入れたかったのですが、ComboBox#copy で出来るように書いてあるのですが出来ませんでした。それで、
クリップボードを利用する
にお世話になり、Win32Utilsをインストールしました。
あと、
クリップボードを操作する
Ruby/クリップボードを使う方法
を参照させていただきました。ありがとうございました。
以下、インストール履歴です。まず何もインストールせずにirb(Rubyインタラクティブ環境)で確認します。
>irb
irb(main):001:0> require 'win32/clipboard'
LoadError: no such file to load -- win32/clipboard
from (irb):1:in `require'
from (irb):1
from C:/ruby1.8.7/bin/irb.bat:20:in `'
irb(main):002:0> quit
とエラーが出ます。
で、Rubyインストールフォルダ以下の「lib\ruby\1.8\win32」にwin32-clipboard-0.5.2.zipをdlして解凍し、その中のlib/win32ディレクトリにあるclipboard.rbを入れます。
すると
irb(main):001:0> require 'win32/clipboard'
LoadError: no such file to load -- windows/clipboard
from C:/ruby1.8.7/lib/ruby/1.8/win32/clipboard.rb:1:in `require'
from C:/ruby1.8.7/lib/ruby/1.8/win32/clipboard.rb:1
from (irb):1:in `require'
from (irb):1
from :0
となりますので、今度はwindows-pr-1.0.8.zipの中のlib/windows/clipboard.rbを入れます。
irb(main):002:0> require 'win32/clipboard'
LoadError: no such file to load -- windows/api
from C:/ruby1.8.7/lib/ruby/1.8/windows/clipboard.rb:1:in `require'
from C:/ruby1.8.7/lib/ruby/1.8/windows/clipboard.rb:1
from C:/ruby1.8.7/lib/ruby/1.8/win32/clipboard.rb:1:in `require'
from C:/ruby1.8.7/lib/ruby/1.8/win32/clipboard.rb:1
from (irb):2:in `require'
from (irb):2
from :0
まだまだ終わりません(^^; 今度はwindows-api-0.4.0.zipからlib/windows/api.rbを入れます。
irb(main):004:0> require 'win32/clipboard'
LoadError: no such file to load -- win32/api
from C:/ruby1.8.7/lib/ruby/1.8/windows/api.rb:1:in `require'
from C:/ruby1.8.7/lib/ruby/1.8/windows/api.rb:1
from C:/ruby1.8.7/lib/ruby/1.8/windows/clipboard.rb:1:in `require'
from C:/ruby1.8.7/lib/ruby/1.8/windows/clipboard.rb:1
from C:/ruby1.8.7/lib/ruby/1.8/win32/clipboard.rb:1:in `require'
from C:/ruby1.8.7/lib/ruby/1.8/win32/clipboard.rb:1
from (irb):4:in `require'
from (irb):4
ということで最後にwin32-api-1.4.5.zipから・・・と思ったらここにapi.rbなんてない!(^^;
そこでgemで次のようにしてみました。
c:\>gem install win32-api
Successfully installed win32-api-1.4.6-x86-mswin32-60
1 gem installed
Installing ri documentation for win32-api-1.4.6-x86-mswin32-60...
Installing RDoc documentation for win32-api-1.4.6-x86-mswin32-60...
で、再びirbです。
C:\>irb
irb(main):001:0> require 'win32/clipboard'
LoadError: no such file to load -- win32/api
from C:/ruby1.8.7/lib/ruby/1.8/windows/api.rb:1:in `require'
from C:/ruby1.8.7/lib/ruby/1.8/windows/api.rb:1
from C:/ruby1.8.7/lib/ruby/1.8/windows/clipboard.rb:1:in `require'
from C:/ruby1.8.7/lib/ruby/1.8/windows/clipboard.rb:1
from C:/ruby1.8.7/lib/ruby/1.8/win32/clipboard.rb:1:in `require'
from C:/ruby1.8.7/lib/ruby/1.8/win32/clipboard.rb:1
from (irb):1:in `require'
from (irb):1
from :0
まだだめ(^^;
ここでC:\ruby1.8.7(Rubyインストールディレクトリ)\lib\ruby\gems\1.8\gems\win32-api-1.0.4-mswin32\lib\win32にあるapi.soをC:\ruby1.8.7\lib\ruby\1.8\win32の下にコピー。
すると、
irb(main):002:0> require 'win32/clipboard'
=> true
irb(main):003:0> include Win32
=> Object
irb(main):004:0> puts "Clipboard data is :" + Clipboard.data
Clipboard data is :puts "Clipboard data is :" + Clipboard.data
=> nil
irb(main):005:0> Clipboard.data
=> "puts \"Clipboard data is :\" + Clipboard.data"
irb(main):006:0> Clipboard.set_data("123")
=> Win32::Clipboard
irb(main):007:0> quit
めでたくクリップボードが使えるようになりました(^^V
各ライブラリのインストール先などはもっといいところがあるのかもしれません。
ここのWin32Utilsというツールを使うとよいようです。wxRubyのコンボボックスで選択した値をクリップボードに入れたかったのですが、ComboBox#copy で出来るように書いてあるのですが出来ませんでした。それで、
クリップボードを利用する
にお世話になり、Win32Utilsをインストールしました。
あと、
クリップボードを操作する
Ruby/クリップボードを使う方法
を参照させていただきました。ありがとうございました。
以下、インストール履歴です。まず何もインストールせずにirb(Rubyインタラクティブ環境)で確認します。
>irb
irb(main):001:0> require 'win32/clipboard'
LoadError: no such file to load -- win32/clipboard
from (irb):1:in `require'
from (irb):1
from C:/ruby1.8.7/bin/irb.bat:20:in `'
irb(main):002:0> quit
とエラーが出ます。
で、Rubyインストールフォルダ以下の「lib\ruby\1.8\win32」にwin32-clipboard-0.5.2.zipをdlして解凍し、その中のlib/win32ディレクトリにあるclipboard.rbを入れます。
すると
irb(main):001:0> require 'win32/clipboard'
LoadError: no such file to load -- windows/clipboard
from C:/ruby1.8.7/lib/ruby/1.8/win32/clipboard.rb:1:in `require'
from C:/ruby1.8.7/lib/ruby/1.8/win32/clipboard.rb:1
from (irb):1:in `require'
from (irb):1
from :0
となりますので、今度はwindows-pr-1.0.8.zipの中のlib/windows/clipboard.rbを入れます。
irb(main):002:0> require 'win32/clipboard'
LoadError: no such file to load -- windows/api
from C:/ruby1.8.7/lib/ruby/1.8/windows/clipboard.rb:1:in `require'
from C:/ruby1.8.7/lib/ruby/1.8/windows/clipboard.rb:1
from C:/ruby1.8.7/lib/ruby/1.8/win32/clipboard.rb:1:in `require'
from C:/ruby1.8.7/lib/ruby/1.8/win32/clipboard.rb:1
from (irb):2:in `require'
from (irb):2
from :0
まだまだ終わりません(^^; 今度はwindows-api-0.4.0.zipからlib/windows/api.rbを入れます。
irb(main):004:0> require 'win32/clipboard'
LoadError: no such file to load -- win32/api
from C:/ruby1.8.7/lib/ruby/1.8/windows/api.rb:1:in `require'
from C:/ruby1.8.7/lib/ruby/1.8/windows/api.rb:1
from C:/ruby1.8.7/lib/ruby/1.8/windows/clipboard.rb:1:in `require'
from C:/ruby1.8.7/lib/ruby/1.8/windows/clipboard.rb:1
from C:/ruby1.8.7/lib/ruby/1.8/win32/clipboard.rb:1:in `require'
from C:/ruby1.8.7/lib/ruby/1.8/win32/clipboard.rb:1
from (irb):4:in `require'
from (irb):4
ということで最後にwin32-api-1.4.5.zipから・・・と思ったらここにapi.rbなんてない!(^^;
そこでgemで次のようにしてみました。
c:\>gem install win32-api
Successfully installed win32-api-1.4.6-x86-mswin32-60
1 gem installed
Installing ri documentation for win32-api-1.4.6-x86-mswin32-60...
Installing RDoc documentation for win32-api-1.4.6-x86-mswin32-60...
で、再びirbです。
C:\>irb
irb(main):001:0> require 'win32/clipboard'
LoadError: no such file to load -- win32/api
from C:/ruby1.8.7/lib/ruby/1.8/windows/api.rb:1:in `require'
from C:/ruby1.8.7/lib/ruby/1.8/windows/api.rb:1
from C:/ruby1.8.7/lib/ruby/1.8/windows/clipboard.rb:1:in `require'
from C:/ruby1.8.7/lib/ruby/1.8/windows/clipboard.rb:1
from C:/ruby1.8.7/lib/ruby/1.8/win32/clipboard.rb:1:in `require'
from C:/ruby1.8.7/lib/ruby/1.8/win32/clipboard.rb:1
from (irb):1:in `require'
from (irb):1
from :0
まだだめ(^^;
ここでC:\ruby1.8.7(Rubyインストールディレクトリ)\lib\ruby\gems\1.8\gems\win32-api-1.0.4-mswin32\lib\win32にあるapi.soをC:\ruby1.8.7\lib\ruby\1.8\win32の下にコピー。
すると、
irb(main):002:0> require 'win32/clipboard'
=> true
irb(main):003:0> include Win32
=> Object
irb(main):004:0> puts "Clipboard data is :" + Clipboard.data
Clipboard data is :puts "Clipboard data is :" + Clipboard.data
=> nil
irb(main):005:0> Clipboard.data
=> "puts \"Clipboard data is :\" + Clipboard.data"
irb(main):006:0> Clipboard.set_data("123")
=> Win32::Clipboard
irb(main):007:0> quit
めでたくクリップボードが使えるようになりました(^^V
各ライブラリのインストール先などはもっといいところがあるのかもしれません。
登録:
投稿 (Atom)