2010年3月21日日曜日

大室山

昨日、大室山に行ってきました。風はかなり強かったのですが、暖かくいい行楽日和でした。ここの桜は9月から6月までいろんな種類が順に咲いているということで、今回は大島桜や台湾緋桜、桃、菜の花などが咲いておりました。ただ残念がら強風のため頂上へのリフトは停止しておりました(^^;




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

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ファイルの処理に延々と待たされ高速なライブラリを探してみました。ここにあるようにnokogirilibxmlを使うとREXMLに比べて50倍以上の高速化が図れそうです。もちろんプログラムは面倒になるでしょうが。

インストールは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

で、ちゃんと書き換わってます。

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となった。イベントループを回すおまじないか?

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

2010年3月5日金曜日

Ruby:Excel:Workbookの終了

ExcelのWorkbookであるファイルを開いていて、そのファイルを閉じて、書き換えた同じファイル名のファイルを立ち上げようとしています。普通に bool.Close とすると”変更を保存しますか?”ダイアログが出てきてしまい、少々面倒です。そこでCloseする前にすでに保存したと思わせるべく、

book.Saved = true
book.Close

としたところ、無事ダイアログを回避することができました(^^V

ここを参考にさせていただきました。ありがとうございました。

2010年3月3日水曜日

OpenOffice:カラードキュメントを白黒の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
各ライブラリのインストール先などはもっといいところがあるのかもしれません。