Ruby 2.2.2でHTML ParserのNokogiri(鋸)を使う

RSSを作成するための準備をする。

環境

ローカルマシンにNokogiriをインストールする

Rubyをダウンロードする。
$ cd $HOME/src
$ wget http://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.2.tar.gz
$ tar xvf ruby-2.2.2.tar.gz

Rubyを共有ライブラリとしてビルドする。
$ cd $HOME/src/ruby-2.2.2
$ ./configure --help
  --enable-shared  build a shared library for Ruby
$ ./configure --prefix=$HOME/opt --enable-shared
$ make

Rubyをインストールする。
テストが成功してるのかどうかわからないけど続ける。
$ cd $HOME/src/ruby-2.2.2
$ make check
test succeeded
PASS all 1009 tests

KNOWNBUGS.rb PASS 0
No tests, no problem

# Running tests:

Closed file descriptor: Bug::Marshal::TestUsrMarshal#test_compat: 13
Aborted
make: *** [yes-test-all] エラー 134
$ make install
$ $HOME/opt/bin/ruby -v
ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-linux]

Nokogiriをインストールする。
zlibで失敗する。
$ cd
$ $HOME/opt/bin/gem install nokogiri
ERROR: Loading command: install (LoadError)
       cannot load such file -- zlib
ERROR: While executing gem ... (NoMethodError)
    undefined method 'invoke_with_build_args' for nil:NilClass

zlibをダウンロードする。
$ cd $HOME/src
$ wget http://zlib.net/zlib-1.2.8.tar.gz
$ tar xvf zlib-1.2.8.tar.gz

zlibをビルドする。
  configureの記述
    Normally configure builds both a static and a shared library.
$ cd $HOME/src/zlib-1.2.8
$ ./configure --prefix=$HOME/opt
$ make

zlibをインストールする。
$ cd $HOME/src/zlib-1.2.8
$ make check
$ make install

Rubyのzlib拡張ライブラリをビルドする。
  extconf.rbの記述
    dir_config 'zlib'
      これがあるから --with-TARGET-dir= でincludeとlibのあるディレクトリを指定できる。
$ cd $HOME/src/ruby-2.2.2/ext/zlib
$ $HOME/opt/bin/ruby extconf.rb --with-zlib-dir=$HOME/opt
checking for deflateReset() in -lz... yes
checking for zlib.h... yes
checking for crc32_combine() in zlib.h... yes
checking for adler32_combine() in zlib.h... yes
checking for z_crc_t in zlib.h... yes
creating Makefile
$ make

Rubyのzlib拡張ライブラリをインストールする。
$ cd $HOME/src/ruby-2.2.2/ext/zlib
$ make install

Nokogiriをインストールする。(2回目)
opensslで失敗する。
$ cd
$ $HOME/opt/bin/gem install nokogiri
ERROR: While executing gem ... (Gem::Exception)
    Unable to require openssl, install OpenSSL and rebuild ruby (preferred) or use non-HTTPS sources

opensslをダウンロードする。
$ cd $HOME/src
$ wget --no-check-certificate https://www.openssl.org/source/openssl-1.0.2a.tar.gz
$ tar xvf openssl-1.0.2a.tar.gz

opensslをビルドする。
  Configureではなくconfigを使う。
  Configureは自分でシステム種別を指定する必要がある。
  sharedオプションを付けないとRubyのopenssl拡張ライブラリをビルドしたときにエラーになる。
    linking shared-object openssl.so
    /usr/bin/ld: /home/wheezy/opt/lib/libssl.a(s2_meth.o): relocation R_X86_64_32 against '.rodata' can not be used when making a shared object; recompile with -fPIC
    /home/wheezy/opt/lib/libssl.a: could not read symbols: Bad value
  Configureの記述
    [no-]shared  [don't] try to create shared libraries when supported.
$ cd $HOME/src/openssl-1.0.2a
$ ./config --prefix=$HOME/opt shared
$ make

opensslをインストールする。
$ cd $HOME/src/openssl-1.0.2a
$ make test
$ make install

Rubyのopenssl拡張ライブラリをビルドする。
  extconf.rbの記述
    dir_config("openssl")
      これがあるから --with-TARGET-dir= でincludeとlibのあるディレクトリを指定できる。
$ cd $HOME/src/ruby-2.2.2/ext/openssl
$ $HOME/opt/bin/ruby extconf.rb --with-openssl-dir=$HOME/opt
$ make
make: *** 'ossl_pkey_dh.o' に必要なターゲット '/include/ruby.h' を make するルールがありません. 中止.

  Makefileにtop_srcdirの定義が記述されていない。
  top_dir行の下に追加する。
    top_srcdir = /home/wheezy/src/ruby-2.2.2

$ gedit Makefile
$ make clean
$ make

Rubyのopenssl拡張ライブラリをインストールする。
$ cd $HOME/src/ruby-2.2.2/ext/openssl
$ make install

Nokogiriをインストールする。(3回目)
zlibで失敗する。
$ cd
$ $HOME/opt/bin/gem install nokogiri
zlib is missing; necessary for building libxml2
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary libraries and/or headers.
Check the mkmf.log file for more details.
You may need configuration options.

zlibをインストールしたディレクトリを指定してインストールをやり直す。
$ $HOME/opt/bin/gem install nokogiri -- --with-zlib-dir=$HOME/opt
Building native extensions with: '--with-zlib-dir=/home/wheezy/opt'
This could take a while...
Successfully installed nokogiri-1.6.6.2
Parsing documentation for nokogiri-1.6.6.2
Installing ri documentation for nokogiri-1.6.6.2
Done installing documentation for nokogiri after 2 seconds
1 gem installed

Nokogiriの動作確認をする。
$ $HOME/opt/bin/irb
irb(main):001:0> require 'nokogiri'
=> true
irb(main):002:0> require 'open-uri'
=> true
irb(main):003:0> doc = Nokogiri::HTML(open("http://www.w3.org/TR/html5/"))
たくさん出る
irb(main):004:0> exit
    

さくらのレンタルサーバーにNokogiriをインストールする

環境を確認する。
% echo $SHELL
/bin/csh
% echo $HOME
/home/username

Rubyをダウンロードする。
% cd $HOME/src
% wget http://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.2.tar.gz
% tar xvf ruby-2.2.2.tar.gz

Rubyを共有ライブラリとしてビルドする。
% cd $HOME/src/ruby-2.2.2
% ./configure --help
  --enable-shared  build a shared library for Ruby
% ./configure --prefix=$HOME/opt --enable-shared
% make
vm_dump.o: In function 'procstat_vm':
/home/username/src/ruby-2.2.2/vm_dump.c:738: undefined reference to 'procstat_getvmmap'
*** [miniruby] Error code 1

Stop in /home/username/src/ruby-2.2.2

vimで2つのファイルを修正する。
https://bugs.ruby-lang.org/issues/10954
http://net-newbie.com/linux/commands/vi.html
  configure.in
  vm_dump.c

% ./configure --prefix=$HOME/opt --enable-shared
% make clean
% make

Rubyをインストールする。
テストが成功してるのかどうかわからないけど続ける。
% cd $HOME/src/ruby-2.2.2
% make check
  1) Error:
