XREA の SSH登録 のスクリプト
レンタルサーバー XREA で SSH を使う場合、事前に XREAの管理ページ
から ホスト情報登録が必要。登録すると、30日間 同一IPアドレスからの
接続が許可される。登録は上書きされるらしく、1つの IPアドレスからの
SSH接続しか許可されない。
毎回 XREAの管理ページから登録するのは面倒なので 自動化する。
Ruby の WWW::Mechanize を使えば簡単かもしれないが、XREA に rubygems
はインストールされてない。(XREA で rubygems のコンパイルは後日。
また、XREA の ruby のバージョンも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経由でアクセス
「サイト作成」の FAQ - はやわかり XREA & CORESERVER
に XREA の SSL対応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}
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 でインストール。
- http://nokogiri.org/tutorials/installing_nokogiri.html
- http://d.hatena.ne.jp/kitamomonga/20100223/ruby_nokogiri_install_with_any_libxml2_path
より
$ 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"}
無事インストールできた。
MPlayer の再生時、映像だけ早送りされてしまう
MPlayer で flash の再生時、映像だけ早送りされてしまうファイルが
結構ある。調べると
http://pc12.2ch.net/test/read.cgi/software/1200671248/ に
-correct-pts を指定すれば良いと書かれている。
$ mplayer -vo x11 -correct-pts file1.flv
無事、映像と音声が同じ早さで再生された。
MPlayer をビルド(Vine では MPlayer は SRPM でしか提供されて
なかったような)した日付は
$ rpm -qif `which mplayer` ## 抜粋 Release : 2.rc2vl4 Build Date: 2008年05月14日 09時54分07秒 Install Date: 2008年05月14日 09時55分11秒 Build Host: localhost.localdomain Group : Applications/Multimedia Source RPM: mplayer-1.0-2.rc2vl4.src.rpm
コンピューターのスペック
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台しかない。
コンピューターを買う位なら クツを買う。金がないため、底を
テープで固定しているし。それで肉体労働をやっている。
奴隷は哀しい。