findの用法あれこれ

dankogaiさんのblogでいろいろと書かれていて参考になったというかほぼその通りだと思ったのだけど、いくつか違和感が。

.htmlだけ見つけたい時も

% find . -type f -name \*.html

でOK。findはシェルのワイルドカードを受け付ける。ただしシェルにそれを展開して欲しくないので、\でエスケープしている。

findとか、他のコマンドにシェルのワイルドカードを渡したいときは何も考えず機械的にシングルクォートで

% find . -type f -name '*.html'

と書くようにしているのだが、どうなんでしょうか。確かにスラッシュ1つの方がタイプ数は少ないが、.htmも含めてバックアップファイルだけ探そうと思って

% find . -type f -name \*.htm\?.\*

とかするともう見ただけで発狂しそうになるのは私だけ?(w
あと、otsuneさん

ディレクトリ名に0x20(空白)が入るMac OS X環境でfindに-print0を使わずにxargsで受け取るのはヤバい。かなり危険。一度AppleiTunesのアップデートスクリプトで0x20デリミタの想定外動作をやらかして、誤消去したことがあったよなぁ。
なので「findには必ず-print0オプションを付けて、xargs -0で受け取る」というのを広く世に広めたい。例えば

find . -type f -print0 -name '*~'  | xargs -0 rm 

という感じ。

はなるほどと思った。私も意識して世に広めようと思う。
ちなみにワタシがよく使うのは、やはりなんと言っても

% find . -type f | xargs rm

で、~/rpmディレクトリを掃除するのに多用する。いちいちSPECSとSOURCESに降りて消すのはめんどくさいよ。とパッケージャらしい愚痴をこぼしてみる。でもこれも、ちゃんと-print0と-0を付けて

% find . -type f -print0 | xargs -0 rm

とか叩くようにしよう。そうしよう。

Perlへパイプするとわ…

この-exec、かつては有用だったがxargsやperlがある昨今ではあまり使わない。

% find . -type f -name '*~' | xargs rm

か、

% find . -type f -name '*~' | perl -nle unlink

がいいだろう。-type fをつけることで、ファイルのみを検索対象にしている。
これらのうち、一番のお薦めは後者。-execもxargsも、rmを何度も実行するが、perlにパイプする例では、findとperlしか実行されないので高速かつ負荷が低い。

いや、Perlへパイプする人はあまりいないんじゃないかと…Linuxとかだと、rmもsyncのタイミングでしか実行されないし、xargsも「command(デフォルトは/bin/echo) に文字列群を続けたコマンドラインを実行する」から、そんなに負荷はないんじゃないかな。試してないから確信はないけど。

良いこと棚卸しメソッド

日記のネタが貯まってきたので棚卸しするわけだが。

Sさんが日々、心がけているのは「その日、良かったことを手帳に書く」ということ。自分の良かった点だけでなく他の人の良かった点も書きます。「どんな小さなことでもいいんです。笑顔が素敵だったとか」。そのようなことを書くことによって「今日も良い1日だった。」とその日を終えられます。Sさんはこれを「良いこと棚卸しメソッド」と呼んでいます。

いいですねこれ。マネしてみようかな。「良かったこと」が見つかるかどうかがキモだと思われるが…(w

<a href="http://itpro.nikkeibp.co.jp/article/COLUMN/20060224/230618/">管理者必見! ネットワーク・コマンド集:ITpro</a>

最初はmonyoさんのWindows編だったが、最近密かにLinux編も始まっていることを発見。要ウォッチだ。
とりあえず、

ifconfigコマンドを使えば一時的に使用するMACアドレスを変更して,ネットワークに接続することも可能です。

そんなことができるとは知らんかった(恥

subversionのpropset

リビジョンログを書き換えるときには、repos/hooks/pre-revprop-changeというフックスクリプトを用意する必要がある。極端に言うと

#!/bin/sh
echo 0

とかでもよい。pre-revprop-change.tmplというテンプレートファイルがあるので、これをいじって、実行属性を付けてやればよい。

cp pre-revprop-change.tmpl pre-revprop-change
vi pre-revprop-change
chmod +x pre-revprop-change

打ち合わせ内容を忘れないために

複数メンバーで打ち合わせのために客先を訪問した場合、終了後にそのまま帰社すると、各メンバーはそれぞれの仕事に散ってしまって連絡が取りづらくなるため、打ち合わせで決まったアクションが滞ってしまうことがあります。

 このような場合、可能であれば打ち合わせ終了後に近くのカフェなどに立ち寄って、打ち合わせ内容の確認とすり合わせのためのミーティングを行うとよいでしょう。打ち合わせ直後であるため、記憶が鮮明ですし、客先では言えなかったことや、確認すべき点をクリアーにできます。そして、各メンバーごとに次に何をすべきかのアクションをすり合わせるようにします。

そして客先と認識がすれ違って手戻りが発生するという罠。
そういうことがおきないようにするために議事録ドリブンな会議をする。とはいえ客先にノートパソコンとプロジェクタを持っていくのは面倒。プレゼンをやるなら既に持っているのでそれでもいいけど。
個人的に客先で議事録ドリブンに活用しているのは、

  • 紙とホワイトボードとデジカメ
  • 紙2枚とコピー機

のどちらか。上がなければ下で十分。簡単なことだ。客先での打ち合わせ開始時に手元に紙を一枚用意しておく。議論しながら、アクションが決まったら紙に列挙していく。これはお客さまに見せることを考えない、走り書きでよい。打ち合わせが終わるときに、「じゃあ、我々はいついつまでにこれとこれを検討しておきますので、お手数ですがお客さまはこれをよろしくご検討下さい」と言って、(その場にあれば)ホワイトボードなり、別の紙なりに清書する。ホワイトボードの方が、「いやそうじゃなくて、こうでしょ」とか書き直したりするのに便利なので、どちらかといえばホワイトボードが便利。
清書重要。全ての議論を踏まえて清書することが重要。
あとはホワイトボードをデジカメで撮影して持って帰って画像そのままだったり議事録を書くなりしたのを客先にもメールで送っておくとか、コピーを取らせてもらって原紙を置いて帰るとか。「客先で言えなかったこと」があれば、上の記事の通り、帰りに寄り道でもすればいい…弊社では機密保持のために帰社してからやりますが(わら
ほんとうに簡単。数分で済むことです。是非やってみて欲しい。これをやるとやらないとでは精神的ストレスが全然違います。
やることは決まっているのだから、と安心してなかなか手をつけなかったりするのだが、それはワタシの性格の問題ということで。

Float::EPSILON

Rubyレシピブック(P290)で 比較する数値の差を Float::EPSILON と比較する方法がありますが、記事の例(比較する数値が1.0)はTrueとなってうまくいきますが、それ以外の数値ではFalseでうまくいきません。

比較したい数で割るのを忘れているとか:

$ ruby -e 'x = 10.333333333333333 ; p Float::EPSILON > ((x-31.0/3)/x).abs'
true

おお。そんなやり方が。勉強になります。

EPSILON

1.0 + Float::EPSILON != 1.0 となる最小の値