どさにっき 2.0 〜2006年6月下旬〜

by やまや
<< = >>

2006年6月21日(水)

DomainKeys

_ えーと、DomainKeys ってのは要するに電子署名なので、署名された後でヘッダや本文が改変されると検証に失敗する。DomainKeys はメーリングリストに弱いと言われる理由のひとつですな。

_ 自宅 postfix に milter を導入したので、DomainKeys を検証できるようにしてこのあたりの動作を注意深く観察してるのだが、このまえはじまった DNSOPS.JPのメーリングリストからのメール。

Authentication-Results: mx.maya.st sender=ロボットによる収集回避@dnsops.jp; domainkeys=pass
なんで pass しとんねん。ML が Subject をいじってるんだから fail になるはずなんだが。Subject をいじらないメーリングリストとか、いじってても Domainkeys-Signature: の h= に subject が含まれていないとかなら pass でもおかしくないんだが、そういうわけではない。1通だけではなく、この ML に届いた DomainKeys で署名された複数のメール(意外と DomainKeys の採用率が高くてびっくり)がすべて pass してる。なんでじゃ。

_ うーん、 ここのツールを使って手で検証するとぜんぶ bad だ。なんでじゃ。

_ よくわからん。これまで読まずに逃げてきたけど、DomainKeys の仕様をちゃんと確認しとかなきゃいかんなぁ。なんかバグっぽい気もするんだけど。


2006年6月23日(金)

韓国 CERT

_ CERTCC-KR。なぜか jp ドメインで日本語。

_ kr ドメインでハングルなサイトもいちおう あるにはあるようだが、謎。


2006年6月25日(日)

#!/usr/bin/env

