〜2014年2月下旬〜
cygwinでもsshで多重接続してみたらなぜかエラーになるので調べたら、
なんかいろいろと未実装ということらしい。
Corinna Vinschen - Re: Can not make port forwarding from Cygwin when ControlMaster/ControlP
残念。
今までは
javascript:location.href='http://www.amazon.co.jp/dp/'+document.getElementById("ASIN").value;
というbookmarkletを使っていたが、どうも最近これだと変換されないときがあって調べてみると、
確かにid="ASIN"がない場合があった。ないときはname="ASIN.0"があるようなので
javascript:location.href='http://www.amazon.co.jp/dp/'+(document.getElementById("ASIN")||document.getElementsByName("ASIN.0")[0]).value;
でお茶を濁すことにした。
まあ、URLからASINを抜き出せばいいんだろうけど、いろいろなパターンがありそうで。
zshのhistory fileは日本語が化けるが、
historyコマンドを実行した結果は化けてない。
ということは内部でなにか変換してるわけでソースで確認してみると、
metafy/unmetafyという処理をしていた。
metafyはメタなバイトがあったら"\x83"を挿入して、^32する感じだ。
unmetafyはその逆の処理なので"\x83"があったらそれは消してその次のバイトを^32する。
mod_export char * unmetafy(char *s, int *len) { char *p, *t; for (p = s; *p && *p != Meta; p++); for (t = p; (*t = *p++);) if (*t++ == Meta) t[-1] = *p++ ^ 32; if (len) *len = t - s; return s; }
Metaが0x83。これをRubyで書くと
str.gsub(/\x83(.)/n){($1.ord^32).chr}
ってことだ。実際にやってみる。
% HISTFILE=$PWD/zsh_history % HISTSIZE=3 % echo あいうえお あいうえお % echo 今、咲き誇る花たちよ 今、咲き誇る花たちよ
とここで違う端末で実行。
% od -tx1z zsh_history 0000000 3a 20 31 33 39 33 31 36 39 39 38 30 3a 30 3b 48 >: 1393169980:0;H< 0000020 49 53 54 53 49 5a 45 3d 33 0a 3a 20 31 33 39 33 >ISTSIZE=3.: 1393< 0000040 31 36 39 39 39 30 3a 30 3b 65 63 68 6f 20 e3 81 >169990:0;echo ..< 0000060 82 e3 81 83 a4 e3 81 83 a6 e3 81 83 a8 e3 81 83 >................< 0000100 aa 0a 3a 20 31 33 39 33 31 37 30 30 31 34 3a 30 >..: 1393170014:0< 0000120 3b 65 63 68 6f 20 e4 bb 83 aa e3 80 81 e5 83 b2 >;echo ..........< 0000140 b2 e3 81 83 ad e8 aa 83 a7 e3 82 83 ab e8 83 aa >................< 0000160 b1 e3 81 9f e3 81 a1 e3 82 83 a8 0a >............< 0000174 % ruby -e 'puts File.binread("zsh_history").gsub(/\x83(.)/n){($1.ord^32).chr}' : 1393169980:0;HISTSIZE=3 : 1393169990:0;echo あいうえお : 1393170014:0;echo 今、咲き誇る花たちよ
おお、ちゃんと表示された。確かに83がいっぱいある。
なかなか楽しいツールだ。
各コマンドはUnixでお馴染の名前がついているので大体挙動は予想できる。
たとえばこの日記のRSSで試すと、
% xml-ls ~/jarp/diary/index.rdf <?xml version="1.0"?> <root> <rdf:RDF> <channel/> <image/> <item/> <item/> <item/> <item/> <item/> </rdf:RDF> </root> % xml-ls -a ~/jarp/diary/index.rdf ://item <?xml version="1.0"?> <root> <item rdf:about="http://jar..."> <title/> <link/> <description/> <content:encoded/> <dc:creator/> <dc:date/> </item> <item rdf:about="http://jar..."> <title/> <link/> <description/> <content:encoded/> <dc:creator/> <dc:date/> </item> <item rdf:about="http://jar..."> <title/> <link/> <description/> <content:encoded/> <dc:creator/> <dc:date/> </item> <item rdf:about="http://jar..."> <title/> <link/> <description/> <content:encoded/> <dc:creator/> <dc:date/> </item> <item rdf:about="http://jar..."> <title/> <link/> <description/> <content:encoded/> <dc:creator/> <dc:date/> </item> </root> % xml-ls ~/jarp/diary/index.rdf ://item/title <?xml version="1.0"?> <root> <title> zshのhistory fileの文字化けをなんとか��... </title> <title> AmazonのURLを単純に </title> <title> sudoersのcommentとdirectiveの罠 </title> <title> qmv </title> <title> 要素の検証での小技 </title> </root> % xml-printf "%s\n" ~/jarp/diary/index.rdf ://item/title zshのhistory fileの文字化けをなんとかする話 AmazonのURLを単純に sudoersのcommentとdirectiveの罠 qmv 要素の検証での小技 % xml-printf "%s\n" ~/jarp/diary/index.rdf ://dc:date 2014-02-24T00:48:25.487316+09:00 2014-02-23T02:30:53.641529+09:00 2014-02-21T03:06:19.9101+09:00 2014-02-20T01:36:25.721897+09:00 2014-02-18T00:29:35.515853+09:00 % xml-printf "%s\n" ~/jarp/diary/index.rdf ://title Just another Ruby porter, Just another Ruby porter, zshのhistory fileの文字化けをなんとかする話 AmazonのURLを単純に sudoersのcommentとdirectiveの罠 qmv 要素の検証での小技 % xml-printf "%s\n" ~/jarp/diary/index.rdf ://channel/title Just another Ruby porter,
とこんな感じで抜き出すことができる。
xml-sedはtextしか相手にしないとか、XPATHで場所指定できるとかいろいろ考えられている。
文字化けに関するタイトルが文字化けしちゃってるのは御愛嬌だが、まあ、許容範囲かな。
xmllint --xpathでもできるがこっちはnamespaceとか厳格すぎて使いづらい。
HTMLそのものだとさすがに処理できないが、xml-fixtags --htmlで無理矢理XMLへ変換できる。
運がよければ。tenki.jpとかnews.livedoor.comはだめだった。なんか特定のjavascriptに秘孔を突かれてる感じだ。
Yahooトピックスに対してやってみたら、該当するXPathを見つけるのが大変だった。
延々とxml-lsでtable,tdを打つはめに。
% curl -s www.yahoo.co.jp | xml-fixtags --html | xml-printf "%s\n" ':/html/body/center/table/td/table/td/table/td/table[3]/td' 23時9分更新 ・日米首脳が応酬 亀裂の真相 ・NHK会長 異例の再注意受ける ・3歳長男に犬の首輪 父を逮捕 ・21人死亡 全国で「殺人ダニ」 ・ビットコイン Mt.Gox取引不能 ・ACLフォルラン出場 柿谷弾も ・15歳平野 キッズに夢を与えた ・岡村怒り? 天野結婚は裏切り 最近の話題記事一覧
最初と最後がじゃまならsed '1d;$d'あたりで。
convertで2値画像を01で表示させたくてpbm:と指定するんだけど、
これだとP4(binary)になってしまう。P1にするには-compress noneをつければいいらしい。
% convert 20140225010618.gif pbm: | od -tx1z 0000000 50 34 0a 38 34 20 31 39 0a 00 00 20 00 00 38 00 >P4.84 19... ..8.< 0000020 00 00 40 00 00 00 50 00 00 6e 00 00 00 a0 00 00 >..@...P..n......< 0000040 00 50 00 00 c2 00 00 00 a0 00 00 c0 50 00 e0 83 >.P..........P...< 0000060 01 c6 00 a0 00 00 80 50 01 f1 81 03 e2 00 a0 00 >.......P........< 0000100 01 80 7c 03 73 ff c6 e3 00 f8 00 01 00 8a 02 61 >..|.s..........a< 0000120 01 04 c1 01 14 00 03 00 ab 00 01 01 00 01 81 56 >...............V< 0000140 00 03 00 b5 00 01 03 00 01 81 6a 00 03 01 1b 00 >..........j.....< 0000160 01 fe 00 01 82 36 00 03 00 96 00 00 8c 00 01 81 >.....6..........< 0000200 2c 00 03 00 92 00 00 86 00 01 81 24 00 03 00 44 >,..........$...D< 0000220 00 00 c2 00 01 80 88 00 03 00 7c 00 00 76 00 01 >..........|..v..< 0000240 80 f8 00 01 00 82 00 00 1c 00 01 01 04 00 01 80 >................< 0000260 7c 00 00 00 00 03 00 f8 00 00 80 00 00 00 7e 00 >|.............~.< 0000300 02 00 00 00 00 c0 00 00 00 00 00 06 00 00 00 00 >................< 0000320 00 00 00 00 7e 00 00 00 00 00 >....~.....< 0000332 % convert 20140225010618.gif -compress none pbm: P1 84 19 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 1 0 1 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
これだとなんだかわからないが、ちょっといじってやると見易くなる。
% convert 20140225010618.gif -compress none pbm: | sed 1,2d | xargs -n84 | tr -d ' ' | tr 01 ' #' # ### # # # ## ### # # # # ## # # # ## # # ### # ## ### ## # # # # # ##### ## # ##### # # # ## ##### ## ### ############ ## ### ## ##### # # # # # ## # # # ## # # # # ## # # # ## # # ## # # # ## ## # ## # # # ## ## # ## # # ## # ## ## ######## ## # ## ## ## # # ## # ## ## # # ## ## # # # # ## ## # # # ## # # ## # ## # # ## ##### ### ## ## ##### # # # ### # # # ## ##### ## ##### # ###### # ## ## ######
話を聞くと最新のgrepじゃなくても再現できそうなのでやってみる。
まとめると-i fooは[Ff][Oo][Oo]のような正規表現に置き換えると-iよりは10倍速くなるが、
euc-jpのような環境では逆に200倍遅くなってしまうことらしい。
まずは適当にでかいログを用意。/var/logを覗くとauth.log.1がでかめだったのこれを使う。
とはいえこれでも1Mほどしかないので10倍にと思ったが手違いで11倍になってしまった。
% cd /var/log % ls -l auth.log.1 -rw-r----- 1 syslog adm 1064355 2014-02-23 08:06:04 auth.log.1 % cat auth.log.1{,,,,,,,,,,} > /tmp/big.log % ls -oh /tmp/big.log -rw-r--r-- 1 eban 12M 2014-02-27 10:30:38 /tmp/big.log % wc -l /tmp/big.log | numfmt --grouping 127,259 /tmp/big.log
12MBで13万行弱。LANGはja_JP.UTF-8。grepはubuntuのをそのまま使う。
% grep --version grep (GNU grep) 2.14 Copyright (C) 2012 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Written by Mike Haertel and others, see <http://git.sv.gnu.org/cgit/grep.git/tree/AUTHORS>.
まずは普通に。ヒットしても鬱陶しいので存在しないfooで検索。
% time grep foo /tmp/big.log grep foo /tmp/big.log 0.00s user 0.02s system 74% cpu 0.027 total
まあ、一瞬だ。つぎに-iオプション。
% time grep -i foo /tmp/big.log grep -i foo /tmp/big.log 1.99s user 0.04s system 93% cpu 2.168 total
結構時間がかかる。2秒を越えた。次は文字クラスで。
% time grep '[Ff][Oo][Oo]' /tmp/big.log grep '[Ff][Oo][Oo]' /tmp/big.log 0.03s user 0.00s system 88% cpu 0.041 total % echo $[2.168 / 0.041] 52.878048780487809
ほぼオプションなしと同じオーダー。これがGNU grep 2.17での10倍速くなるという変更内容。
10倍どころか50倍以上速くなった。
次にeuc-jpな環境で。ないので作る。
% echo 'ja_JP.EUC-JP EUC-JP' | sudo tee -a /var/lib/locales/supported.d/local ja_JP.EUC-JP EUC-JP % sudo locale-gen % locale -a | grep ja ja_JP.eucjp ja_JP.utf8
これで準備ok。やってみる。
% time LANG=ja_JP.eucJP grep foo /tmp/big.log LANG=ja_JP.eucJP grep foo /tmp/big.log 0.01s user 0.02s system 88% cpu 0.027 total % time LANG=ja_JP.eucJP grep -i foo /tmp/big.log LANG=ja_JP.eucJP grep -i foo /tmp/big.log 2.15s user 0.02s system 89% cpu 2.423 total % time LANG=ja_JP.eucJP grep '[Ff][Oo][Oo]' /tmp/big.log LANG=ja_JP.eucJP grep '[Ff][Oo][Oo]' /tmp/big.log 167.61s user 0.32s system 96% cpu 2:54.26 total % echo $[174.26 / 2.423] 71.919108543128345
確かに文字クラス指定だと極端に遅くなった。3分近い。70倍以上遅い。
GNU grep 2.18ではUTF-8以外は先の変換はしなくなったというが、
なんという場当たり的な対応だ。
いつの間にか終了だが復活だかしていたらしい。その混乱で動かなくなっていた。
1年も気づかずにいるのもどうかという気もするというか、
さらに設置したまま放置しているGoogle Analyticsがあるので、
2つも要らないだろうってことでtrackfeedは削除する。
それだとまた気づかないのでメールで通知するようにしよう。