XREA の SSH登録 のスクリプト

レンタルサーバXREASSH を使う場合、事前に XREAの管理ページ
から ホスト情報登録が必要。登録すると、30日間 同一IPアドレスからの
接続が許可される。登録は上書きされるらしく、1つの IPアドレスからの
SSH接続しか許可されない。

毎回 XREAの管理ページから登録するのは面倒なので 自動化する。

Ruby の WWW::Mechanize を使えば簡単かもしれないが、XREArubygems
はインストールされてない。(XREArubygemsコンパイルは後日。
また、XREAruby のバージョンも1.8.5 と古いので、これも後でコンパイル)

wget で アクセス

xrea(coreserver) SSHホスト登録スクリプト - Kerosoft : Modus Operandi を読むと wget を使って登録している。
ページを巡ることなく一発で操作出来る状況なら wget に越したことはない。

  $ wget \
    -O - \
    --post-data="id=○○○&pass=○○○&remote_host=○○○&ssh2=on" \
    http://www.s○○.xrea.com/jp/admin.cgi

成功。

次に SSL対応されているので SSL経由でのアクセスを試みる。

SSL経由でアクセス

「サイト作成」の FAQ - はやわかり XREA & CORESERVER
XREASSL対応URI の規則が説明されている。

  $ wget \
    -O - \
    --post-data="id=○○○&pass=○○○&remote_host=○○○&ssh2=on" \
    https://ss2.xrea.com/www.s○○.xrea.com/jp/admin.cgi

失敗。

