bar_1

contents_map

ラベル ruby の投稿を表示しています。 すべての投稿を表示
ラベル ruby の投稿を表示しています。 すべての投稿を表示

2017年11月19日日曜日

[Ruby]モジュールに継承/派生っぽいことをさせてみる試み

組み込みライブラリもしくは既存のクラスclassやモジュールmoduleを, 特定の用途向けに一部だけ改変したいことがある. その際, できればモンキーパッチはしたくない.
このような場合, クラスならば class DerivedKlass < OriginalKlass として継承を使える. 派生クラスを作ることで, 元のクラスのコピーを作り, それを改変すればいい.
ではモジュールの場合は, どうしたらよいだろう? ここでは, Mathを取り上げて考えてみる.
最初に, include/extend/refineという既存の方法の検討をおこない問題点を明らかにする. 次に, これらの問題点を解決する Module#module_compose の導入を提案する.

2017年11月16日木曜日

Rubyの実験: Moduleのprivateインスタンスメソッド

Moduleのprivateインスタンスメソッド, 具体的にはModule::module_functionのふるまいで, 腑に落ちない点があった. 派生先のClassクラス (ひいては一般に定義されたクラス) からなぜ使えないのか? ということで, 実験した. 結論的には 仕様だった, という落ちでした……w

2017年11月8日水曜日

Rubyの実験: Object/Class/Module/Kernelにメソッドを追加するとどうなるか?

Object/Class/Module/Kernelにメソッドを追加すると, これらや一般のクラス, モジュールやインスタンスに対してどのような影響があるか, 調べるコードを書いてみた. 追加するメソッドはインスタンスメソッドと特異メソッドで, 両方publicの可視属性です.

2017年11月2日木曜日

