« 2008年12月 | メイン | 2009年02月 »

2009年01月 アーカイブ

2009年01月09日

libxml-rubyでXML Schemaのバリデーションをしてみる

XML SchemaのバリデーションをRubyでやってみるにはlibxml-rubyというlibxml2のバインディングを使うのが良いようです。 libxml2に依存していますので、gemを入れる前にとりあえずlibxml2とそのヘッダをインストールしておく必要がある点に注意です。

使い方は以下のようなかんじです。
require "rubygems"
require "xml"

xml_file = ARGV[0]
xsd_file = ARGV[1]

xml_doc = XML::Document.file(xml_file)

schema_doc = XML::Document.file(xsd_file)
schema = XML::Schema.document(schema_doc)

# エラーハンドラ
errors = []
XML::Error.set_handler do |error|
  errors << error
end

begin 
status = xml_doc.validate_schema(schema) do | error, error_type |
  STDERR.puts "================================" # うごかない…。
#  p [error, error_type]
end 
rescue
  puts "has error"
  p $!
end

XML::Document#validate_schemeはバリデーションに失敗した場合、バリデーションが終わったのちに最後に生じたエラーを例外として送出します。個々のバリデーションエラーを調べる場合はブロックを渡すとバリデートエラー時にコールバックとして実行されると書かれており、またソースコードのext/libxml/ruby_xml_document.cをみる限りそのように動きそうなのですが、なぜかブロックは実行されません。
代わりにXML解析時にエラーが起きたときに実行されるグローバルなエラーハンドラーメソッドをXML::Error#set_handlerで登録できますので、これを利用してバリデーションエラーを取得するのが良いようです。
こちらのエラーハンドラーはバリデーションだけでなく、XMLのパーズエラーなどの場合にも呼ばれますので注意が必要です。

rubyでディスクの空き容量を取得してみる

ディスクの空き容量をRubyから知りたかったのですが、どうやら標準では取得できないようです。 ということで、sys-filesystemを使ってみました。説明書によるとWindowsでもUnixでも透過的にファイルシステムの情報を取得してくれるようです。使い方は以下のような感じです。

require 'sys/filesystem'

stat = Sys::Filesystem.stat('/')
p stat.blocks_available * stat.block_size

sys-filesystemでは他にもファイルの数やファイル名長の上限なども取得できます。

続きを読む "rubyでディスクの空き容量を取得してみる" »

2009年01月13日

binary gemのコンパイルオプションをカスタマイズする

ネイティブ拡張を持つgemで、ネイティブ部分のコンパイルオプションを変えてみたい場合、 そのままgem installするだけではコンパイルオプションを渡すことができません。 この場合はソースgemをとってきてコンパイルしたあと、binary gemとしてビルドしなおすと良いようです。
ディトリビューションで配布されているmysqlと別のmysqlをインストールして動作させるために、mysqlドライバにコンパイルオプションで利用するmysqlライブラリの場所を指定する必要があったので、手順を書いてみます。

続きを読む "binary gemのコンパイルオプションをカスタマイズする" »

2009年01月15日

Merb + DataMapperでぽこぽこDBインスタンスを増やしてみる

Merb + DataMapperで複数DBを追加削除してみたりする方法を調べてみました。DataMapperにはRepositoryという概念があり、複数DBへのコネクションを利用することができます。これを利用して、データベースの追加とマイグレーションなどができましたので書きます。

続きを読む "Merb + DataMapperでぽこぽこDBインスタンスを増やしてみる" »