ss2.xrea.com に安全の確認をしないで接続するには、`--no-check-certificate' を使ってください。

とのこと。

  $ wget \
    -O - \
    --post-data="id=○○○&pass=○○○&remote_host=○○○&ssh2=on" \
    --no-check-certificate \
    https://ss2.xrea.com/www.s○○.xrea.com/jp/admin.cgi

たしかに登録できたが、これでは SSL経由をする意味が無い。


2007/04/18-06、wget、証明書の検証エラー - debian-etch に関するメモ(後、lennyへアップグレード)
を読むと、CAの認証局情報がインストールされていないと、証明書によっては
検証出来ないらしい。


https://ss2.xrea.com/www.s○○.xrea.com/jp/admin.cgi の証明書情報を
Firefox の鍵マークをクリックして読む。Equifax Secure Global eBusiness CA-1
が CA らしい。Vine 4.2 を使っているので /usr/share/ssl/cert.pem を読む
が Equifax Secure Global eBusiness CA-1 は含まれていない。

上記のサイトでは apt から ca-certificates を インストールしているが、
Vine には ca-certificatesパッケージはない。更に、XREA上から スクリプト
を動かしたいので、証明書を自分で保持し オプションで指定する方法を採る。

SSL サーバー証明書 | CPSとルート証明書 No_01 から Equifax Secure Global eBusiness CA-1 をダウンロード。

  $ wget \
    -O - \
    --post-data="id=○○○&pass=○○○&remote_host=○○○&ssh2=on" \
    --ca-certificate=Equifax_Secure_Global_eBusiness_CA-1.cer \
    https://ss2.xrea.com/www.s○○.xrea.com/jp/admin.cgi

成功。

Nokogiri で encoding error

以下のファイルを Nokogiri で解析させるとエラー。

  • demo-1.html
<?xml version="1.0" encoding="euc-jp"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="ja" xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
<head>
<meta name="keywords" content="ロ" />
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP" />
</head>
<body>
テスト
</body>
</html>
  • ex-1.rb
require 'rubygems'
require 'nokogiri'
require 'open-uri'

doc = Nokogiri(open(ARGV[0]))
puts doc.to_html

実行

$ ruby ex-1.rb demo-1.html |iconv -f euc-jp -t utf-8
encoding error : output conversion failed due to conv error, bytes 0x95 0x24 0xC8 0x26
I/O error : encoder error

http://d.hatena.ne.jp/kitamomonga/20100712/ruby_mechanize_loses_to_euc_html_tips
を読むと、meta charset の前にマルチバイト文字(特定の文字。上の例では
meta keywords に カタカナの"ロ")が 書かれている場合に起きる。

demo-1.html を、charset の後にマルチバイト文字が来るように書き換えると

  • demo-2.html(抜粋)
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP" />
<meta name="keywords" content="ロ" />
</head>

実行

$ ruby ex-1.rb demo-2.html |iconv -f euc-jp -t utf-8
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<?xml version="1.0" encoding="euc-jp"?><html lang="ja" xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
<meta name="keywords" content="">
</head>
<body>
テスト
</body>
</html>

無事 出力される。

とは言え、世に公開されている膨大な HTML を手動で書き換えるわけには
いかないので、プログラムで対処する。

  • ex-2.rb
require 'rubygems'
require 'nokogiri'
require 'open-uri'

require 'kconv'

str = open(ARGV[0]).read

noko_en_id = {
  Kconv::UTF8 => 'UTF-8',
  Kconv::EUC => 'EUC-JP',
  Kconv::SJIS => 'SHIFT-JIS',
  Kconv::ASCII => 'ASCII',
  Kconv::JIS => 'ISO-2022-JP',
#   Kconv::UTF16 => ,
#   Kconv::UNKNOWN => ,
}[Kconv.guess(str)] || raise

doc = Nokogiri::HTML.parse(str, nil, noko_en_id)
puts doc.to_html

実行

$ ruby ex-2.rb demo-1.html |iconv -f euc-jp -t utf-8
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<?xml version="1.0" encoding="euc-jp"?><html lang="ja" xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
<head>
<meta name="keywords" content="">
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
</head>
<body>
テスト
</body>
</html>

無事出力される。二度手間感は否めないが

Nokogiri の encoding をどのような文字列で指定すれば良いか?

Nokogiri で

Nokogiri::HTML.parse(open(url)[, url[, encoding]])

等と 文字コードを指定したい場合 文字列で指定するわけだが、
どのような文字列を使えば良いのか?

ソースを読むと、Nokogiri::HTML::Document.read_memory で LibXMLを
呼び出している。それ以上はソースを追いかけるより LibXML を調べた
方が良さそう。結局 LibXML の仕様によるのだろうが(たぶん 寛大に
受け付けているとは思うが)、一応 Nokogiri 的には どのような指定が
適切か調べる。

Emacs の rgrep で調べて Nokogiri::XML::SAX::Parser::ENCODINGS を発見。

$ ruby -rpp -e "require 'rubygems'; require 'nokogiri'; pp Nokogiri::XML::SAX::Parser::ENCODINGS"
{"ISO-8859-5"=>14,
 "UCS4-3412"=>8,
 "UTF-8"=>1,
 "ISO-8859-6"=>15,
 "ISO-8859-7"=>16,
 "ISO-8859-8"=>17,
 "EUC-JP"=>21,
 "ISO-8859-9"=>18,
 "UCS2"=>9,
 "NONE"=>0,
 "ISO-2022-JP"=>19,
 "EBCDIC"=>6,
 "ISO-8859-1"=>10,
 "ASCII"=>22,
 "ISO-8859-2"=>11,
 "UTF16BE"=>3,
 "SHIFT-JIS"=>20,
 "ISO-8859-3"=>12,
 "UCS4BE"=>5,
 "UTF16LE"=>2,
 "ISO-8859-4"=>13,
 "UCS4-2143"=>7,
 "UCS4LE"=>4}

とりあえず "UTF-8", "EUC-JP", "SHIFT-JIS" 等を使えば 問題なさそうだ。

Nokogiri のインストール

普段 サイトの解析をする際、 Hpricot や REXML を使っている。
しかし、REXML で XPath の処理を行うと非常に重い。(ロケーションパスを
"//word" 等と指定した場合が非常に重い)

Ruby XML Performance Shootout: Nokogiri vs LibXML vs Hpricot vs REXML
によると、Nokogiri が かなり解析が早いらしい。

そもそも、何故今まで Nokogiri を使わなかったかというと、rubygems
重いからだった。(Hpricot は ソースからインストールしたような・・
古い記憶だ。それと rubygems でも Mechanize は使っている。(結局 Nokorigi
を使っているのだが。だから今回 アンインストール -> インストール を行う))

しかし、rubygems が重かったのは 1.1.1 の頃で、今 入れている 1.3.6 は
さして重くない。というわけで、Nokogiri をインストールする。

libxml2 の最新版のインストール

http://d.hatena.ne.jp/kitamomonga/20090614/ruby_nokogiri_behavior_differs_in_libxml2_version
を読むと、libxml2 のバージョンによって Nokogiri の挙動が変わるらしい。
というわけで libxml2 の最新版をインストールする。

$ wget ftp://xmlsoft.org/libxml2/LATEST_LIBXML2
$ tar zxvf LATEST_LIBXML2 
$ cd libxml2-2.7.7/
$ ./configure --prefix=$VMDIR_PATH/usr/local
$ make
$ make install

(環境変数 VMDIR_PATH は 適当なディレクトリ)
コンパイルに 30分以上かかった。このスペックじゃなあ、、、

libxslt の最新版のインストール

ついでに libxslt の最新版もインストールする。

$ wget ftp://xmlsoft.org/libxml2/LATEST_LIBXSLT
$ tar zxvf LATEST_LIBXSLT 
$ cd libxslt-1.1.26/
$ ./configure --prefix=$VMDIR_PATH/usr/local \
--with-libxml-prefix=$VMDIR_PATH/usr/local
$ make
$ make install

--with-libxml-prefix は、上記でインストールした libxml2 のディレクトリを指定。

Nokogiri を rubygems でインストール

本当は rip から Nokogiri をインストールしたいのだが、rip に gem の
オプションを渡す方法が分からない。http://hellorip.com/
"rip2 coming soon" なんて閉まってるし。(rip2 では rip-shell など
コマンド群を rip-* 形式にするらしいが) rip のソースを読むのは優先度が
低いし。(とはいっても ripのクラスを使って ちょこちょこプログラムを
作ったりはしている)

よって rubygems でインストール。

より

$ gem install nokogiri -- \
--with-xml2-include=$VMDIR_PATH/usr/local/include/libxml2 \
--with-xml2-lib=$VMDIR_PATH/usr/local/lib \
--with-xslt-include=$VMDIR_PATH/usr/local/include/libxslt \
--with-xslt-lib=$VMDIR_PATH/usr/local/lib

確認。

$ ruby -e "require 'rubygems'; require 'nokogiri'; p Nokogiri::VERSION_INFO"
{"warnings"=>[], "ruby"=>{"engine"=>"mri", "version"=>"1.8.7", "platform"=>"i686-linux"}, "libxml"=>{"loaded"=>"2.7.7", "binding"=>"extension", "compiled"=>"2.7.7"}, "nokogiri"=>"1.4.3.1"}

無事インストールできた。

繋がった

やっとで インターネットに繋がった。田舎に帰ってから電話を契約したり
ADSLの引越し手続きをやったりで えらい時間が経ってしまった。

何でもネット越しで行っていると、いざネットが繋がらない状況で非常に
困る。せめて、ドキュメントなりマニュアルは手元に置いといた方が
いいなあ

MPlayer の再生時、映像だけ早送りされてしまう

MPlayerflash の再生時、映像だけ早送りされてしまうファイルが
結構ある。調べると
http://pc12.2ch.net/test/read.cgi/software/1200671248/
-correct-pts を指定すれば良いと書かれている。

$ mplayer -vo x11 -correct-pts file1.flv

無事、映像と音声が同じ早さで再生された。


MPlayer をビルド(Vine では MPlayerSRPM でしか提供されて
なかったような)した日付は

$ rpm -qif `which mplayer`
## 抜粋
Release     : 2.rc2vl4                      Build Date: 20080514095407秒
Install Date: 20080514095511秒      Build Host: localhost.localdomain
Group       : Applications/Multimedia       Source RPM: mplayer-1.0-2.rc2vl4.src.rpm

確かに古い。このスペック だと 長いコンパイルをしたくないんだよな。
(Emacs や Git とかたまにやるけど)

コンピューターのスペック

2011/05 〜 現在

$ cat /proc/cpuinfo
## デュアルコア
## 抜粋
processor       : 0
model name      : Intel(R) Celeron(R) CPU        E3400  @ 2.60GHz
cpu MHz         : 2603.000
cache size      : 1024 KB

processor       : 1
model name      : Intel(R) Celeron(R) CPU        E3400  @ 2.60GHz
cpu MHz         : 2603.000
cache size      : 1024 KB

$ cat /proc/meminfo
## 抜粋
MemTotal:        2025424 kB

〜 2011/04

$ cat /proc/cpuinfo
## 抜粋
model name	: Pentium III (Katmai)
cpu MHz		: 551.310
cache size	: 512 KB

$ cat /proc/meminfo
## 抜粋
MemTotal:       384600 kB

2010/07/18 現在で CPU が 550MHz、メモリが 384M(128M * 3)B。
相当低スペックだろう。しかもサブとかではなくこの1台しかない。

コンピューターを買う位なら クツを買う。金がないため、底を
テープで固定しているし。それで肉体労働をやっている。

奴隷は哀しい。