つぶやき日記2017-11-01 Rubyでいくつか調べていたこと



  • ModuleやClassのインスタンスメソッドの可視性の相違 (例えば Object#extendとModule#includeはパブリックインスタンスメソッド,かたやModule#public/protected/privateはprivateインスタンスメソッド) について.どうやってpublicとprivateを使い分けているのだろう? 思想がよくわからない……外側から使えるか否かなのかな.
  • public/protected/privateは,実は予約語ではない.Moduleのprivateインスタンスメソッドである.このようなメソッドはRuby自前で書けるか? 答え: 書けない.引数を与えない場合の記述が問題になる.仮にdefを再定義できるならば可能となる (defは予約語である).
  • 強引に書きたい場合は,https://stackoverflow.com/questions/28055356/determining-methods-visibility-on-the-fly が参考となる.defに代わるメソッド定義メソッドを用意することになるだろう.


2014年12月24日水曜日

[Ruby]シンボルとコードブロックからクラスを動的に定義するメソッド: class_define

Ruby では Class.new で無名のクラスオブジェクトは生成することができる。
このとき
  • クラス名
  • クラス本体
を与えて、動的にクラスを作れないか?を考える。

2014年5月19日月曜日

brew のバージョンに関する部分のソースを読んでみた

前回の記事 を書くにあたって CLT のバージョンの調べ方について調査し、パッケージ管理ツールのひとつである Homebrew による CLT バージョンの取得方法について、github のソースを探索したときのログです。
String#[/re/], extend を使ったモジュールのメソッド定義、定数のエイリアスといった、ちょっとおもしろい記述方法を見つけました。

2014年5月13日火曜日

Ruby OptionParser クラスのリファレンス

ruby 2.0.0-p247 環境で、ri OptionParser | col -bx したものの日本語訳です。
以前 (2008年3月16日)、Ruby: OptionParser (optparse.rb) の使い方 にて、OptionParser の記事を書きましたが、もっと完全なドキュメントが身近にありました。OptionParser のすべての機能について網羅した、こちらの説明のほうがよいでしょう。

OptionParser < Object

(from ruby core)

OptionParser

イントロダクション Introduction

OptionParser はコマンドラインオプション分析のためのクラスです。GetoptLong より、ずっと先進的で、にも関わらず使うのがより簡単、またいっそう Ruby 指向のソリューションです。

仕様 Features

  1. 引数指定とそれを処理するコードは、同じ場所に書かれます。
  2. オプションの要約を出力することができます; この要約文を別々にメンテする必要は、ありません。
  3. 選択的や必須の引数を、非常に優雅に指定されます。
  4. 引数たちを、自動で、指定のクラスに変換することができます。
  5. 引数たちを、適切なセットに制限することができます。
これらの仕様すべて、下記の例にデモしてあります。完全なドキュメントは、#make_switch を見よ。

必要最小限の例 Minimal example

  require 'optparse'
options = {}
OptionParser.new do |opts|
opts.banner = "Usage: example.rb [options]"
opts.on("-v", "--[no-]verbose", "Run verbosely") do |v|
options[:verbose] = v
end
end.parse!
p options
p ARGV

完全な記述例 Complete example

下記の例は、完全な Ruby のプログラムです。あなたは実行できますし、さまざまなオプションを指定してみることで、影響をみれます。おそらくこれは optparse の仕様を学ぶのにベストな方法でしょう。
  require 'optparse'
require 'optparse/time'
require 'ostruct'
require 'pp'
class OptparseExample
CODES = %w[iso-2022-jp shift_jis euc-jp utf8 binary]
CODE_ALIASES = { "jis" => "iso-2022-jp", "sjis" => "shift_jis" }
#
# オプションたちの構造記述を返す。
# Return a structure describing the options.
#
def self.parse(args)
# コマンドラインで指定されたオプションたちは、*options* の中に集められる
# われわれはここではデフォルトの値をセットする。
# The options specified on the command line will be collected in *options*.
# We set default values here.
options = OpenStruct.new
options.library = []
options.inplace = false
options.encoding = "utf8"
options.transfer_type = :auto
options.verbose = false
opt_parser = OptionParser.new do |opts|
opts.banner = "Usage: example.rb [options]"
opts.separator ""
opts.separator "Specific options:"
# 必須の引数。
# Mandatory argument.
opts.on("-r", "--require LIBRARY",
"Require the LIBRARY before executing your script") do |lib|
options.library << lib
end
# 選択的な引数; 複数行による記述。
# Optional argument; multi-line description.
opts.on("-i", "--inplace [EXTENSION]",
"Edit ARGV files in place",
"  (make backup if EXTENSION supplied)") do |ext|
options.inplace = true
options.extension = ext || ''
options.extension.sub!(/\A\.?(?=.)/, ".")  # Ensure extension begins with dot.
end
# 引数 'delay' を Float 型に制約する。
# Cast 'delay' argument to a Float.
opts.on("--delay N", Float, "Delay N seconds before executing") do |n|
options.delay = n
end
# 引数 'time' を Time オブジェクトに制限する。
# Cast 'time' argument to a Time object.
opts.on("-t", "--time [TIME]", Time, "Begin execution at given time") do |time|
options.time = time
end
# 8 進数の整数に制限する。
# Cast to octal integer.
opts.on("-F", "--irs [OCTAL]", OptionParser::OctalInteger,
"Specify record separator (default \\0)") do |rs|
options.record_separator = rs
end
# 列挙 (リスト) の引数。
# List of arguments.
opts.on("--list x,y,z", Array, "Example 'list' of arguments") do |list|
options.list = list
end
# キーワード補完。われわれは、特定の引数セットを指定している (CODES
# と CODE_ALIASES - 文字はハッシュであることに注目), そしてユーザは
# もっとも短いあいまいなテキストを使うかもしれない。
# Keyword completion.  We are specifying a specific set of arguments (CODES
# and CODE_ALIASES - notice the latter is a Hash), and the user may provide
# the shortest unambiguous text.
code_list = (CODE_ALIASES.keys + CODES).join(',')
opts.on("--code CODE", CODES, CODE_ALIASES, "Select encoding",
"  (#{code_list})") do |encoding|
options.encoding = encoding
end
# キーワード補完を使った選択的な引数。
# Optional argument with keyword completion.
opts.on("--type [TYPE]", [:text, :binary, :auto],
"Select transfer type (text, binary, auto)") do |t|
options.transfer_type = t
end
# ブーリアン・スイッチ。
# Boolean switch.
opts.on("-v", "--[no-]verbose", "Run verbosely") do |v|
options.verbose = v
end
opts.separator ""
opts.separator "Common options:"
# 引数なしで、tail での表示。これはオプションたちのサマリーをプリントする。
# やってみて!
# No argument, shows at tail.  This will print an options summary.
# Try it and see!
opts.on_tail("-h", "--help", "Show this message") do
puts opts
exit
end
# もうひとつの典型的なスイッチ (バージョンを表示)。
# Another typical switch to print the version.
opts.on_tail("--version", "Show version") do
puts OptionParser::Version.join('.')
exit
end
end
opt_parser.parse!(args)
options
end  # parse()
end  # class OptparseExample
options = OptparseExample.parse(ARGV)
pp options
pp ARGV

シェル補完 Shell Completion

For modern shells (e.g. bash, zsh, etc.), you can use shell completion for command line options.
モダンなシェル (e.g. bash, zsh, など) では、コマンドライン・オプションの ためにシェルの補完が使えます。

さらなるドキュメント Further documentation

上述した例はこのクラスをどのように使うかについて学ぶに十分でしょう。もしなんらかの疑問があれば、http://bugs.ruby-lang.org にチケットを切ってください。

定数 Constants:

  • DecimalInteger 10進数整数形式、Integer 型にコンバートするためのもの。
  • DecimalNumeric
    10進数の整数/浮動小数形式、整数を Integer に, 浮動小数を Float に 変換するためのもの。
  • OctalInteger Ruby/C ライクな 8進数/16進数/2進数 整数形式、Integer 型に変換する ためのもの。
  • SPLAT_PROC [not documented]

クラスメソッド Class methods:

  accept
each_const
getopts
inc
new
reject
search_const
show_version
terminate
top
with

インスタンスメソッド Instance methods:

  abort
accept
banner
base
candidate
complete
def_head_option
def_option
def_tail_option
default_argv
define
define_head
define_tail
environment
getopts
help
inc
load
make_switch
new
notwice
on
on_head
on_tail
order
order!
parse
parse!
permute
permute!
program_name
reject
release
remove
search
separator
set_banner
set_program_name
set_summary_indent
set_summary_width
summarize
summary_indent
summary_width
terminate
to_a
to_s
top
ver
version
visit
warn

属性 Attributes:

  attr_accessor default_argv
attr_accessor set_summary_indent
attr_accessor set_summary_width
attr_accessor summary_indent
attr_accessor summary_width
attr_writer banner
attr_writer program_name
attr_writer release
attr_writer set_banner
attr_writer set_program_name
attr_writer version

2014年1月8日水曜日

[Ruby] case 文は、一番最初にぶち当たった条件だけが発火する


ついつい忘れがちなんでメモ。


>> def foo( x )
>>   case
?>     when x > 2
>>       puts "cond 1."
>>     when x > 4
>>       puts "cond 2."
>>   end
>> end
=> nil


>> foo( 1 )
=> nil
>> foo( 3 )
cond 1.
=> nil
>> foo( 4 )
cond 1.
=> nil
>> foo( 5 )
cond 1.
=> nil



cond 1. しか呼ばれない、ということで。


2013年9月3日火曜日

Ruby: Hash と values_atメソッド

Ruby 小ネタ。
こ〜んな Hash があるとするじゃろ:

>> h = { a: 1, b: 2 } => {:a=>1, :b=>2}
2014-06-02追記: MDH 2.11.0 で修正
これをこうして……

>> h[:a] => 1
となる。

2013年8月4日日曜日

[Memo]private メソッドへのアクセス

Ruby は、クラスのメソッドのデフォルトのアクセス制限が、 public なんだけど、ほっとくと public ばかりになってしまう。そこで整理のためにアクセス制限をしたいとなると、テスト容易性 (testability) に差し障る。

まぁ、そういった場合は send を使えばいいのだけど。

>> class Foo
>> private
>> def foo; p "foo"; end
>> end
=> nil
>> n=Foo.new
=> #
>> n.foo
NoMethodError: private method `foo' called for #
from (irb):6
from /Users/honyarara/.rbenv/versions/2.0.0-p247/bin/irb:12:in `'
>> n.send(:foo)
"foo"
=> "foo"


C++だったら、ここらへんどうあつかったらいいのかな。。。『メタプログラミングRuby』は、オブジェクトモデルを骨子に据えて、 Ruby におけるメタプログラミングのデザインパターンを、シナリオ風に提起したもので、とてもよかったです。




2011年3月22日火曜日

[Ruby]配列とハッシュ

インデックス、値、変換配列の値(要素)から、そのインデックスを得る方法を探していたのだが、当初、見つからなかった。
このため、配列を、一旦、ハッシュに変換してから、処理しようと試みた。しかし、Rubyでは、配列でもハッシュでも、要素から(インデックス|キー)を引くのは、同じ方法(indexメソッド)であることが分かったorz

以下は、配列の場合である。

irb(main):001:0> ["foo", "bar", "car", "cdr"].index("car")
=> 2
irb(main):002:0> ["foo", "bar", "car", "cdr"][2]
=> "car"

以下は、ハッシュの場合である。
irb(main):006:0> {1=>"foo", 2=>"bar", 3=>"car", 4=>"cdr"}.index("bar")
=> 2
irb(main):008:0> {1=>"foo", 2=>"bar", 3=>"car", 4=>"cdr"}[2]
=> "bar"

配列からハッシュを生成する(1)ここで、仮に配列からハッシュに変換しようとした場合、どのようにしたらよいだろうか?ここで、変換の際、配列のインデックスは、ハッシュにしたときにキーとなるものとする。
上記を考えたとき、以下のようなトピックを利用すれば、変換することができる:
  • Array http://www.ruby-lang.org/ja/man/html/Array.html
    配列クラス
    • Array#transpose
      配列の配列を行列とみなし、行と列の転置をおこなうインスタンス・メソッド
    • Array#flatten
      階層化された配列から階層を取り払い、一次(インデックスが1種類)の配列にするインスタンス・メソッド
  • Hash
    ハッシュ・クラス
    • Hash.[]
      与えられたオブジェクトで新しいハッシュを生成するクラス・メソッド
  • *[] (多重代入)
    複数の値を、それらに対応する複数の変数に、代入する仕組み

配列からハッシュを生成する(2)
(1) 変換前の配列を元に、二つの配列を用意する; ひとつは、変換前の配列のインデックスを要素とする配列 a、もうひとつは、変換前の配列のを要素とする配列 b である。すなわち:
a = [0, 1, 2, ..., n-1]
b = [e_0, e_1, e_2, ..., e_(n-1)]
n: aのサイズ=bのサイズ
e_i: 変換前の配列の各要素
(2) 配列aの要素a_iとbの要素b_iが、交互に並ぶような配列abを作成する; つまり、
ab = [a_0, b_0, a_1, b_1, ..., a_(n-1), b_(n-1)]
n: aのサイズ=bのサイズ
である。
この処理を行うためには、Array#transpose と Array#flatten を、利用する。
(3) ハッシュを生成する。このとき多重代入によって、配列abをハッシュ生成メソッドに与える。

ソース・コードは以下となる。戯れに、gist.github.comにも格納してみた
(https://gist.github.com/876272 )。
#file: to_h.rb
#conversion method from Array to Hash.
#
#
class Array
def idxarr( x )
Array.new(x) {|i| i}
end
def to_h
Hash[ *[idxarr(self.size), self].transpose.flatten ]
end
end
####endof file: to_h.rb

実行例は以下である:
irb(main):002:0> require 'to_h.rb'
=> true
irb(main):003:0> ['foo', 'bar', 'car', 'cdr'].to_h
=> {0=>"foo", 1=>"bar", 2=>"car", 3=>"cdr"}

Conclusion
- 配列でも、indexメソッドで、値からインデックスを求めることが出来る
- 配列からハッシュへの変換メソッドを実装した
Future Works
- 自分の環境で、gisty で投稿できないので、原因を解明すること
References
- Dave Thomas, et. al.; “プログラミングRuby”, 第2版, 言語編; オーム社
- Dave Thomas, et. al.; “プログラミングRuby”, 第2版, ライブラリ編; オーム社
- buzword, “配列からハッシュを作成する”, http://www.rubylife.jp/ini/hash_class/index7.html

2011年3月21日月曜日

[Cygwin][Ruby]ファイル・システム OR gemの振る舞い(環境?)がおかしくなった?

正確には、当該現象は今は発生していない;原因はわからないが、LoadErrorを発生することなく元通りに実行されるようになった。

しかし、以前にも(gistyとは別件で)、Cygwin上で同様のふるまい―作業したファイルが元に(?)戻ってしまったように見える現象―を、経験している。よって、ここに忘備として記録を残しておく。

現象以前構築したgistyの環境が、おかしくなっていることに気づいた。具体的な症状は:
  • gistyコマンドを実行すると、LoadErrorが発生
  • LoadErrorの内容は、no such file to load -- rr 、つまりrrというファイルが、gem_original_requireメソッドから見つからない

その他の現象gem listすると、パッケージは表示されるものの、gem which パッケージ名 を実行すると:
ERROR: Can't find ruby library file or shared library test-unit
という結果になるものがいくつか存在する。この現象は、回復していない。
環境
$ uname -srvmpio
CYGWIN_NT-5.1 1.7.7(0.230/5/3) 2010-08-31 09:58 i686 unknown unknown Cygwin
$ ruby --version
ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-cygwin]
$ gem --version
1.3.7
$ git --version
git version 1.7.2.3
$ gisty about
mm mm
mm
mmmmmm mmmm mmmmm mmmmmm mm mm
mm mm mm mm mm mm mm
mm mm mm mmmm mm mm mm
mmmmmm mm mm mm mmmmm
mm mmmmmm mmmmm mmm mm
mmmmm mmmm
version: 0.0.14
url: http://github.com/swdyh/gisty/tree/master

2011年3月4日金曜日

Ruby の Test::Unit の GUI インターフェイス

概要


Cygwin 環境で Ruby の単体テストフレームワーク: Test::Unit の GUI インターフェイスを使ってみた。そのところ、必要な gem パッケージのインストールで、問題が生じた。問題は、gem の native extensions のコンパイルに失敗するというものだった。これに対処するため、gem install のオプションとして、--with-opt-include=/usr/include/cairo を指定し、解決した。
以下にこの問題の現象、問題の解析、対処法、結果を述べる。(追記2014-04-24: Markdown で書き直した)


2011年3月1日火曜日

gem install の振る舞いふたたび(Rake編)

う~む。。。やっぱり gem install しただけだと、インストールされないようだ。
$ gem install rake
Successfully installed rake-0.8.7
1 gem installed
Installing ri documentation for rake-0.8.7...
Installing RDoc documentation for rake-0.8.7...

$ rake --version
bash: rake: command not found


2011年2月10日木曜日

gem update/install のふるまい?

いままで、とくに気にしたことはなかったのだけど、
gem update gemパッケージ
は、実はgemパッケージをダウンロードしてくるだけで、インストールはしない……?

2010年12月24日金曜日

Rubyにおける代入・参照・参照渡しと、メソッドの仮引数・ローカル変数・グローバル変数

ひさびさにRubyを触って、思い出すまでハマったのでメモっておく。



「Rubyには参照渡ししかない」とだけ覚えていたことから、生じていた思い込み:
×メソッドの引数を介して、グローバル変数の値は変えられる

これは間違い。



以下が正しい:

  • 代入演算子= は、参照先を変更する(だけの)ためのものである

  • メソッドは、オブジェクトに対するメッセージである

  • メソッドの機能の一つには、オブジェクト内部のフィールドの値を変更することがある

  • メソッド定義の仮引数は、メソッドのスコープのローカル変数である







実験



以下のようなt_f, t_f2, t_f3 のメソッドがあるとする:
irb(main):022:0> def t_f( a )
irb(main):023:1>  a='t_f'
irb(main):024:1> end
=> nil

irb(main):029:0> def t_f2( a )
irb(main):030:1> a.push('bar')
irb(main):031:1> end
=> nil

irb(main):036:0> def t_f3( a )
irb(main):037:1> b=a
irb(main):038:1> b.push('t_f3')
irb(main):039:1> end
=> nil









メソッド t_f のテスト



irb(main):025:0> a="boo"
=> "boo"
irb(main):026:0> t_f( a )
=> "t_f"
irb(main):027:0> a
=> "boo"





  1. グローバル・スコープの変数 a の参照が、メソッド t_f の仮引数 a にコピーされる
     (この時点で t_f の仮引数a の参照先は、オブジェクト"boo"である)


  2. メソッド t_f の仮引数 a の参照先が、文字列オブジェクト "t_f" に、変更される


  3. メソッド t_f を抜けたので、メソッド t_f の仮引数 a は破棄される
    ��グローバル・スコープの変数 a の値=参照先は、 "boo" のままであることが、確認される


メソッド t_f2 のテスト



irb(main):028:0> b=['boo']
=> ["boo"]
irb(main):033:0> t_f2( b )
=> ["boo", "bar"]
irb(main):034:0> b
=> ["boo", "bar"]





  1. グローバル・スコープの変数b の参照が、メソッドt_f2の仮引数a にコピーされる(この時点でt_fの仮引数a の参照先は、オブジェクト["boo"]である)


  2. メソッドt_f2の仮引数a に、メッセージpush("bar")が渡され、仮引数a の参照先のオブジェクトは["boo", "bar"]に、変更される


  3. メソッドt_f2 を抜けたので、メソッドt_f2 の仮引数a は破棄される
    ��グローバル・スコープの変数b の値=参照先のオブジェクトの値は、["boo", "bar"]と変更されていることが、確認される


メソッド t_f3 のテスト



irb(main):042:0> b=["boo", "bar", "bar"]
=> ["boo", "bar", "bar"]
irb(main):043:0> t_f3( b )
=> ["boo", "bar", "bar", "t_f3"]
irb(main):044:0> b
=> ["boo", "bar", "bar", "t_f3"]





  1. グローバル・スコープの変数b の参照が、メソッドt_f3の仮引数a にコピーされる
     (この時点でt_fの仮引数a の参照先は、オブジェクト["boo", "bar", "bar"]である)


  2. メソッドt_f2のローカル変数b の参照先は、仮引数a の参照先に設定される


  3. メソッドt_f2のローカル変数b の参照先に、"t_f3"がpushされ、オブジェクト["boo", "bar", "bar", "t_f3"]に、変更される


  4. メソッドt_f2 を抜けたので、メソッドt_f2 の仮引数a 、ローカル変数b は、ともに破棄される
    ��グローバル・スコープの変数b の値=参照先のオブジェクトの値は、["boo", "bar", "bar", "t_f3"]と変更されていることが、確認される

2010年12月2日木曜日

Cygwin上のruby環境でgithubとgist, gistyの環境を整えてみた


■問題点
例によって、躓きまくりました。
  • nokogiriのgemインストールができない。
  • gistyのgemインストールができない。

■解決法
時間のない人のために、最初に、今回試した手順のまとめを示します:
  1. Cygwinのライブラリ(lib*)のインストール(gistyに必要とされるもの)
    Cygwinのインストーラ:setup.exeで、libxml2, libxslt, libiconv, (+libiconv2) をインストール。
  2. gemの設定1(環境変数GEM_HOME, APPDATA)
    export GEM_HOME="/cygdrive/your/gem/home"
    export APPDATA="${GEM_HOME}"
  3. gemの設定2(gemの取得先の設定追加)
    $ gem sources -a http://gems.github.com/
  4. gemインストール1(nokogiri)
    $ gem install nokogiri
  5. gemインストール2(gisty)
    $ gem install swdyh-gisty
  6. gistyの設定(GISTY_DIR)
    export GISTY_DIR="${HOME}/your/gisty/directory"
  7. githubの設定(SSH公開鍵の登録)
    github.comにログインし
    アカウントの設定>アカウントの概要>SSH公開鍵
    にて、登録。
  8. gitのローカル環境の設定(githubのidとAPIトークン)
    git config --global github.user your_id
    git config --global github.token your_APItoken
  9. gistyの設定(パスの通ったディレクトリにコピー)
    cd /cygdrive/${GEM_HOME}/gems/swdyh-gisty-0.0.14/bin
    cp -i gisty /usr/bin/.
以下は試したときの時系列ログ的書き物です。


●gemインストール1

$ gem install nokogiri
Building native extensions. This could take a while...
ERROR: Error installing nokogiri:
ERROR: Failed to build gem native extension.
/usr/bin/ruby.exe extconf.rb
checking for libxml/parser.h... yes
checking for libxslt/xslt.h... yes
checking for libexslt/exslt.h... yes
checking for iconv_open() in iconv.h... no
checking for iconv_open() in -liconv... yes
checking for xmlParseDoc() in -lxml2... yes
checking for xsltParseStylesheetDoc() in -lxslt... yes
checking for exsltFuncRegister() in -lexslt... yes
checking for xmlFirstElementChild()... yes
checking for xmlRelaxNGSetParserStructuredErrors()... yes
checking for xmlRelaxNGSetParserStructuredErrors()... yes
checking for xmlRelaxNGSetValidStructuredErrors()... yes
checking for xmlSchemaSetValidStructuredErrors()... yes
checking for xmlSchemaSetParserStructuredErrors()... yes
creating Makefile
/usr/lib/ruby/1.8/mkmf.rb:1322: warning: global variable `$preload' not initiali
zed
make
Makefile:119: *** target pattern contains no `%'. Stop.
Gem files will remain installed in d:/home/gems/nokogiri-1.4.4 for inspection.
Results logged to /cygdrive/d/home/gems/nokogiri-1.4.4/ext/nokogiri/gem_make.out

エラーログからは、なにが悪いのかさっぱり分からない。そこで、エラーメッセ
ージをぐぐってみる。
http://stackoverflow.com/questions/1225703/cant-build-gem-native-extension-build-fails-can-you-see-why
どうやら、Cygwin環境のライブラリを再インストールする必要があるようだ。。。
●足りないと思われるライブラリ
上記gemエラーログから、想像したライブラリ名は以下の通り:
  • ?libxml
  • libxml2
  • libxslt
  • ?libexslt
  • libiconv
  • (+iconv2)

��は、存在しないようだった。
Cygwinのインストーラ:setup.exe を使って、上記をReinstallした。
次に再度、gemのインストールを試す。
●再度gemインストール
また失敗。
$ gem install nokogiri
cygwin warning:
MS-DOS style path detected: C:\Documents and Settings\All Users\Application Data/gemrc
Preferred POSIX equivalent is: /cygdrive/c/Documents and Settings/All Users/Application Data/gemrc
CYGWIN environment variable option "nodosfilewarning" turns off this warning.
Consult the user's guide for more details about POSIX paths:
http://cygwin.com/cygwin-ug-net/using.html#using-pathnames
Building native extensions. This could take a while...
ERROR: Error installing nokogiri:
ERROR: Failed to build gem native extension.
/usr/bin/ruby.exe extconf.rb
checking for libxml/parser.h... yes
checking for libxslt/xslt.h... yes
checking for libexslt/exslt.h... yes
checking for iconv_open() in iconv.h... no
checking for iconv_open() in -liconv... yes
checking for xmlParseDoc() in -lxml2... yes
checking for xsltParseStylesheetDoc() in -lxslt... yes
checking for exsltFuncRegister() in -lexslt... yes
checking for xmlFirstElementChild()... yes
checking for xmlRelaxNGSetParserStructuredErrors()... yes
checking for xmlRelaxNGSetParserStructuredErrors()... yes
checking for xmlRelaxNGSetValidStructuredErrors()... yes
checking for xmlSchemaSetValidStructuredErrors()... yes
checking for xmlSchemaSetParserStructuredErrors()... yes
creating Makefile
/usr/lib/ruby/1.8/mkmf.rb:1322: warning: global variable `$preload' not initiali
zed
make
Makefile:119: *** target pattern contains no `%'. Stop.
Gem files will remain installed in d:/home/gems/nokogiri-1.4.4 for inspection.
Results logged to /cygdrive/d/home/gems/nokogiri-1.4.4/ext/nokogiri/gem_make.out

似たようなエラーメーセージだが、若干違うのは”MS-DOSスタイルのパス”が云々
というところ。知らない環境変数が参照されていると見当をつけ、
set | grep -i "パス"
してみた。すると、APPDATAという変数に上記ディレクトリが設定されている
●gemの設定(環境変数)
以前、GEM_HOMEを設定したが、ActiveScriptRubyのためであった。今設定しよう
としているのは、Cygwin上のRubyのためのものである。既存の設定だと、
GEM_HOMEは、ActiveScriptRubyのための環境変数の設定値(当然、こちらはWin 
形式のディレクトリ名)となっており、Cygwinとバッティングする。
また、環境変数APPDATAも、gemから同様な参照をされる。gemは、APPDATAの設定
値(ディレクトリ)からも、gemrcを読もうとしている。
だから、Cygwin上のRuby環境においては、Bashの環境変数:
GEM_HOME, APPDATA両方の設定を、POSIX形式で、行う必要がある;
これらの値の設定を.profileまたは.bashrcにでも書いておけばよかろう。
以下のようにした:
export GEM_HOME="/cygdrive/d/home"
export APPDATA="${GEM_HOME}"

ふー。
もう一度、gemのインストールから・・・(ヽ´ω`)。。。
●nokogiri のインストール
$ gem install nokogiri
Building native extensions. This could take a while...
Successfully installed nokogiri-1.4.4
1 gem installed
/usr/lib/ruby/1.8/rdoc/parsers/parse_c.rb:204: warning: method redefined; discar
ding old progress
Installing ri documentation for nokogiri-1.4.4...
No definition for get_options
No definition for set_options
No definition for parse_memory
No definition for parse_file
No definition for parse_with
Installing RDoc documentation for nokogiri-1.4.4...
No definition for get_options
No definition for set_options
No definition for parse_memory
No definition for parse_file
No definition for parse_with

インストールできたようだ。
次にgistyのgemをインストールする。
●swdyh-gisty のインストール
$ gem sources -a http://gems.github.com/
$ gem install swdyh-gisty
/usr/lib/ruby/site_ruby/1.8/rubygems/dependency.rb:88: warning: instance variable @prerelease not initialized
/usr/lib/ruby/site_ruby/1.8/rubygems/dependency.rb:88: warning: instance variable @prerelease not initialized
Successfully installed swdyh-gisty-0.0.14
1 gem installed
/usr/lib/ruby/1.8/rdoc/parsers/parse_c.rb:204: warning: method redefined; discarding old progress
Installing ri documentation for swdyh-gisty-0.0.14...
Installing RDoc documentation for swdyh-gisty-0.0.14...
/usr/lib/ruby/1.8/rdoc/generators/html_generator.rb:1103: warning: too many arguments for format string
/usr/lib/ruby/1.8/rdoc/generators/html_generator.rb:1103: warning: too many arguments for format string
/usr/lib/ruby/1.8/rdoc/generators/html_generator.rb:1103: warning: too many arguments for format string
/usr/lib/ruby/1.8/rdoc/generators/html_generator.rb:1103: warning: too many arguments for format string
/usr/lib/ruby/1.8/rdoc/generators/html_generator.rb:1103: warning: too many arguments for format string
/usr/lib/ruby/1.8/rdoc/generators/html_generator.rb:1103: warning: too many arguments for format string
/usr/lib/ruby/1.8/rdoc/generators/html_generator.rb:1103: warning: too many arguments for format string
/usr/lib/ruby/1.8/rdoc/generators/html_generator.rb:1103: warning: too many arguments for format string
/usr/lib/ruby/1.8/rdoc/generators/html_generator.rb:1103: warning: too many arguments for format string
/usr/lib/ruby/1.8/rdoc/generators/html_generator.rb:1103: warning: too many arguments for format string
/usr/lib/ruby/1.8/rdoc/generators/html_generator.rb:1103: warning: too many arguments for format string
/usr/lib/ruby/1.8/rdoc/generators/html_generator.rb:1103: warning: too many arguments for format string
/usr/lib/ruby/1.8/rdoc/generators/html_generator.rb:1103: warning: too many arguments for format string
/usr/lib/ruby/1.8/rdoc/generators/html_generator.rb:1103: warning: too many arguments for format string
/usr/lib/ruby/1.8/rdoc/generators/html_generator.rb:1103: warning: too many arguments for format string
/usr/lib/ruby/1.8/rdoc/generators/html_generator.rb:1103: warning: too many arguments for format string

ドキュメント関連のwarningが出るが、インストールできたようだ。
■gistyの設定(GISTY_DIR)
適当なディレクトリを用意しましょう。このディレクトリに、gistyは
GISTY_DIRは、.bashrcに書
いておけばよいでしょう。
export GISTY_DIR="${HOME}/your/directory"

■githubの設定(SSH公開鍵の登録)
ssh-keygenを使って、公開鍵と秘密鍵を生成する。
次に、githubに生成した公開鍵を登録する。登録は、githubにログインして、
 アカウントの設定>アカウントの概要>SSH公開鍵
から行います。
手順の詳細は、
コピペするときに、改行が入らないように気をつけること。改行が入ってしまっ
たら、消してください。
公開鍵を登録し終わったら、ちゃんと登録できたかテスト。テストは以下のよう
な感じで:
$ ssh -T git@github.com
Enter passphrase for key '/home/masa/.ssh/id_rsa':
ERROR: Hi mephistobooks! You've successfully authenticated, but GitHub does not
provide shell access

"successfully authenticated"されれば、オッケイ。
■gitの設定(idとAPIトークン)
APIトークンは、github.com/account の
アカウントの設定>アカウントの概要>アカウントの管理>APIトークン
に表示されます。
下記のコマンドで、githubのidとAPIトークンを設定しましょう。
git config --global github.user your_id
git config --global github.token your_APItoken

■gistyの設定(パスの通ったディレクトリにコピー)
なぜなんだか、gem installしても/usr/bin/に、gistyがコピーされませんでした。
なので仕方なく手で、ディレクトリ:
/cygdrive/${GEM_HOME}/gems/swdyh-gisty-0.0.14/bin から、
cp -i gisty /usr/bin/.
した。
ふー。
■References
・README.rdoc -gisty
https://github.com/swdyh/gisty
・gistコマンドよりちょっと便利なgisty
http://d.hatena.ne.jp/swdyh/20081207/1228655198
・Gistyインストールから利用までの道のりメモ
http://d.zeromemory.info/2009/01/05/install-gisty.html
・Generating SSH keys (Win/msysgit)
http://help.github.com/msysgit-key-setup/
・WindowsでのGit環境構築とその注意点
http://sourceforge.jp/magazine/09/02/12/0530242

2010年11月29日月曜日

Cywin上のRuby環境でgitの環境を整えてみた

これらのサイト

http://sourceforge.jp/magazine/09/02/12/0530242
http://www8.atwiki.jp/git_jp/pub/git-manual-jp/Documentation/gittutorial.html

を参考にした。

もともと、Cygwin環境自体は構築済みなので、Cygwinのsetup.exeで、
  1. git
  2. git-completion
  3. git-gui
  4. git-svn
  5. subversion-perl
  6. lv
の6つパッケージをインストール。ひさびさに更新したら、今回の作業とは関係ないいろんなモノをダウンロードしてしまった。lvは昔インストールした気もするが・・・まぁいいや。
しかし、ちょっと凝ったことしようとすると、Windowsがメインを前提とすると、途端にめんどくささが上がってしまう。。。
漢字コードやらなにやらで。ま、当ブログではマゾヒスティックに、Win環境にも関わっていきます。

2010年10月21日木曜日

GAE: Windows環境でRubyをつかったGoogle App Engine開発環境導入まとめとコマンドヘルプ

■本稿の目的



Googleによる App Engine のチュートリアルは、とてもわかり易く、手順をシンプルに追った記述となっている。これにより、PythonまたはJavaを使ったGAEの開発の最低限の方法について、知ることができる。



しかしながら、このチュートリアルでは、以下のような難点がある:

  • Rubyの環境については触れられていない

  • 開発用のコマンドの詳細の説明については、省かれている

  • 手順を丁寧に追っているため、記述に若干冗長な感がある




加えて、ネット上の情報を見ると、それらのほとんどはLinuxベースの環境であって、Windows+Ruby環境でのGAE開発に触れた情報は少ない(Googleでキーワード「GAE Ruby Windows dev_appserver appcfg」で検索すると、実際のページ総数はたかだか「約 244 件中 3 ページ目 (0.24 秒)」件である)。



そこで、本稿は:

  • Windows環境(ActiveScriptRuby)

  • RubyをつかったGAE開発

  • Googleのチュートリアルより記述を簡潔に

  • ただし開発用コマンドの説明は詳細まで行う

という方針で、App Engineを利用した開発の手始めについてまとめた。


■凡例


本稿の表記
Googleのチュートリアルの表記、または本稿が想定する環境等

GAEアプリ
App Engineアプリケーション
GAE SDK
App Engineソフトウェア開発キット
GAEリモート動作環境
Googleによって提供されているApp Engine (Python|Java|etc...) ランタイム
 環境。
GAEローカル環境
GAEのソースの記述、ローカルWebサーバーでテストなどをおこなうGAEリモー
ト動作環境の外、すなわちあなたのPCなどのこと。
GAEアプリID
GAEアプリのための任意のID
GAE開発用コマンド
 核となるコマンド: dev_server.rb, appcfg.rb をいう。


■Google App Engineとは



App Engineとは:

  • メールサービス

  • Webサーバー・インタフェース
    Webアプリ
    Webアプリ・開発用コンソール http://(localhost:xxxx|appid.appspot.com)/_ah/admin
     (上記Webアプリは、GAEアプリとしての特徴を有する)

  • ストレージ

を有する、Googleによるサービスの総体のことである。


これらのサービスを使って、ユーザによりGAE SDKを使って開発されるものを、本稿では、GAEアプリと呼ぶ。


GAEアプリを開発、実行する環境は、2つあり:
 GAEリモート動作環境、
 GAEローカル環境
とよぶ。
 
 



■RubyのGoogle App Engine環境



本稿では、単にApp Engineを導入するのでなくて、Rubyを用いた環境を導入する
ことを想定している。実際には、Javaの環境をベースに JRubyを介して、Rubyを
利用する形となる(一般的に提供されている、PythonやJavaによる環境ではない
��。


このRubyを利用するための環境は、 gem形式でGoogleが用意してくれている。
 



■GAEアプリ開発の一連の流れを簡潔に述べる



チュートリアルの流れを、簡潔に表にまとめた。





































ステップ用意するもの得られるものやること

1.GAE開発環境の用意

GAE SDKのダウンロード作業

GAEの開発環境

Ruby用のGAE SDKをインストールする。
方法については、

前回の記事

を参照のこと。 

2.GAEアプリのアカウントを登録

Googleアカウント、
GAEアプリID、
SMSを受信できる携帯電話

GAEアプリのURL(http://GAEアプリID.appspot.com/)

GAEアプリのアカウント登録サイトで、必要とされる情報を入力する※。


3.GAEローカル環境でのGAEアプリの開発

ソースコード

GAEアプリ

GAEアプリのソースコードを記述する。

4.GAEリモート動作環境へのアップロード

GAEアプリ、
アップロード・コマンドの実行(appcfg.rb)、
GoogleアカウントのIDとパスワード

GAEリモート動作環境でのGAEアプリの起動

アップロード・コマンドを実行し、GAEリモート動作環境にアップロードする。




※ステップ2の注意



SMSの登録内容について。電話番号の表記の仕方(81を含むのかそうでないか)、メ
ールアドレスかイマイチ判然としない。何度か試しているうちに、Googleか
らSMSが来たため、どれが正しいかわからなかった。



このサイト

でも、同様の事例をまとめているようだ。


Googleから送信されるSMSには、"Google App Engine Code: xxxxxxx"(xは数
字)という内容で、これがGoogleの GAEアカウント認証サイトによって認証
される必要がある。(当方は、ドコモの携帯電話で2010年 9月に行った。)
 
 
 
 




■GAE開発用コマンドについて



GAE SDKのをインストールすると、チュートリアルに紹介されているコマンド:
dev_appserver.rb, appcfg.rb が、ディレクトリ: %RUBY_HOME%\bin\ などに、
格納される(実際には、BATファイルからなる複数のスクリプトから構成されるが、本稿で
はここのスクリプトについての説明は割愛する)。



◆概要



●dev_appserver.rb



開発用のローカルWebサーバー兼GAEローカル環境でのGAEアプリのランチャ。
使い方:
 dev_appserver.rb [オプション] <warディレクトリ>



「warディレクトリ」にあるGAEアプリを、ローカル環境で起動する。


このローカルWebサーバーは、Googleアカウントをシミュレートしていて、独自
のログイン、ログアウト画面を有する。



●appcfg.rb



GAEアプリの管理コマンド


使い方:
 D:/PROGRA~1/ruby-1.8/bin/appcfg.rb [options] <action> <app-dir> [<output-file>]




管理とは、以下のことを指す:

  • ランタイム環境へのGAEアプリのアップロード
  • index.yamlの更新・削除
  • スケジュール・タスクの管理
  • スケジュール・タスクの管理

  • ランタイム環境へのデータのアップロード

http://code.google.com/intl/ja/appengine/docs/python/tools/uploadinganapp.html




◆GAE開発用コマンドの詳細説明




●dev_appserver.rb



開発用のローカルWebサーバー兼GAEローカル環境でのGAEアプリのランチャ。



使い方:



  <dev-appserver> [options] <war directory>

※--help オプション時も、<war directory>指定が必要



オプション:



--help, -h
 このヘルプメッセージを表示して終了。

--server=SERVER
 -s SERVER
  最新のSDKバージョンを判別に使用するサーバの指定。

--address=ADDRESS
 -a ADDRESS
  WebサーバーがバインドするローカルPC上のインタフェースのアドレスの指
  定(もしくは、0.0.0.0 で全てのインタフェース)。

--port=PORT
 -p PORT
  WebサーバーがバインドするローカルPC上のポート番号の指定。

--sdk_root=root
 格納されているSDKでオーバーライドする場合のSDK格納ディレクトリの指定。

--disable_update_check
  最新のSDKバージョンのチェックを無効に指定。




例:




D:\Program Files\ruby-1.8\usr\local\sinatra_test>dev_appserver.rb --help .
D:/Program Files/ruby-1.8/lib/ruby/gems/1.8/gems/appengine-tools-0.0.15/lib/appengine-tools/boot.rb:50: warning: `*' interpreted as argument prefix
=> Skipping update check
=> Booting DevAppServer
=> Press Ctrl-C to shutdown server
Usage: <dev-appserver> [options] <war directory>

Options:
--help, -h                 Show this help message and exit.
--server=SERVER            The server to use to determine the latest
-s SERVER                   SDK version.
--address=ADDRESS          The address of the interface on the local machine
-a ADDRESS                  to bind to (or 0.0.0.0 for all interfaces).
--port=PORT                The port number to bind to on the local machine.
-p PORT
--sdk_root=root            Overrides where the SDK is located.
--disable_update_check     Disable the check for newer SDK versions.




●appcfg.rb



GAEアプリの管理コマンド。



使い方:



 D:/PROGRA~1/ruby-1.8/bin/appcfg.rb [options] <action> <app-dir> [<output-file>]




アクション:



<action>は、以下のうちいずれか 1つである必要がある:


 help
  あるアクションのヘルプを出力する
 request_logs
  リクエスト・ログをApache共通ログ形式で出力する。
 rollback
  処理中の更新をロールバックする。
 update
  新しいバージョンのGAEアプリに更新、あるいは新規作成する。
 update_indexes
  GAEアプリのインデックス(注)を更新する。
 update_cron
  GAEアプリのcronジョブを更新する。
 update_queues
  GAEアプリのタスク・キューの定義を更新する。
 update_dos
  GAEアプリの対DoS保護の環境設定を更新する。
 version
  バージョン情報を出力する。
 cron_info
  cronジョブの次回の実行までの時間を表示する。
 run
  ユーザーのGAEアプリ環境でjrubyを実行する。
 bundle
  GAEリモート環境へのデプロイのために、ローカルのGAEアプリをパッケージングする。




'run' コマンドは、カレント・ディレクトリをGAEアプリのディレクトリと、みなします。
'help <action>' で、詳細の説明を見てください。



オプション:



-h, --help            ヘルプを表示して終了。
-s SERVER, --server=SERVER
接続を行うサーバー。
-e EMAIL, --email=EMAIL
利用するユーザ名。省略時は入力待ちに。
-H HOST, --host=HOST  全てのRPCで送られるホストヘッダの上書き。
-p PROXYHOST[:PORT], --proxy=PROXYHOST[:PORT]
指定したプロクシ・サーバを介してリクエストをプロ
する。
--proxy_httpsも指定した場合、HTTPだけがプロクシ
され、そうでなければHTTPとHTTPSの両方がなされる。
--proxy_https=PROXYHOST[:PORT]
HTTPSリクエストをプロクシするプロクシ・サーバ。
--sdk_root=root       GAE SDKの格納場所を上書きする。
--passin              標準入力からログイン・パスワードを読む。
--insecure            管理コンソールとの通信ではHTTPSを使用しない。
--enable_jar_splitting
巨大なjarファイル(> 10M)を小さなファイルに分割する。
Split large jar files (> 10M) into smaller fragments.
--jar_splitting_excludes=SUFFIXES
--enable-jar-splitting が指定された場合、コンマ
区切りでSUFFIXESに指定された拡張子にマッチするファイルは、全ての
jarファイルにおいて、分割から除外される。
When --enable-jar-splitting is set, files that match
the list of comma separated SUFFIXES will be excluded
from all jars.
--retain_upload_dir
GAEリモート環境へのアップロード時に使用した一時ディレクトリを残す。
Do not delete temporary directory used in uploading.
--compile_encoding
JSPをコンパイルするときに使用する文字エンコーディングの指定
The character encoding to use when compiling JSPs.
-n NUM_DAYS, --num_days=NUM_DAYS
ログデータを入手する日数の指定。カットオフ・ポイントは、UTCで12時
である。できるだけ全てのログを得る場合は 0 を指定する。デフォルト
値は 1 である。
Number of days worth of log data to get. The cut-off
point is midnight UTC. Use 0 to get all available
logs. Default is 1.
--severity=SEVERITY ? アプリレベルログメッセージのシビア度の指定。範囲は 0
(DEBUG) から 4 (CRITICAL)である。
Severity of app-level log messages to get. The range
is 0 (DEBUG) through 4 (CRITICAL). If omitted, only
request logs are returned.
-a, --append          既存のファイルに追記する。
-n NUM_RUNS, --num_runs=NUM_RUNS
スケジュールされた計算するための実行時間の数
Number of scheduled execution times to compute




例:



D:\Program Files\ruby-1.8\usr\local\sinatra_test>appcfg.rb --help
D:/Program Files/ruby-1.8/lib/ruby/gems/1.8/gems/appengine-tools-0.0.15/lib/appe
ngine-tools/appcfg.rb:51: warning: `*' interpreted as argument prefix
D:/Program Files/ruby-1.8/lib/ruby/gems/1.8/gems/appengine-tools-0.0.15/lib/appe
ngine-tools/boot.rb:50: warning: `*' interpreted as argument prefix

usage: D:/PROGRA~1/ruby-1.8/bin/appcfg.rb [options] <action> <app-dir> [<output-
file>]

Action must be one of:
help: Print help for a specific action.
request_logs: Write request logs in Apache common log format.
rollback: Rollback an in-progress update.
update: Create or update an app version.
update_indexes: Update application indexes.
update_cron: Update application cron jobs.
update_queues: Update application task queue definitions.
update_dos: Update application DoS protection configuration.
version: Prints version information.
cron_info: Displays times for the next several runs of each cron job.
run: run jruby in your application environment.
bundle: package your application for deployment.
The 'run' command assumes the app directory is the current directory.
Use 'help <action>' for a detailed description.

options:
-h, --help ? ? ? ? ? ?Show the help message and exit.
-s SERVER, --server=SERVER
? ? ? ? ? ? ? ? ? ? ? The server to connect to.
-e EMAIL, --email=EMAIL
? ? ? ? ? ? ? ? ? ? ? The username to use. Will prompt if omitted.
-H HOST, --host=HOST ?Overrides the Host header sent with all RPCs.
-p PROXYHOST[:PORT], --proxy=PROXYHOST[:PORT]
? ? ? ? ? ? ? ? ? ? ? Proxies requests through the given proxy server.
? ? ? ? ? ? ? ? ? ? ? If --proxy_https is also set, only HTTP will be
? ? ? ? ? ? ? ? ? ? ? proxied here, otherwise both HTTP and HTTPS will.
--proxy_https=PROXYHOST[:PORT]
? ? ? ? ? ? ? ? ? ? ? Proxies HTTPS requests through the given proxy server.
--sdk_root=root ? ? ? Overrides where the SDK is located.
--passin ? ? ? ? ? ? ?Always read the login password from stdin.
--insecure ? ? ? ? ? ?Do not use HTTPS to communicate with the Admin Console.
--enable_jar_splitting
? ? ? ? ? ? ? ? ? ? ? Split large jar files (> 10M) into smaller fragments.
--jar_splitting_excludes=SUFFIXES
? ? ? ? ? ? ? ? ? ? ? When --enable-jar-splitting is set, files that match
? ? ? ? ? ? ? ? ? ? ? the list of comma separated SUFFIXES will be excluded
? ? ? ? ? ? ? ? ? ? ? from all jars.
--retain_upload_dir
? ? ? ? ? ? ? ? ? ? ? Do not delete temporary directory used in uploading.
--compile_encoding
? ? ? ? ? ? ? ? ? ? ? The character encoding to use when compiling JSPs.
-n NUM_DAYS, --num_days=NUM_DAYS
? ? ? ? ? ? ? ? ? ? ? Number of days worth of log data to get. The cut-off
? ? ? ? ? ? ? ? ? ? ? point is midnight UTC. Use 0 to get all available
? ? ? ? ? ? ? ? ? ? ? logs. Default is 1.
--severity=SEVERITY ? Severity of app-level log messages to get. The range
? ? ? ? ? ? ? ? ? ? ? is 0 (DEBUG) through 4 (CRITICAL). If omitted, only
? ? ? ? ? ? ? ? ? ? ? request logs are returned.
-a, --append ? ? ? ? ?Append to existing file.
-n NUM_RUNS, --num_runs=NUM_RUNS
? ? ? ? ? ? ? ? ? ? ? Number of scheduled execution times to compute




■TODO




  • gem について

  • App Engine の設定項目について

  • GAE Ruby で使用されているRuby FWについて






2010年10月7日木曜日

Ruby関連 HTML/Webスクレイピング・ライブラリ・レビュー

HTML/Webのスクレイピング処理の観点から、有名どころのRubyのライブラリについて、現状(2010年10月時点)を調査した。調査項目は凡例に示すとおりである。ライブラリの比較・選定に際して、判断のひとつの材料として資することを、期待している。

なにかご意見がありましたら、お気軽にコメントをどうぞ。
2014-05-06追記: 新しいのはこちら→2014年版



■凡例



  • ■の次に、ライブラリ名 (現時点(2010年)でのバージョン)を記す

  • desc に、ライブラリの目的・機能仕様などの説明を記す

  • update に、ライブラリの更新期間を記す。ここで、yyyy-と記されている場合、yyyy年から現時点でも更新されていることを表す

  • url には、ライブラリのHPを記す。特にない場合、また情報が不足している場合は、補うに足るurl(ソースコードのurl)を追記している

  • ライセンスには、配布条件等のライセンスを記す

  • ソースコードには、ライブラリの格納場所のurlを記す

  • インストールには、ライブラリのインストール方法を記す

  • コメントには、補足の情報、私見などを記す

■Hpricot (0.8.2)


desc:
Hpricot は、非常に柔軟なHTMLパーサーで、田中 哲(TANAKA, Akira)の
HTree とジョン・レッシグ(John Lessig)の jQuery に基づいている。しかし、
コード・スキャナは、C でコーディングし直された。

update:
2006-


ライセンス:
MIT License (see http://github.com/hpricot/hpricot/blob/master/COPYING )


rubyforge:
N/A

インストール:
gem install hpricot

コメント
多くの派生ライブラリを持つHTMLパーサー。webスクレイピングにも使うこと
ができる。
以前の公式サイト(http://code.whytheluckystiff.net/hpricot/)は、リン
ク切れである。

田中 哲氏のhtreeは、 http://www.a-k-r.org/index.html からたどることがで
きる。

■Mechanize (1.0.0)


desc:
Mechanizeライブラリは、webサイト間のやり取りを自動化するために
使用される。Mechanizeは、自動でクッキーを格納して送信、リダイレクトを
フォローし、リンクをたどったり、フォームをサブミットsubmitできる。フォーム・フィ
ールドは増やしたり、サブミットできる。また、履歴となった訪れたサイトを
調査する。

update:
2005-



ソースコード:
github:
http://github.com/tenderlove/mechanize


インストール:
gem install mechanize

コメント:
Andy LesterによるPerlの同名のライブラリ:Mechanize の強い影響のもとに開
発された。webスクレイピングのためのライブラリである。
ruby 1.8.6 と nokogiri に依存している。

インストール時に、エラーが発生するという報告がWeb上に散見される。この場合、gemとRailsの更新等が事前に必要とのこと。
※追記2010/12/7:バージョン1.0.0では、Hpricotではなく、Nokogiriを使用するようになっているようだ。

■ScrAPI toolkit for Ruby (1.2.0)


desc:
CSSセレクタと選択 => 抽出 => 格納 処理ルールを使ったスクレイパーを書く
ためのフレームワーク。

update:
2006-2008



ソースコード:
github:
http://github.com/assaf/scrapi


install:
gem install scrapi

コメント:
少し情報が古い(2007年)が、このような意見もあった:“Web scraping in
Ruby: why I had to use scrAPI instead of WWW::Mechanize and Hpricot”
http://blog.bigsmoke.us/2007/05/02/scrapi-wins-over-mechanize-and-hpricot-for-web-scraping-in-ruby

開発は、止まっているようだ。

■scRUBYt! (0.4.06)


desc:
scRUBYt! は、Rubyで記述された、シンプルだがパワフルなwebスクレイピング・
ツールキットである。目的は、webページ・クローリング、HTMLタグ・属性・
XPath・フォーム名のルック・アップ処理の超めんどくささ、また、その他Web
ページまたはFirebugから直接コピペしたようなサンプルからこれらを理解
するような、典型的な低レベルなwebスクレイピングから、あなたをフリーに
することである。

update:
2007-



ソースコード:
github:
http://github.com/scrubber/scrubyt


インストール:
gem install hpricot
gem install mechanize
gem install scrubyt

コメント:
hpricot と mechanize (選択的に、AJAXのスクレイピングにFireWtir)に依存
している。

■nokogiri (1.4.3.1)


desc:
Nokogiri は、libxmlラッパーである。Nokogiri は、XPathやCSSの検索のため
のインタフェースを持ち、また、HTML, XML, SAX, そしてReaderパーサーの機
能がある。Nokogiri は、Hpricotの寄り道リプレイスメントでもある。

update:
2008-


ライセンス:
The MIT License (via http://nokogiri.org/ )

ソースコード:
github:
http://github.com/tenderlove/nokogiri/


インストール:
gem install nokogiri

コメント:
この中で、一番包括的な機能を持つパーサー。もちろん、webスクレイピングに
も使うことができる。