どさにっき 2.0 〜2006年11月中旬〜

by やまや
<< = >>

2006年11月11日(土)

hotmail の HELO 制限

_ hotmail はこちらの逆引きホスト名を正直に HELO で名乗るとアクセス拒否してくれるようだ。

_ 正直に名乗った場合。

% telnet mx1.hotmail.com 25
Trying 65.54.244.136...
Connected to mx1.hotmail.com.
Escape character is '^]'.
220 bay0-mc5-f18.bay0.hotmail.com Sending unsolicited commercial or bulk e-mail to Microsoft's computer network is prohibited. Other restrictions are found at http://privacy.msn.com/Anti-spam/. Violations will result in use of equipment located in California and other states. Fri, 10 Nov 2006 20:08:25 -0800
EHLO 132.8.111.219.st.bbexcite.jp
554 Transaction failed
Connection closed by foreign host.
デタラメの場合。
% telnet mx1.hotmail.com 25
Trying 65.54.244.8...
Connected to mx1.hotmail.com.
Escape character is '^]'.
220 bay0-mc1-f2.bay0.hotmail.com Sending unsolicited commercial or bulk e-mail to Microsoft's computer network is prohibited. Other restrictions are found at http://privacy.msn.com/Anti-spam/. Violations will result in use of equipment located in California and other states. Fri, 10 Nov 2006 20:13:42 -0800
EHLO hoge
250-bay0-mc1-f2.bay0.hotmail.com (3.3.0.19) Hello [219.111.8.132]
250-SIZE 29696000
250-PIPELINING
250-8bitmime
250-BINARYMIME
250-CHUNKING
250-AUTH LOGIN
250-AUTH=LOGIN
250 OK
QUIT
221 bay0-mc1-f2.bay0.hotmail.com Service closing transmission channel
Connection closed by foreign host.
どう考えても HELO で hoge と名乗るよりも正しいはずなのだが、HELO の文字列で S25R っぽい妙な制限をしているようだ。アホな HELO の制限を回避するために正逆一致する名前を HELO に名乗るようにしていたのだが、まさかそれでもひっかかるとは……。

_ なお、正直に名乗った場合は 554 のステータスが返ってきてるけど、こちらから QUIT するのではなく hotmail のサーバの方から切断してるので、Postfix では perm error ではなく temp fail 扱いになって再送キューに入る。これは正しい動作なんだけど、MTA によってはもしかしたらバウンスしちゃうものがあるかも。


2006年11月12日(日)

木枯らし1号

_ 追い風で 10km 走るより、向かい風を 1km 進む方がキツいよね。吹きっさらしの堤防の上ではなおさら(泣)。

jot とか seq とか

_ こういうコマンドがむかーしから存在してたら喜んでほいほい使ってたんだろうけど、環境によって使えたり使えなかったりすると、めんどくさいから覚える気がなくなるんだよね。 この前の pkillみたいに決定的に優位な点があれば話は別なんだけど。

_ つーわけで、各種コマンドを組み合わせて連番を生成するあれこれ。

_ ふつーにループで数える。

i=0
while [ $i -lt 20 ]; do
    echo $i
    i=`expr $i + 1`
done
正攻法だけど、まどろっこしいのでめったにやらない。

_ カウントアップするコマンドを使う。

yes '' | cat -n | head -30
yes はただ無限に改行を出力してるだけ。それを cat -n で行番号を振る。連番の先頭を1以外の数にしたければ head と tail を組み合わせるとか、
yes | sed -n '11,30{;=;};30q'
とか。ただ =(行番号表示)を使えない sed もあったような気がする。まあ、それを言ったら yes も実はわりと最近のコマンドなので使えない環境はあるけど。yes も sed の = も使わないとしたらこうか。
while :; do echo; done | cat -n | head -30 | tail -10

_ 1, 2, 3 じゃなくて 001, 002, 003,... とする場合。最近は printf というコマンドがあるのでそれを使えばいいんだけど、printf もすべての環境にあるわけじゃないんだよね。

yes '' | cat -n | head -30 | sed 's/[^0-9]//g; s/^/00/; s/.*\(...\)/\1/'
わけわかんね。ここまでやっちゃうなら、素直に
for i in `yes '' | cat -n | head -30`; do
    i=`expr 00$i : '.*\(...\)$'`
    echo $i
