Zipfの法則というのを知っているだろうか。何らかのランキングを取ったときに、その順位とスコアを両対数でプロットすると直線的に減少するという性質のことだ。
もともとは言語学の話で、ある一定の長さの文章から単語をカウントしていって、多い順に並べる。その順位と、出現回数をプロットするところから発見された概念。ただしほかにもいろんなところで出てくることが知られていて、まあ実例は↑でリンクしたウィキペディアの記事を見るなりなんなりしてちょーだい。ちなみにわたしも前に日本語でZipfの法則が成り立つかどうかということを書いたことがある。
で、掲題の話。
ふと、「コマンドの履歴ってどういう分布になっているのかな」ということが疑問になったわけだ。というか、疑問というよりもそれが Zipf 分布に従っていたりしないものかな、とまあそういう感じで。
というわけで、手元にある10万行を越える .zsh_history からコマンド名のところを抽出して、頻度を計算して両対数プロットしてみました、ってのが↓コレ。

というように、 zipf の法則に従っているわけではないということがわかった。ランキングの低い方はわりと綺麗に分布しているんだけど、高いところで鈍っちゃうらしい。うーむ。↑の「日本語でも……」のもやっぱりランキングの高いところで訛っているんだが、ここまでではないし。
まあ、そういうことでした。「だからなに」っていわれると返す言葉もないですが、なかなか面白いよね。
ちなみにわたしの履歴から、よく使うコマンドトップ20。
>
ls
>
less
>
cd
>
sudo
>
make
>
rm
>
runghc
>
grep
>
pd (popd のエイリアス)
>
man
>
darcs
>
kz (kazehakase のエイリアス)
>
exit
>
./a.out
>
vi
>
fg
>
su
>
xinit
>
ghci
>
emacs
だいぶ前から取っているので、今はぜんぜん使ってないもの(xinitとか)もけっこう出てくるなあ、という感じですね。 runghc がやたらあるのは、 Haskell のモジュールを何度もインストールしたりテストしてみたりする上に、1回のインストールで最低でも「configure」「build」「install」と3回が必要だから、かな。 Cabal によるインストール以外では runghc は使ったことないはずなので。
ちなみに emacs より vi の方が上なのは、 emacs はログインすると自動的に起動するようになっているため、端末を叩いて起動させることが滅多にないから。そのわりに上位にあって驚いた。
料理はプログラミングに近いと思う。
ことに、自炊はハックだ。
高級料理店では、シェフがすべてのレシピを完成させ、みんなでレシピに従って素晴しいメニューを作る。この過程にはあまりハックを感じない(けれど、そのレシピには数多くのハックが潜んでいるのだろう)。
自炊はアジャイルだ。作りながらレシピを考える。いま冷蔵庫にある食材から最適なメニューを選択する。テスト(味見)を繰り返しながら、リファクタリングをして完成に持っていく。
とかなんとか。
オチはありません。
しばらくは遊べないが(時間ばっかりくってしまうので、いやまあそういうものなんですが)。
オモロパズルを見てみたら、いかにもゲサク風な新作だなあと思ったらゲサク作で微苦笑。いわゆるペンシルパズルのルールというのは非常に手続的というか、手続き+制約条件によって成立しているのだけど、彼のルール(彼が好きなルール)は極めて宣言的であり、あるべき最終状態しかルールでは規定していない。というあたりがウケの悪いところなのだろうという気がする。よーするに不親切ということなのだけど、「これを解くプログラムはどう書けるか」という問題に取り組みたくなるようなタイプの記述になっている。ような気がする。 Haskell なら綺麗に書けます系だ。
http://d.hatena.ne.jp/scinfaxi/20070610/1181450274 などを読んでモヤモヤと思ったことを書く。
情報系の学科で過ごしてきたりTAとか講師とかをやってきたぼくだが、実感として決して女性は少なくない。積極的に多い方ではないけれど、それなりの率はいる。会社にだってそれなりの率でいるだろう。webでどれくらいの女性がいるのかは知らないけれど。
いわゆる「著名人」にしたところで、エイダまで遡らなくてもけっこういるよね。そうだな、たとえば坂本文とか(『たのしいUNIX』はお世話になりました)。そういえば、書籍の著者でも、女性の割合が決して少なくないんじゃないかな。むろん、この業界の研究者に女性が少ないかっていうとそんなことはない。
にもかかわらず、いわゆる「テック系」「プログラミング系」と呼ばれるイベント、勉強会の類いでは、女性にはあまりお目にかかれないような気がする。その割合は、上で類推した割合と比較してもちょっと異常なくらい低いとぼくは思う。
いわゆる「男性的」「女性的」という区分を導入するなら、これほど奇妙な現象はない。なぜなら、こういう勉強会やイベントは、人間を見に行く、実際に会ってみるという意味合いが強いモノだからだ。webとかで技術的な議論をするより、ミーティングに行く方がよっぽど「女性的」なんじゃないの?
じゃあなんでなの、っていう簡単な、唯一の理由というのはないと思う。強いていうなら、なんとなく行きづらい空気が醸成されているというような曖昧模糊としたものですね。ホモソーシャルな空間に異性が入り込むのは、そもそもが負担なんですよ。そういう単純な(しかしそれだけに容易には解決できない)理由なんじゃないかなー。
あと、こういうギークたちは(男性の)おたく文化(≠アキバ系)と非常に隣接していて、そういう雰囲気(あるいはそういう雰囲気がありそうだという印象)が、女性の足を遠ざけているんじゃないかと思うんだよね。ま、同じことですか。
そういえばこちらに書いたことはなかった気がするが、これでもいちおうローカスは購読しています。ローカス(Locus)ってのはアメリカで最も有名なSF情報専門誌。部数的には「セミプロジン」と呼ばれます(まあそれを言ったらS-Fマガジンだってセミプロジンですけどね、その基準では)。公式サイトは http://www.locusmag.com/
まあ月イチで来ても舐めるように読むというわけには行かず、ぱらぱらめくって面白そうなところをざっと見てるだけなんですけれど。昨夜はそのローカスの最新号が届いてました。インタビューはナロ・ホプキンソン。邦訳はまだない作家ですね。加藤逸人さんが褒めてた気がするけど、わたしも読んだことがない。
今号にはネビュラ賞パーティの様子の写真がありますが、フォーマルな服装の受賞者のなかでなぜかひとりラフな格好のピーター・S・ビーグルがいい感じです。微妙に自信なさげな表情なのも妙におかしい。
あとギャリー・ウルフが書評で、ドゾワの The New Space Opera
をベタ褒め。ハートウェルが昨年、 The Space Opera Renaissance という巨大なアンソロジーを編んだんですが、そのときは貶しまくりだったのに、今回はそれも引き合いに出して褒めてた。ちょっとハートウェルが可哀想にならんでもない。
あと、広告があってはじめて気付いたけど、今年はハインライン生誕100周年なのですな。 http://www.heinleincentennial.com/こんなイベントがあるらしい。
追記: そういえばローカスは海外への船便をやめてしまったらしい。これまで、日本で購読する場合は個別に船便で送付してもらうという手と、航空便で送ってもらうという手があって、船便の方がちょっと安かった。ただし一ヶ月以上遅れることもざらということだったんだけど。ちなみに航空便は、日本でローカスのとりまとめをしている翻訳家の小川隆さんのところにいったん届けられ、そこから国内に配布されるという仕組みです。
ふと見てみたら、いつのまにか amazon に「商品プレビュー」という機能が追加されていることに気付いた。「テキスト形式」のリンクにマウスカーソルを合わせると、画像つきのポップアップが出るという仕組みらしい。
テキストだけの方が可搬なのでいいんだけど表紙を見えないのがねえ……と思ってたのでこれはいいですね、ってことでさくっと導入してみた。どうでしょうか。個人的にはなかなかいいと思いますね。ただ、スクリプトのロードがちょっと遅いかな。まあでも許容範囲内でしょう、と思いたい。
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/43602で、いわゆる JRuby と cruby (1.8.6) のパフォーマンス比較の議論がありますね。わたしもちょっとしたベンチマークテストは試してみたことがあるんですが、確かに JRuby は現行の Ruby 1.8.6 と比べてさえ遅くて「どうしたものなのかなあ」と思っていたところでした。とはいえ、テストはフィボナッチ数列とかそういうレベルのモノですが……。
ちなみにそのときの速度差は yarv >>> ruby 1.8.x > jruby な感じ。それと、 jruby は jvm の初期化か Ruby のランタイムのロードか何かに時間を食うのか何かわかりませんがスクリプトの起動にもちょっと時間がかかって、コマンドを叩いてから終わるまでの時間でいえば ruby 1.8.6 よりも明らかにめちゃくちゃ遅い。まあ、ちょっとしたスクリプトならともかく、エンタープライズな用途とか本格的な重い処理を考えればそういう初期化の時間は無視してもいいと思いますけれど。
もちろん「これから速くなります」っていう可能性とか、 JVM の方が jit がこなれているから凄いことになりますよとかいう話は理解可能なのですが、今後のことを言ったら ruby 1.9 以降だってどうなるかわからんわけですし……。今のところの個人的な印象としては ruby 1.9 以降の方がパフォーマンスが上という状況は、少なくともしばらく先まで変わらないんじゃないかと思いますけどね、まあ直感ですが。
あと JRuby って(試したのは 1.0RC1 とかでしたが)、バイトコードコンパイルしようとすると case 文をコンパイルできないというエラーを吐いたりして「なんじゃそりゃー」と思ったりしたんですが、本当に 1.8.6 互換なんでしょうか。いや、スクリプト実行なら実行できるからいいんですけど、マニアックな処理のところはけっこうアヤしいんじゃないかなあと思っていたり。このほど 1.0 がリリースされたらしいですが、どうなっていますかね。
そういえば今日は RubyKaigi ですか。
初回いらいぼちぼち眺めたり眺めなかったりなマイコミジャーナルの漢のzshだけど、今回で「取り上げてほしいネタ」を募集してますね。
うーん、といっても、あとは「ある意味ですごい便利なんだけど、使わない人はさっぱり使わない」系の機能しか残ってない気はするなあ。
とりあえずすぐ思いつくのは次の2つ。
コマンドラインスタック
コマンド行に何かを打ち込んでいるときに、 ^[q (Escを押してからq)と打鍵をすると、そのコマンドが消えて新しい行になる。その新しい行で何かコマンドを打ち込んで終了するとあら不思議、コマンド行が ^[q の直前の状態に戻っているとゆー。
これは、たとえば何かファイルを作成する処理を書いている途中で「あしまったそもそもディレクトリを作んなきゃダメだ」と気付いたりしたような場合に便利だ。もちろん「スタック」というだけあって、何度でも繰り返せる。
複数行編集
zsh はヒストリでは、複数行をいっぺんに記憶している。たとえば、
% for i in {1..10} do
> echo $i
> done
みたいな処理でも3行でヒストリに入る。ぜんぜん覚えてくれない tcsh は論外としても、たしか bash はこれが1行になってしまうような気がした。わたしは複数行の方が嬉しい(けどまあ人によるかもなあ)。
WORDCHARS
単語区切り文字の指定。 zsh に限らずシェルでは ^w で1単語が削れるけど、どの文字までを1単語とみなすか、という処理のカスタマイズが可能(これはまあ、わりにどのシェルでもできることだったはずだが)。 zsh では WORDCHARS という変数に「単語境界にならない記号」を与えることでこれをやる。わたしの設定では、
WORDCHARS='*?_-.[]~=&;!#$%^(){}<>’
となっている。 / が入っていないのがミソで、適当なパス名を入力中に ^w を打鍵すると、ディレクトリ名を区切る / が空白文字のような単語境界となっているため、ちょうど1ディレクトリ分だけを削除できる。これ、けっこう便利だ。パス名をすべて消したいっていうのは、あんまないと思うんだよね(まあこれも人によりましょうが……)。
あとまあ compdef とかいろいろあるんだけど、どうも一つ一つは小粒なネタになっちゃうんだよね。なかなかありません。
えーと、以上のような内容を(こんなにぐだぐだ書かないけど)情報提供の予定。
そういえば知り合いに教えてもらったんですが、SFオンラインが今月をもって閲覧終了となるようです。
いや、びっくりしました。
冷静に考えれば終了からもう5年もたっていて、いつ予告なく消えてもおかしくない状況で「よくいままで残ってたな」というのが正直なところでしょうが、なんとなくこのままズルズルと生き残ると思ってました(笑)。
ちょっと説明すると、SFオンラインとは(たぶん)国内初か、でなくても国内では最初期のオンライン商業誌。創刊は(今はまだバックナンバーを見ればわかりますが)97年の2月。わたしが読みはじめたのは2000年くらいですかね。創刊から5年が経過した第60号を持って終了、となったのでした。
あの頃からのネットSF者はたいていそうだと思いますが、やっぱりわたしも毎号読んでおりまして、本当にお世話になりました、と改めて。
でもまあこのまま消えるのは仕方ないとしても個人的には保存しておきたいっつーことで、
% wget -r -np -l10 http://www.so-net.ne.jp/SF-Online/
% ruby -rfind -rfileutils -e ‘Find.find(‘.’){|f| if /(.*)¥?/ =~ f then (File.exist?($1))? FileUtils.rm_f(f) : FileUtils.mv(f, $1) end }
などとして保存しておきました。ホントは -linf だったけど、止まってないっぽい挙動だったので(ディレクトリが / → // → /// → と重なっているっぽい挙動で、それくらいは wget 側で処理してほしいかなあという気もちょっとした)、途中で停止しました。デフォルトの -l5 だとこれじゃちょっと足りないみたいだけど、まあ -l10 くらいなら足りるんじゃないですかね。
あと、実はSFオンラインのファイルにはフルパスの指定が山ほどあるため(wgetはhtmlファイルの書き換えとかはやらんので)アンカーや画像はぜんぜん機能しなくなり、ようするに手元に保存しても読むのはえらい面倒くさいことになるんですが、とはいえひとまずとりあえず何か情報が欲しいときには全文検索をして当該ページを閲覧できるようにはなるから、それでいいかな。
Mac OSX 対応ってことで手元でビルドしてみた。
うーむ、 Carbon Emacs と比較すると、あの外部パッケージをアグレッシブに取り入れる態度まではさすがに本家には期待しないとしても(だいいちわたしはそんなにあれこれ入れないので自力でなんとかなるのだが)、透過ができないよ。
さてどうしようかなー。