_ 今さらながら、 CGIの神話と現実というエントリ。ただし内容とはまったく関係なし。スクリプト言語の shebang 行(#!)でスクリプトインタープリタを直接書かずに /usr/bin/env でラップするという悪習はいったい誰が広めたんだろうか。ruby な人に多いように思うがそれだけじゃないし。

_ hoge というインタープリタを使うスクリプトの1行目をたとえば #!/usr/bin/env hoge としておくと、hoge の実行バイナリが /usr/bin/hoge でも /usr/local/bin/hoge でも $HOME/bin/hoge でもどこにあってもパスが通ってさえいれば起動できる。それはメリットなんだろうか。わしにはむしろデメリットにしか思えない。

_ /usr/bin/env を使うというのは、PATH の値にしたがってインタプリタの場所を探すという意味である。つまり、スクリプトを書いた人と実行する人で設定が違えば同じインタープリタが起動するとは限らない。OS 標準の /usr/bin/perl と、そのホストで独自にコンパイルした /usr/local/bin/perl と、ユーザが自分用にコンパイルした $HOME/bin/perl とが存在している場合、#!/usr/bin/env perl となっていてはどの perl が使われるのかわからないし、もしかしたらそもそもインタープリタを見つけられないかもしれない。どこにインストールされているかに依存せずに実行できる、というけれど、$PATH という別のものに依存するようになっただけだ。異なるバージョンのものを複数インストールしてある環境は珍しくないと思うのだが、同じ名前でも同じ動作をするとは限らない(同じ動作をするのならいくつもインストールする意味がない)わけで、インタープリタの位置を明示しない記法というのは害になっても益になることはないと思うのだが。

_ OS によっては env が /usr/bin ではなく /bin に存在するものもあるらしい(MacOSX 10.1 がそうらしい)。env 自身が環境依存という時点で、環境依存性の回避というのは幻想に過ぎないと斬って捨ててもいいと思うんだが、仮に幻想のまま /usr/bin/env を前提にできるとして、それでもなお意図しない動作をしてしまう例を挙げてみる。

_ たとえば FreeBSD では、標準の /etc/crontab は

PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin
となっていて /usr/local/bin が含まれていない。なので、
#!/usr/bin/env ruby
というスクリプトを /etc/crontab に登録すると、FreeBSD では ruby は /usr/local/bin にあるのが標準なので、インタープリタを見つけられずにエラーになる。

_ Apache は起動時に環境変数をクリアしない。なので、OS 起動時に自動で起動される場合と、PATH=$HOME/bin:/usr/local/bin/usr/bin:/bin な環境で sudo apachectl start する場合では PATH の値が異なることがある。CGI にわたされる PATH は Apache 起動時の PATH がそのまま使われるから、つまり、/usr/bin/env でラップしている CGI では、Apache がどのように起動されたかによって異なるインタープリタが使われる(あるいはインタープリタを見つけられない)ことがある。

_ こういう問題は cron や apache にかぎらず、シェルのコマンドラインからではなくデーモン類から起動されるもの全般で発生する。たとえばメールの自動処理をするために aliases や .forward、.qmail、.procmailrc などからスクリプトを起動する場合にも、MDA がスクリプトにわたす PATH の値によって同じような問題が起きるだろう。

_ そもそも、

#!/path/to/cmd a b c
のように複数の引数を shebang 行に書いた場合、/path/to/cmd にどんな引数が渡されるのかは OS によって異なる。"a b c" というひとつの引数が渡されるもの(Linux とか FreeBSD >=6 とか)、"a" "b" "c" という3つの引数が渡されるもの(FreeBSD <=5 とか)、"a" だけが渡されるもの(Solaris とか)、さまざまである( 参考)。つまり、
#!/usr/bin/perl -Tw
ならば、引数がひとつだけなのでどんな環境でも書いたとおりに /usr/bin/perl -Tw が実行されるが、 ここにあるように
#!/usr/bin/env perl -Tw
とするとそうはいかない。FreeBSD 5.x では意図どおり動くが、Solaris では -Tw が無視され (*1)、Linux では "perl -Tw" なんてコマンドはないというエラーになる。perl がどこのパスにあっても起動できるよう環境非依存にするつもりで /usr/bin/env を使ったのだろうが、逆に /usr/bin/env を使ったが故に環境依存の罠にハマっていることになる。これはまた、#!/usr/bin/awk -f や #!/usr/bin/sed -f のように shebang 行で引数が必須の言語は多くの環境で #!/usr/bin/env awk -f のように代替できないことを意味する。

_ それでも #!/usr/bin/env の方がすぐれているという方、反論求む。


(*1): ただし、OS レベルでは無視されるが、perl 自身がスクリプトに書かれた shebang 行を解釈するので、perl として起動された後で perl -Tw として起動されたかのように動作を変更しようとする(その結果エラーになる)。っていうか、perl hoge.rb とか perl hoge.sh とかでも、shebang 行さえ書いてあれば ruby なり sh なりにスイッチしてちゃんと動いてしまう。ruby も perl と同じように shebang を解釈するが、あらゆるスクリプト言語が同じように shebang 行を解釈してくれると思ったら間違いである。

2006年6月26日(月)

100までの素数

_ なんか L.L.Ringのチケットが今日発売だったようで、わしはあんまり興味ないんだけど、昼飯どきで弁当を買う客で大混雑のローソンにつきあいで出かけていってぼーっとしてみたり。

_ で、見てたら 100までの素数を列挙するというネタが。せっかくなので参加してみよう。おおかたの言語はもう出つくしてるようだし、ふつーの言語でやってもおもしろくもなんともないので、意外と便利なのに sendmail.cf 生成専用ツールと思われている気がしないでもない m4 で。

define(`forloop',
	`pushdef(`$1', `$2')_forloop(`$1', `$2', `$3', `$4')popdef(`$1')')dnl
define(`_forloop',
	`$4`'ifelse($1, `$3', ,
		`define(`$1', incr($1))_forloop(`$1', `$2', `$3', `$4')')')dnl
forloop(`i', 2, 100,
	`forloop(`j', 2, i,
		`define(`k', j)ifelse(expr(i % j), 0,
			`define(`j', i)')')ifelse(i, k, `i ')')
ループをするにもマクロを書かないといけないあたりが、いかにも言語ではなくマクロプロセッサである。といっても、この forloop マクロはわしが書いたものではなく、GNU m4 の info にあるものをそのままコピペしただけ(GNU m4 以外でも動くはず)。

shebang 小技

_ 別に #! の行に書くコマンドはスクリプトインタプリタじゃなきゃダメなんて決まりはない。

_ IP based virtual host ではなく、あえて IP アドレスごとに異なる Apache を起動したいことがときどきある。あるいは、実験のため異なる設定でとっかえひっかえ起動したいなんてことも。こういう場合はいくつも設定ファイルを用意したくなるが、apachectl では設定ファイルを指定できず、httpd -f hoge.conf のように httpd を直接起動しなくちゃいけない。

_ そんなときは、設定ファイルの先頭行に

#!/usr/local/apache2/bin/httpd -f
と書いて chmod +x hoge.conf しておくと、
# /usr/local/apache2/conf/hoge.conf
のように、設定ファイル自身を「実行」することで hoge.conf の設定で apache が起動してくれる。引数も受けつけてくれて、
# /usr/local/apache2/conf/hoge.conf -k graceful
でちゃんと graceful restart する。設定ファイルと起動スクリプトが同一になり、apachectl はもういらなくなる(いいのか?)。

_ もっとも、apache は相対パスはカレントディレクトリからではなく ServerRoot からの相対パスとみなすので、こういう使い方をするのは少々ムリがあるんだけど(hoge.conf を絶対パスで起動する必要がある)。

_ apache 以外でも、設定ファイルをコマンドラインから指定でき、かつ設定ファイルの #! 行をコメントとして読み飛ばしてくれるものならばたいてい有効。同じツールでいくつも設定ファイルを使いわけるようなことがあれば覚えておくと便利……というほどでもないな。


2006年6月27日(火)

100までの素数、つづき

_ きのうの m4 版は読解至難ではあるけど、ループとか条件判断とか代入とかはいちおう読み取れるよね。じゃあ、もっと暗号にしか見えない100までの素数出力スクリプトだ。

#!/usr/bin/dc
[ 2Q]s2
[lilj% 0=2 ljd1+sjs.ljli!<1]s1
[lips.]s3
[ 2dsjs.ljli!<1 lilj=3 lid1+sis.liln!<0]s0
[0Sj0SiSn 2dsis.liln!<0 Lns.Lis.Ljs.0 1Q]sP
100lPxq
どうだ。文字化けじゃないぞ。

_ UNIX 系 OS には /usr/bin/bc という電卓ツールがあるんだけど、こいつは関数を定義して一種のスクリプトとして使うことができる。また、/usr/bin/dc という逆ポーランド電卓もある。GNU では bc、dc はまったく別ものだけど、Solaris では実は bc は dc への単なるトランスレータである。つまり、bc で素数を解く関数を定義できれば、それから dc で素数を解くスクリプトを生成できるわけだ。

_ というわけで作ってみた。bc で関数が使えることは知ってても実際に作るのははじめてなので、man を見ながらえっちらおっちらと。たいして凝ったことをするわけじゃないので、てきとーにこんな感じで。

define p(n) {
    auto i, j
    for(i=2; i<=n; i++) {
        for (j=2; j<=i; j++) {
            if((i % j) == 0) break
        }
        if(i == j) i
    }
}
p(100)
quit

_ あとは

% bc -c primes.bc > primes.dc
としたあとで、細かい部分をちょっと修正してできたのが、最初に挙げたスクリプト。作った自分がいうのもなんだが、なにがなんだかさっぱりわからん。


2006年6月28日(水)

さよなら WinFS、こんにちは ZFS

_ WinFS と ZFS、どっちも野心的なファイルシステムなんだけど、 ZFSの方は当初の予定からはだいぶ遅れたものの、ついこの前出た Solaris10 06/06 で正式リリースされたのに比べて、 WinFS の方は遅れに遅れたあげくにとうとうポシャったらしい。成果はいちおう ほかのプロダクトに入るようだけど 。

_ WinFS はできもしない仕様を盛り込みすぎたんだろうか。でも ZFS も夢みたいな機能がてんこもりなわけで。なぜ一方は達成できて一方は失敗したのか、考えるとおもしろいのかもしれないけど、わしの貧困な脳味噌ではレイヤー8以上のことに思いをめぐらせてもあしたは何食おうぐらいのことしか出てこないのでありました。


2006年6月29日(木)

無題

_ ついこのあいだから INTERNET Watchが自前で RSS の配信をはじめたんだが、きのうか今日あたりから この前の /.jと同じく、記事への直接リンクではなく、いったん pheedo.jp を踏台にしないと目的の記事に辿りつけないような RSS にかわってしまった。こういうの増えたよなぁ。 CNET Japan もやってるけど、ここが使ってる feedburner は RSS を精査すればちゃんとリンク先の情報は拾える。でも pheedo.jp はどこに飛ばされるのかまったく不明。

_ こういうのカンベンしてほしいなぁ。あちらさんも商売でやってるわけだからさ、広告を入れるなとかビーコン入れるなとかは言わないけどさ、A というサイトにアクセスしようとしてるのに B というサイトにリンクを張る、ってのはやめてほしい。違うサイトに誘導するんじゃフィッシング詐欺と手口がおんなじだよ。平気でリンクを辿る気にはなれない。

Gmail for your domain

_ 申し込んでから何ヶ月も経ってやっと Gmail for your domainの beta tester invitation が届いた。っていうか、あんまり遅いのでもう申し込んだことをすっかり忘れてた。

_ いじってみる。セットアップは管理者アドレスを作って MX を gmail に向けるだけ。むちゃくちゃカンタンだ(とはいえ、MX ってナニそれ聞いたことない、という一般人にとってはそれなりに難関かもしれない)。MX レコード7つね、と言われたのには面喰らったが。

_ 管理者メニューを見てみると、ニックネームと称して1ユーザで複数のアドレスが持てたり、さらにメーリングリストや catch-all アカウントも作れたりと、25ユーザまでの制限はあるけど利用できるメールアドレスは無尽蔵っぽい。CSV ファイルのアップロードで大量アカウント作成も可能だったりと、大規模なホスティングにも対応できるような作りになってる模様。管理メニューでそんなに細かい設定ができるわけじゃないけど、だからといって決定的に欠けている機能があるというわけでもない。こんなもんで十分だろ。

_ 一般ユーザとしては、ふつーの gmail とほとんどおんなじ。違うところもあるのかもしれないけど、そこに気がつくほどまだいじってない。表示設定が日本語じゃなくて英語だと メールだけでなく google calendar にもアクセスできるんだけど、ふつーの gmail でも言語によって calendar が使えたり使えなかったりするんだっけ? わすれた。

_ うちは g.maya.st というドメインで申し込んだんだけど、Web UI の URL が http://g.maya.st/ にかわるってわけじゃないんだな。自前のドメインで使えるのはメールアドレスとしての利用だけで、UI はあくまでも http://mail.google.com/ の下にある。ほかに DNS 的なところでは、ふつーの gmail はメール送信時に DomainKeys-Signature: ヘッダがついて DK で署名されるんだが、for your domain ではそれはなし。SenderID については、SPF レコードを設定したいならこう設定してね、という情報は FAQ に書いてある。

_ ちょっとさわってみた感じで気がついたのはこんなもんかなぁ。表面的にさらっとさわっただけで詳細なところまではまだほとんど見てないので、ふつーの gmail とはココが違うぜっ、というのを見落としているかもしれない。


2006年6月30日(金)

安易なパスワード

_ の十傑だそうな。

首位の「123」は、単純な連続番号をパスワードに選んでしまう人が、ほぼ1000人に4人の割合でいるという証しだ。2位は「password」で、ほぼ250人に1人がこれを使っていた。
4/1000 と 1/250 っておなじだと思うんだけど……。ほぼ同率だというのならわざわざわかりにくくしないではっきり書いてくれ。

_ それはそれとして、この統計って辞書攻撃で他人のパスワードを解析した結果ではなく、きっとこの会社の実際のお客さんが使ってるパスワードを調査したんだよね。いいのかなぁ。サービス提供側がパスワードを生で保存していることがいけないとかそういうことではなく、そのパスワードを認証以外の目的で読み出すという行為が。パスワードってのはいちおう秘密の情報なんだから、そういう調査統計が可能であっても知らんぷりしておくべきなんじゃないかなぁ。「できる」ということと「やっていい」ということはイコールじゃないことをわきまえておいたほうがいいと思う。

Gmail for your domain

_ きのうに引き続きいじり。

_ きのういじってたときは管理者画面が英語だったんだが、今日はなぜか日本語になってた。どこをどういじったのかよくわからん。日本語でいじってる途中でいきなり英語に切り替わったりまた日本語に戻ったりすることがあるし。日本語化されてないのならしかたないけど、そうでもないのに言語が勝手にスイッチしちゃうのは、こりゃバグだろうなぁ。発動条件がよくわかんないんだけど。

_ Google mini という製品があるけど、こういうアプライアンス箱を作るのならば Google mini のような検索エンジンよりも Gmail のような Web メール環境の方が需要があるんじゃないだろうか。将来は数百〜数千アカウントを有料で google 上にホスティングさせるサービスがはじまる可能性もあるけど、それと同じぐらい Google Mail + Calendar を Web メール/グループウェアなアプライアンス箱として売る可能性も高いと思う。ロゴを変更してブランディングできたり、大量アカウントを一括で登録できたりといった機能は、最大25ユーザという小規模サイト向けのサービスならばなくてもいいはずなんだよね。こういう機能はアプライアンスとして売る場合にこそ欲しい機能だ。つーか、Gmail mini の開発のために必要なチューニングパラメータを収集したり UI の洗練度を上げるために for your domain を無料βテストしてるんじゃないかという気が。

_ ……さすがに穿ちすぎか。

_ そういえば、自前ドメインで Web メール、ということならば、google 以外にも Windows Live Custom Domainsとか Outblaze.comとか everyone.netとかその他いろんなところでやってますので参考までに。ただし、outblaze.com と everyone.net は、こいつを使ってる spammer がウヨウヨしてるので、勝手ながらわしはここからのメールの受け取りは拒否しております。 operamail.com(Opera のやってる無料 Web メールサービス)が outblaze なので、こういう設定はわりと危険なんだけどね。


<< = >>
やまや