April 27, 2007

Process Substitution

zshやbashにはProcess Substitutionという機能が備わっていて、これを使うことで一時ファイルを経由せずにプロセス間でやりとりできる。

例えば、あるログからgrepで必要な部分だけを取りだし、またもう一方のログからもgrepで必要な部分だけを取り出して、双方のdiffを取る、という処理をする場合に、これまで一時ファイルを作成してdiffを取っていた。ところが

$ diff -u <(grep foo foo.log) <(grep foo bar.log)

これだけでいいらしい。たいへん衝撃的な出来事だった。
裏では何が行われているかというと、それぞれの出力先fdを/proc/self/fd/nとしてdiffに渡している。

ちなみに、>(process)で出力として使える。

$ grep blog.tagoh.jp /var/log/apache2/access.log | tee >(grep -E '(google|yahoo)' > foo) | grep -v -E '(google|yahoo)' > bar

まあこんなことは普段しないし、しようとも思わないんだけど、出力を何種類かにわけて異なる処理をしたい場合に便利かもしれない。

April 13, 2007

webからテキスト部分だけを抽出する

要件は次のとおり。

  • 整形されてないテキストがほしい
  • 後にkakasiとかでローマ字に分解したいので、もともとASCII文字であるものを区別したい

他にももっとうまい手がありそうだけど、とりあえず以下で落ち着いた。

#! /bin/sh

w3m -dump_source $1 | nkf -w | sed -n -e "/<body.*>/!{x;/<body.*>/{x;\,</body>,{q};s/&nbsp;/ /g;s/<[^<>]*>//g;s,\([-0-9a-zA-Z ().!\"#$%&=^~\\|\`@{};:+*,<>/?_'[]]*\),<ASCII>\1</ASCII>,g;s,<ASCII></ASCII>,,g;s,</ASCII><ASCII>,,g;/^$/{d};p};d};/<body.*>/{h}"


実体参照の置換は他にも必要になるだろうけど、まあそれはそれで。

March 30, 2007

ダブルクリックで選択する文字範囲の変更

先日ちょっとした事故でgnome-terminalのprofileをすべて消失させてしまってから、ダブルクリックによる文字選択の挙動が変わってしまったので、ちょっとメモ。

まず何が悪かったかというと、profileのdialogにある「単語単位で選択する文字」が空だったことで、これによって英数字のみ単語として認識する、という状況だった。これだと、ちょっと不便なので、設定を次のように変えた。

.0-9A-Za-z-

実際にこれを処理しているのがvte_terminal_set_word_chars()で、レンジ指定を可能にするためにハイフンのみ特殊な役割を担っている。よって-そのものを含めたい場合は、その出現位置に注意しないといけない。ややバグっぽい挙動だけど

0-9A-Za-z.-

と記述すると.が無視されてしまう。まあ単独の文字として扱われる条件が

                if ((wbuf[i] != '-') && (wbuf[i + 1] != '-')) {

で、レンジの条件が

                if ((wbuf[i] != '-') &&
(wbuf[i + 1] == '-') &&
(wbuf[i + 2] != '-') &&
(wbuf[i + 2] != 0)) {

となっていて、これに漏れた条件については救済していないのが原因。BK臭が漂ってはいるけれども最初に書いたようにしておいた。

March 28, 2007

rpmでのbuild手順の省略方法

rpmをbuild中にspecファイルの記述ミスとかで、散々待たされた挙句エラー、なんてことを経験したことはないだろうか。そんな時に役立つのが--short-circuitオプション。

-bc-biと組み合わせて使い、それぞれ、%buildから開始、%installから開始という具合に動作する。configureを%prepとかに書いとけば、makeでこけても

$ rpmbuild -bc --short-circuit foo.spec

とかやれば、続きからbuildしてくれる。
ほとんどがconfigureは%buildに書かれているので、便利か不便かはspecの書き方次第になってしまうのがちょっと悲しいところ。

March 26, 2007

URLの補完

URLを入力するときにctrl+enterでwww. + .com、shift+enterでwww. + .net、ctrl+shift+enterでwww. + .orgを補完してくれるらしい。

他にはctrl+Lでロケーションバーに移動とか、ロケーションバーにフォーカスがある状態で、ctrl+UでURL削除とか。その他のEmacs keybindings