done
とやった方がいいかも。FreeBSD の xargs だと、
yes '' | cat -n | head -30 | xargs -I% expr 00% : '.*\(...\)$'
でもできるけど、Solaris だか GNU だかの xargs は -I じゃなくて -i だったような気がする(意味も微妙に違ったかも)。

_ 数えるのではなく、シェルの brace expansion を使う方法。標準的な sh では使えず、tcsh や bash や zsh で使える機能なので、スクリプトではなくコマンドラインのワンライナーを叩くときに使うことが多い。

% echo {,1,2}{0,1,2,3,4,5,6,7,8,9}
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
展開の都合上ゼロからになっちゃうけど、数えるのではなくただ展開してるだけなので、16進とかも可能。
% echo {0,1,2,3}{0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f} | xargs -n16
00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f
20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f
30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f

_ わしは使ってないけど、zsh だったらこんな展開もできる。

% echo {1..30}
ゼロパディングも可。
% echo {001..030}
sh スクリプト中で zsh -c 'echo {1..30}' としてもいいんだけど、なんだかそれは負けた気がする。

_ え、perl? ruby? python? なんに使うの?


2006年11月15日(水)

無題

_ はてなの20分間隔巡回がおとといから復活してる。ほんっっっとに頭悪いロボットだなぁ。

_ リバースプロクシを極めるのもいいけど、ふつーにフォワードプロクシを使うことを検討してもいいと思うぞ。

無題

_ そういえば、 この前改行を延々と出力するために yes を使ったわけだが、yes がない環境(たとえば、Solaris8 にはなかったと思う)でどうすべ、と while の空ループを使った。が、sh のループって遅い。ものすげー遅い。が、ふといい方法を思いついた。

tr \\0 \\n < /dev/zero | cat -n | head -30 | tail -10
ゼロを改行に置換すればいいやね。

_ どのくらい速度が違うか。10万行の改行を全部 /dev/null に捨てるのに必要な時間を計測。

% time sh -c 'yes "" | head -100000 > /dev/null'
0.148u 0.033s 0:00.18 94.4%     28+205k 0+0io 0pf+0w
% time sh -c 'while :; do echo; done | head -100000 > /dev/null'
1.922u 3.573s 0:05.54 99.0%     88+221k 0+0io 0pf+0w
% time sh -c 'tr \\0 \\n < /dev/zero | head -100000 > /dev/null'
0.156u 0.056s 0:00.21 95.2%     47+262k 0+0io 0pf+0w
yes と tr < /dev/zero はほとんど一瞬だけど、それに比べると while ループはまったくお話にならない。

_ つーか、参考にする機会のまったくなさそうなベンチマークだな:-)。


2006年11月16日(木)

無題

_ はてなロボットの 20分間隔巡回問題ですが、進展がありました。

_ HatenaScreenshot/1.0 が /d/robots.txt と /robots.txt を20分おきに2回取りにくるところまでは同じ。が、この2回アクセスの1分後にまた2回やってくるようになりました。これまで2回アクセスで1セットだったのに、4回1セットに倍増。

_ 通常のコンテンツを取得しにくるロボットならば、この程度の頻度でアクセスしてもさほどおかしいことではない。が、robots.txt を1日に288回も取得しにくるロボットっていったいどうなのよ?

無題

_ なんで awk を使わんかというと、awk は同じ名前でいろんな実装があってビミョーに挙動が違うから。

_ 具体的には、連番生成を awk でポータブルに書こうと思ったら、

$ awk 'BEGIN{for(i=32;i<16383;i++){printf"%6d\n",i}'
ではダメで、
$ awk 'BEGIN{for(i=32;i<16383;i++){printf"%6d\n",i}' /dev/null
としなければならない。Solaris の /usr/bin/awk は*必ず*ファイルなり標準入力なりをオープンする仕様なので、BEGIN または END しかない場合でも何かファイルを食わせておかないと標準入力を読もうとして止まっちゃう。Solaris でも /usr/bin/awk じゃなくて /usr/xpg4/bin/awk や /usr/bin/nawk ならば、あるいはもちろん GNU awk ならばこんなことしなくてもいいんだけどね。

_ Solaris の /usr/bin/awk は最初期の awk にかなり近い実装のようで(実際に確かめたわけじゃないけど)、ほかにもいろんな制限があるのでポータブルなスクリプトを書こうとする場合には注意。たとえば、