Fiddle::TestHandle#test_NEXT:
Fiddle::DLError: unknown symbol "Init_objspace"
  2) Error:
TestMkmf::TestSizeof#test_sizeof_builtin:
Errno::EACCES: Permission denied - ./conftest
    /home/username/src/ruby-2.2.2/lib/mkmf.rb:408:in 'popen'
  3) Error:
TestMkmf::TestSizeof#test_sizeof_struct:
Errno::EACCES: Permission denied - ./conftest
    /home/username/src/ruby-2.2.2/lib/mkmf.rb:408:in 'popen'
  4) Error:
TestMkmf::TestTryConstant#test_large_unsigned:
Errno::EACCES: Permission denied - ./conftest
    /home/username/src/ruby-2.2.2/lib/mkmf.rb:408:in 'popen'
  5) Error:
TestMkmf::TestTryConstant#test_long:
Errno::EACCES: Permission denied - ./conftest
    /home/username/src/ruby-2.2.2/lib/mkmf.rb:408:in 'popen'
  6) Error:
TestMkmf::TestTryConstant#test_simple:
Errno::EACCES: Permission denied - ./conftest
    /home/username/src/ruby-2.2.2/lib/mkmf.rb:408:in 'popen'
  7) Error:
TestMkmf::TestTryConstant#test_sizeof:
Errno::EACCES: Permission denied - ./conftest
    /home/username/src/ruby-2.2.2/lib/mkmf.rb:408:in 'popen'
  8) Error:
TestProcess#test_fallback_to_sh:
Errno::EACCES: Permission denied - ./tmp_script.71184
    /home/username/src/ruby-2.2.2/test/test_process.rb:1443:in 'spawn'
  9) Failure:
TestSystem#test_fallback_to_sh [/home/username/src/ruby-2.2.2/test/ruby/test_system.rb:159]:
[ruby-core:32745].
<true> expected but was
<nil>.

% make install
% $HOME/opt/bin/ruby -v
ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-freebsd9.1]

Nokogiriをインストールする。
libiconvで失敗する。
% cd
% $HOME/opt/bin/gem install nokogiri
ERROR:  Error installing nokogiri:
        ERROR: Failed to build gem native extension.

checking for iconv... no
-----
libiconv is missing.  Please locate mkmf.log to investigate how it is failing.
-----
*** extconf.rb failed ***

libiconvをダウンロードする。
% cd $HOME/src
% wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz
% tar xvf libiconv-1.14.tar.gz

libiconvをビルドする。
% cd $HOME/src/libiconv-1.14
% ./configure --help
  --enable-shared[=PKGS]  build shared libraries [default=yes]
% ./configure --prefix=$HOME/opt
% make

libiconvをインストールする。
% cd $HOME/src/libiconv-1.14
% make check
% make install

Nokogiriをインストールする。(2回目)
libiconvをインストールしたディレクトリを指定する
% cd
% $HOME/opt/bin/gem install nokogiri -- --use-system-libraries --with-iconv-dir=$HOME/opt
Building native extensions with: '--use-system-libraries --with-iconv-dir=/home/username/opt'
This could take a while...
Successfully installed nokogiri-1.6.6.2
Parsing documentation for nokogiri-1.6.6.2
Installing ri documentation for nokogiri-1.6.6.2
Done installing documentation for nokogiri after 5 seconds
1 gem installed

Nokogiriの動作確認をする。
% $HOME/opt/bin/irb
irb(main):001:0> require 'nokogiri'
=> true
irb(main):002:0> require 'open-uri'
=> true
irb(main):003:0> doc = Nokogiri::HTML(open("http://www.w3.org/TR/html5/"))
たくさん出る
irb(main):004:0> exit
    

関連情報

2015, AfternoonTea