おもしろく生きたいね

2007年1月の記事一覧

ポークカレー

 あまり早く帰れなかったので、夕飯の選択肢は乏しい。でも、俺たちにはKUMARIがある!クマー!

 というわけでチーズ入りナンとボークカレー。日本人向けの一品らしいので、辛さはそのままにして注文したが、確かにうまかった。そしてここの変わりナンは絶品。けっこう愛用してます。

 ところで、店員が他の客に話していたんだけど、本場の人たちは辛さ20倍くらいでちょうどいいそうだ。最近めっきり鍛錬を欠いている俺などは、7-8倍くらいでもけっこう来るんですが…。


鯖の塩焼き

 朝、ラジかるッハードな!?クッキングコーナーでやってた鯖のトマト煮がうまそうだったので、昼は升屋で鯖塩。ここはこしひかりのご飯がお代わりできるんだけど、おかずが少ないので苦労する。副菜かお新香か、何かもう一品あればいいのに。

 でも780円だからこんなもんか。いい焼き具合の鯖が食べられて、そこそこ満足。


 美しいアートにあふれるサイトを見るうち、こうつぶやいてみたくなった。


 高木氏の「サニタイズせよと言うな」キャンペーンにも関わらず、前時代的な汚染チェックしましょう運動に廃れる気配がないのはなぜ?

 HTTPリクエストパラメータをサニタイズすればOKという「入り口を塞げば安全」の発想から生まれるのは、「チェック済みの値をDBに入れたのだから、DBに入っている値はノーチェックでいいはず」のような盲信の連鎖。(「$data = s/(.*)/$1/; # ここでは大丈夫なはず」のような) そんなものは、連携モジュールや連携プログラムが一つでもチェックを怠っていたり、前提に食い違いがあったりすればたちまち崩れ去る。

 データが汚染されていようがいまいが、HTML出力エンジンでは必要なエスケープ処理やタグ除去処理を行い、URIを受け取りリソースを取得するモジュールは与えられたURIの妥当性チェックを行い、DBアクセスするモジュールはすべての可変パラメータをエスケープし、printf系関数の書式文字列には固定文字列を使うなりきちんと実装したパーザとビルダで生成する。一歩進んでDoS対策については、処理にタイムアウトを設けるなり、事前にコスト見積(SQL処理ならEXPLAINなど)して、閾値で制御できるようにする。このように個々の部品レベルでやるべきことをやれば、入り口に穴があってもデータフローの途中に抜けがあっても影響は限定的だし、データに前提条件を課すことなくどこでも使える。

 そもそも、セキュリティということを抜きにしても、美しい設計という観点があれば、レイヤー違いの処理を強いる部品なんてものは作られ得ない。また、処理の負荷を考えても、バリデーションレイヤーでがんばるのには所詮無理がある。トランザクションに入らなければ捕捉できないエラーもあるのだから、バリデーションは明らかにおかしな入力を弾くものにとどめ、それ以上は実処理でのエラーで捉える方が現実的だろう。

 徹底して実践するのは楽ではないが、プロなら常に念頭に置いて努力しなければならないと思う。

 と、先日やっつけで書いたCのコードを堅牢な作りに書き直した直後の勢いでまくし立ててみました。実運用は緊張するよ!


 忙しい日々、ちょっとした移動時間を埋める楽しみが激指 for i-mode。この通信COM対局がかなりいい。通信状態がよければ一手3秒以内に指してくれる上、アマ三段くらいの力は確実にある。こちらも3〜5秒でポンポンと指すと結構負ける。DoCoMoユーザはぜひ遊んでみて。(パケホーダイ推奨)

 こいつは、不意にアプリを終了させたりしても後で再接続して再開できるのでとてもいいのだけど、1/5のサーバ保守以降、不具合が連発していて困っている。

 中断〜再接続すると、盤面や棋譜に不整合が起きることがあるようで、指したはずの手が巻き戻っていたり、COMが手を変えたりする。しかも盤面が実際と食い違っていることがあり、盤面に飛車が三枚いて心眼の冴えを問われたり、向かい合う飛車の間に角がいると思ったら実は幻で、盤面を信用して悠然と銀を引き締めたら次の手で飛車を素抜かれたり、まるで軍人将棋だ。

 飛車を抜かれてもへこたれずに粘りまくって、奇跡の逆転かと思ったらきっちり一手差で余されたりする。悔しくてたまらないが、精神はだいぶ鍛えられたようで、不具合が出て理不尽な仕打ちを受けまくって以降、どういうわけか勝率が上がり、香車一本強くなったかのようだ。

 むう、なんか言葉にするとますます悔しいぞ!


 imerge(1)の0.2.0をリリースした。マージ前後に任意でエディタを起動する機能と、diff(1)sdiff(1)のフラグを与えるコマンドラインオプションを追加した。

 ついでにportしておいたので、FreeBSDユーザの人はどうぞ。


 今日は、朝ものすごい頭痛になって午後まで寝込んでいたが、夕方の打合せ前に何とか恢復。最近よく眠れない日が続いていたのだけど、たまった疲れにきっちりと借りを返された格好だ。

 とはいえ、自分で満足の行く品質のものを仕上げることができているので気分は軽い。本当は体力気力を常に充実させ、もう一歩突っ込んだ役割を果たさないといけないのだけど。

レッドカレー ライス大盛り

 有楽町での打合せの後、ビック6Fのコカレストランへ。ここのタイ料理はなかなかおいしいので愛用している。今日は牛肉と茄子のレッドカレー。やっぱカレーは茄子だよ!ボリュームのある大盛だけど、飽きることなく堪能。

 しかし、離れた席でお姐さんがうまそうにビールを飲んでいてたまらなかった。ああ、いつかタイスキを食べに来たいな。もちろんビール片手に!(・∀・)


 zshのglobal aliasは、意外と使いでがある。ほかの人がどう使っているのか知らないが、僕は主に独自コマンドラインオプションを定義するために使っている。

 たとえば、「alias -g -- --mydb3='-h mydb3 -uadmin -p'」のように定義しておくと、「mysql --mydb3 」や「mysqldump --mydb3 --no-data blog」など、MySQLの接続情報の指定が楽になる。しかも、aliasなのでその前後でちゃんとzshのコマンドライン補完が利くのがうれしいところ。

 同様に、find(1)用に-cvs-excludeを定義してみた。

exclude_patterns=(
    RCS SCCS CVS CVS.adm RCSLOG 'cvslog.*' tags TAGS .make.state
    .nse_depinfo '*~' '#*' '.#*' ',*' '_$*' '*$'
    \*.{old,bak,BAK,orig,rej,del-\*,a,olb,o,obj,so,exe,Z,elc,ln}
    core .svn .bzr
)
 
alias -g -- -cvs-exclude='\( \! \( \( '"${(j/ -o /@)${(@q)exclude_patterns}/()/-name }"' \) -prune \) \)'
 
unset exclude_patterns

これで、「find ~/src/ruby -cvs-exclude -mtime -1」などと使えるわけだ。

 このほか、よく使うconfigureオプションをまとめたものを定義したりしても便利だと思う。もちろん、globalだけにあまりにありふれた名前は避けたいが、普通のalias同様にバックスラッシュで展開を避けることができるので、うっかりしても痛い目を見ない自信があるなら思い切った名前にしてしまってもいいと思う。


 前回、ファイルの順次マージを支援するツールが用意できた。これでローカルにあるファイルの取り込みは簡単にできるわけだが、リモートにあるファイルはどうだろう?一つずつ持ってきて比較というのでは遅い*1ので、対象ファイルを一括で取り込みたい。

 今、local/にSubversion作業ディレクトリがあり、リモートホスト$hostにあるファイルはremote/$host/にミラーするものとする。somewhere.example.orgから、local/に存在するファイルだけを持ってくるにはどうすればよいか。

 もったいぶってもしょうがないのですぐに答えを示す。実質ワンライナーだね。

host=somewhere.example.org; \
( cd local && find . \! \( -name .svn -prune \) -type f | sed 's/^\.//' ) \
  | rsync -aRv --files-from=- $host: remote/$host/

 rsync(1)のスラッシュで始まるパターンマッチと、-Rによる相対パス解釈の組み合わせが強力。include/excludeパターンを活用すれば、リモートで余計なディレクトリを突き進むこともない。覚えておきたい手筋。

 もっとも、tipだidiomだとクリップしてありがたがるのではなく、何か捻り出してやろうという気構えが大事。日々工夫。

追記:動かないやつを載せてました。正しいオプションは--files-fromです。日々失敗。


 何しろ、ドットファイルなどの設定ファイルはホームディレクトリに持つものなので、そのままSCMツールの管理下には置けない。SCM下にないファイルが大量に同居するのは気持ち悪く、管理上も不便だからだ。ここでは管理の都合上、RCSのようなファイル単位のSCMは除外している。

 さて、設定ファイルというものは、どのホストでもその場でいじる必要がある。一方、SCM作業ディレクトリで内容整理や環境依存性除去のための修正を行ったり、他ホストでの変更を取り込むこともある。となると、任意の二つのファイルを比較し、手軽にマージできるツールが欠かせない。

 もちろん、sdiff(1)やEmacsのemerge-files、その他さまざまなマージ支援ツールが存在する。しかし、一方のファイルが存在しない場合の対応や、マージ結果で片方を上書きする機能などを備えたラッパーがないと、反復的なマージ作業でうんざりしてしまう。一連の作業で上書きマージを行えるものが必要だ。

 求められるのは、まさにFreeBSDのmergemaster(8)のマージ支援機能。ということでシェルスクリプトimerge(1)を書いた。使い方は簡単で、元ファイルと先ファイルを指定するのみ。差分が表示され、元ファイルで先ファイルを上書きするか、内容をマージするか、何もしないかを選ぶ。マージを選択するとsdiff(1)が起動し、hunkごとに手動マージができる。エディタも起動できるので困ることはないだろう。終了すると差分が表示され、先ファイルを置き換えるか、やり直すかを聞かれる。今のところ、いずれかがsymlinkのときは何もしない。

 これで、すでにホームディレクトリにあるファイルを元ファイル、SCM作業ディレクトリにあるファイルを先ファイルとしてimergeすることで、編集結果をスムーズにSCMに取り込めるようになった。まずは一歩前進。