awk 1
はふつーの awk ならば cat と同じ動作をするはずなんだけど(なんでそうなるのかは考えてみてね)、Solaris の /usr/bin/awk ではエラーになる。
awk 1==1
とすれば cat として動作するんだけど。どうやら pattern は単なる値じゃなくて条件式の形になっていないとダメらしい。ほかにも文字列置換の sub() が使えないとか、かなり制限がキツい。こんな重箱の隅みたいな差異を覚えるより、もっとましなことに脳味噌を使った方がいいね。

_ ちなみに、この日記を生成しているスクリプトは awk で書かれてたり。HTML だけでなく、RSS の出力まで含めて。


2006年11月18日(土)

awk で httpd

_ なんか awk で httpdなんて無益なことをやってる人がいる。まあ、わしも以前 同じように無益なことをやったわけだが。今改めて見ると、いくつかおかしなところがあるな。どうせ冗談で作ったものだから直すつもりないけど。

_ これは tcpserver (inetd + tcp-env) の助けを借りるけど、最近の gawk は自力で TCP/IP を喋れるんだよね。 キモい。……って、昔試したな、と古い記録を漁ったら2001年3月にパッチを当てて実験したメモが出てきた。\ そんな前から使えたのか。


2006年11月19日(日)

nl

_

利点として、いろんな環境に nl コマンドは入ってる。
とりあえず、Linux, cygwin, Darwin, FreeBSDには入ってる
はぁ? nl って FreeBSD にはないでしょ、と思ったら、うわぁ、手元のマシンにちゃんと入ってた。今までまったく気づいてなかった。おまえいつのまにこんなところに:-)

_ とはいえ、nl は SysV 由来なので、BSD 系では存在しないか、あったとしてもつい最近のことなんじゃないかな。 ここの manで調べてみたら、FreeBSD は 4.5 から、NetBSD は 1.4 からの登場で、OpenBSD は 3.9 になっても存在していない。それ以外では、うちでほとんど iTunes 専用と化している MacOSX 10.3 で見てみたけど入ってなかった。BSD 系でも、大昔に SunOS 4.1.4 で nl を使った記憶がかすかにあったりするんだけど。

_ この手の互換性問題では「使えない環境がある」というのはたいてい商用 OS のことなんだけど、nl に関していえば SysV 由来なのでそのあたりは気にしなくてよさそう。

_ ちなみに、ここ数日さんざん環境依存性について書いてるけど、わしが実際にシェルスクリプトを書くときにはほとんど気にしてない。だってあるホスト用に書いたスクリプトを別の OS にもっていって動かすなんてめったにしないから。環境依存のことを覚えるのがめんどくさいから自然に依存性のない書き方になる傾向はあるけど。

_ つーか、結局 seq と jot のどっちが FreeBSD でどっちが GNU なのか、いまもって覚えてません。

Bring back deleted files with lsof

_ Linux で消しちゃったファイルを復活させる方法だって。要するに、ファイルがクローズされるまでは消したつもりで見えなくなってるだけで実体が消えたわけじゃないから /proc から拾ってやろう、ってことね。with lsof となってるけど、キモは procfs であって、lsof は必須じゃない。Linux の /proc ってこんな情報まで見えるのね(ふだんあまり深くいじってないのでよく知らない)。

_ はっきりいってこの方法が使える場面はひじょーに限られているので、実際に使う機会はたぶんないと思うけど、初心者に syslog のローテートの仕組みを説明する際のサンプルとしては使えるかもしれん。


2006年11月20日(月)

MeTA1

_ Sendmail Xって最近どうなってんのよ、と久しぶりに見にいったら、

The MeTA1 project is a successor of sendmail X.
……ってなんだオイ。smx がまともに使いものならんうちにもうポイして後継プロジェクトかよ。

_ ドキュメントを読んでみると、ポイしたんじゃなくて単純に smx が改名しただけみたいだな。なんで名前を変えたのか理由が見つけられなかったんだけど、こんなモノじゃ sendmail の名を冠するに値しない、なんて判断がまさかあったわけじゃないよな。

_ sendmail 9 から X になって MeTA1 と。迷走してるなぁ。そのぶん 8.x が延命されるわけで、いろんなしがらみで乗り替えできないところでは助かるのかもしれないけど。


<< = >>
やまや