似てる、似てない?(5)

そろそろAdvent Calendarなるものが終わろうとしてる。 掃除はまだなんで、Garbage Collectionを呼んでいる。 それにしても、あちこちにAdvent Calendar一覧に有って 読むのが大変。こちらはその総本山かな。越冬用資料だな。

そんな中、 クリスマス・レクチャーってのが、この田舎でも開催されてたんで聞きに行ってきた。 主催者の弁によると、このクリスマス・レクチャーってのの発祥の地はイギリス。 ファラデーの電磁誘導の法則で有名なファラデーさんが、今から190年前に始めたそうな。 一般市民に分かり易く科学を紹介する催し。

こちらのやつは、高校生が主対象。招待講師は母校の先輩。一般にも開放されてて、おじいちゃん、 おばあちゃんの姿もちらほら。いいね、こういう肩肘張らないやさしいのも。 雑誌だと高尚で難しいのは、サイエンス誌。易しく楽しく解説してるのは、ニュートン誌。

おいらは昔、サイエンスを購読してたけど、いつの間には止めていた。最近は図書館から ニュートンを何冊か借りてきて読んでいる。いろいろな分野に渡って記事が出てるんで飽きない。

最近読んだのは時流に即して、iPS細胞の解説特集と、素粒子の特集。専門の本を手にする気構え も無いおいらには、丁度よくまとまっていて気軽に読めるんで、ちょっぴり時代の先端を知った 気分になれる。

レクチャーの方は、砂糖が溶ける仕組みから、原子分子へ誘う話だったよ。途中に出て来る、水 100ccに塩6gを溶かしたら分子の密度はどれぐらいになりますか?とか、酢だったらどうでしょうか? なんてのは、料理の延長みたいで面白かった。人間の舌というか味覚センサーは非常に高感度に 出来ていてびっくり。

まあ、変な物(あの人流に言うと、腐りかけた物)をまだ食べれるか、 判定出来るかは生死に直結するから、鍛えておけって事らしい。だからすっぱさ検出は大事なんだな。

分子は原子が結合したものだけど、その結合が模型に出て来る棒状なものではなくて、バネ様な ものらしい。バネで分子が振動するとか。振動なら運動方程式を立てて解く事により、コンピュータ上で、 いろいろなシュミレーションが出来るとか。こういうのを理論化学と言うそうな。他には、無機化学、有機化学の 分野もあるとか。

そう言えば、創薬の分野で京コンピュータが使われる時代だものなあ。ニュートン誌によると、 京コンピュータのケーブル長は1000kmにもなるとか。すごいコンピュータだと感心してちゃいけないね。 昔に比べて、規模がただ大きくなっただけだからね。ファンノイマンのボトルネックを脱却する のは誰だろう? なんて、レクチャーを聴きながら思っちゃったよ。

世界最大の素数

例のフィボナッチ本を読んでる。その中に面白いトピックスが載ってた。メルセンヌ素数の 発見競争に関する逸話だ。

高校生が今まで知られていなかったメルセンヌ素数を発見したそうな。それに 刺激を受けたクレイコンピュータ社のコンピュータ技師が、スーパーコンピュータをぶん回して 記録更新の挙に出た。

けれどその技師が秘密主義で何も発表しない。その態度に怒り心頭のコンピュータ平民は、 インターネット上で連合を組んだ。分散コンピュータでクレイを負かせてしまおうって訳。

Great Internet Mersenne Prime Searchを見ると、あなたの コンピュータパワーで新発見が出れば、賞金を差し上げますとな。年末ジャンボよりは当たる 確率が高いかも?

The Largest Known Primesへ行くと、 素数のギネス?記録が閲覧できる。次にここに載るのはおいらかな?

primesとfactor

ってな事で、ささやかに素数を求めてみる。素数と言うと格好なコンピュータ言語のネタ。 素数を求めるの、Haskellだと一行で書けるぞとか、女王陛下本ではSchemeとセットにして 大著になってたりする(のかな?)。

けど、*BSD系には、素数を求めるコマンドがすでに用意されている。

[sakae@secd ~]$ primes 2000 2050
2003
2011
2017
2027
2029
2039

2000から2050の間の素数を求めてみた。去年は素数な年だったのね。来年の2013年も素数の予感が したけど、違ったわい。本当かどうか、検算してみる。

[sakae@secd ~]$ factor 2011 2013
2011: 2011
2013: 3 11 61

2011と2013について、素因数分解してみた。2011は分解出来ないけど、2013は、3と11と61と言う 素数の積で表す事が出来る、合成数って事が判明した。

ひひひ、これだけあれば世界記録達成出来るかなあ?と、思ってマニュアル確認したら、32Bitマシンでは 検索の上限が4294967295だよ(64Bitの場合は、18446744073709551615)って、断り書きしてあった。 世の中、甘くないね。

でも、Pythonで高速素数判定なんて のをやってる人を発見したぞ。素数って魔の数だなあ。

気を取り直して、ソースはどうなってるん? 一度お目にかかっておこう。何処にソースが鎮座 してるかと思ったら、両者共、/usr/src/gamesの下にあった。*BSDの人達に取って、数学は遊びの 一種と捕らえているんだな。

emacs dired

以前、似てる、似てない で、emacsから出来たフロー図を参照出来る事を知った。でも、ちょいと 使い難いんだよな。flow *.c して、フロー図を/tmp/flow.png へ吐き出し、それをemacsから C-x C-v で参照するって2段階を踏む必要があるからだ。

一発で参照したいぞ。そう思うとおのずと土台はemacsって事になる。どうやって、変換したいファイルが 入っている所を指定するか? しばし悩んで、emacsには、ディレクトリエディタdired なんて言うファイラーが有る事を思い出したよ。ここから、ファイルが入っているディレクトリを 指定出来たら、御の字だ。

つらつらとdiredの使い方を見てたら、view-modeなんて言う便利なものを発見。見たいファイルに 照準を合せてから(照準を合わせるにはスペースかバックスペースかを押す)v を押せばOK。 ファイルが開くので、スペースかバックスペースで、ページ移動出来る。間違った操作でファイルを 編集しちゃう事もなくて非常に便利。圧縮されたファイルも読めるのね。早く知っとくべきだった。人生の1/10を無駄にしたな。

早く知っとくべきったら、最近のemacsはpdfファイルも読めるのね。 GhostScriptを入れる必要があり(入れるとGambitの提供するgscと名前が被るけど)、見るのは pdfを変換したpngファイルって制限はあるけど、知っといて孫は無い。

で、ここに上記を組み込むにはどうするか? /usr/local/share/emacs/23.4/lispの下を覗いてみた。

$ ls dired*
dired-aux.elc   dired-x.elc     dired.elc 

あろう事かOpenBSDにはソースが入っていない。(後で知ったんだけど、emacs-el-23.4p1.tgzを 入れるとemacsが何やってるか見られるな)よって、改造は無理だなと諦める事にする。以上、終り。 では、話が続かないので、何とかせいよ。

叩き台を叩く

柔軟に作られているLispの事、きっと改造用の口が用意されているはず。そういう方針でぐぐる先生に、 叩き台を紹介してもらう事にした。 そしたら、diredモードでたまたま目にしたhtmlファイルをw3mで参照するにはどうするか、なんて Tipsを紹介されたよ。

(add-hook 'dired-mode-hook
          (lambda ()
              (define-key dired-mode-map "\C-xm" 'dired-w3m-find-file)))

(defun dired-w3m-find-file ()
  (interactive)
  (require 'w3m)
  (let ((file (dired-get-filename)))
    (if (y-or-n-p (format "Open 'w3m' %s " (file-name-nondirectory file)))
        (w3m-find-file file))))

これを、.emacsに書いておけとな。htmlファイルに出会ったら、C-xmすれば、emacs-w3mが自動 起動してくれるぞうな。 そう思って上記S式を読み解いてみる。

最初の式は、diredモードにフックをかける定義だ。C-xmが押されると、二番目のS式が実行 されるんだな。 これって、C言語なんかでSignalをハンドリングする時、ハンドラーと設置するのと同じ考え方だな。

二番目の式は、まず、dired-get-filenameでカーソル直下のフルパスを取得。if式のtest節で w3mをファイルに対してオープンするけどよかんべー?って聞いてくる。yesだったら、w3mを実行。

よし、これを叩き台に改造するぞ。とは言え、いろいろと参照しましたよ。例えば、 Elisp CookbookGNU Emacs Lispリファレンスマニュアル とかね。

(add-hook 'dired-mode-hook
          (lambda ()
              (define-key dired-mode-map "\C-xm" 'dired-show-flow)))

(defun dired-show-flow ()
  (interactive)
  (let ((cmd (format "flow %s/*.c" (dired-get-filename))))
        (shell-command-to-string cmd )
        ;;(message "%s" cmd)))
        (find-alternate-file "/tmp/flow.png")))

登録名は適当に変えた。キーバインドは、他にどんなのがいいのだろう?分からないので 取り合えず、そのまま。

実際の手続きは、シェルに渡すコマンド列を作り、それを実行。それから、pngファイルを開くって 流れ。間にコメントが残ってるのは、どんなコマンドが渡されているか*Messages*バッファー (ミニーバッファーに表示もされた)に記録を残すためだ。*Messages*って、emacsのログファイル(バッファー)なのね。 それから、flowってコマンドは、一連記事の4回目でおいらが勝手に作ったコマンドね。

で、使ってみると、ファイルを表示した瞬間にdiredのバッファーが居なくなってしまって、次の ディレクトリを見るのに、またdiredを起動しなければいけなくて、ちと使い心地が悪い。

(defun dired-show-flow ()
  (interactive)
  (let ((cmd (format "flow %s/*.c" (dired-get-filename))))
        (shell-command-to-string cmd )
        (switch-to-buffer "flow.png")
        (find-alternate-file "/tmp/flow.png")))

pngファイルを開く前に、専用のバッファーを用意した。これで、diredが破壊されなくなった。 diredに戻る時は、C-xbでOK。(本当は、かっこよくqで戻りたいんだけど。。。)

Version UP

どうせ乗りかけた船。もう少し頑張ってみる。お手本はやはりw3mのdired-mode。w3mで閲覧してて、 qを叩くとhtml画面が消えて、dired画面に戻る。だったら、それのまねをすればいいじゃん。 で、site-lispの中にあるw3m.elを見たんだけど、頓挫しました。とっても複雑(w3mの挙動を メニューから変更出来るように、あれこれやってるみたい)でどこから手を 付けていいのやら。即刻撤退。

次に目を付けたのは、diredからのviewモード。こちらもファイルを閲覧し終わってqを叩くと、 dired画面が復活してくる。

dired.elを開いてそれらしい箇所を探すと

(defun dired-view-file ()
  "In Dired, examine a file in view mode, returning to Dired when done.
When file is a directory, show it in this buffer if it is inserted.
Otherwise, display it in another buffer."
  (interactive)
  (let ((file (dired-get-file-for-visit)))
    (if (file-directory-p file)
        (or (and (cdr dired-subdir-alist)
                 (dired-goto-subdir file))
            (dired file))
      (view-file file))))

これを見ると、通常ファイルの場合、view-fileを呼んでる事が分かる。view-fileって名前が体を 表している典型だけど、一応emacsのmanを引いてみる。C-h f view-file

view-file is an interactive compiled Lisp function in `view.el'.

(view-file FILE)

View FILE in View mode, returning to previous buffer when done.
 :

view.elの所がリンクになってるので、TABキーを使って照準をそこに合せてリターンキーを叩くと、vlew.el中の 該当箇所に飛んでくれる。emacsが元祖htmlだったとはつゆ知らず。CERNのそれとどっちが 早かったんでしょうかね?

ちょいと脱線します。 ニュートン誌の素粒子の特集でCERNの紹介が載ってた。原子を更に細かくして分析するため、超光速で原子同士 を衝突させる必要があるとか。(なかなか原始的で面白いな)そのための巨大な設備があるのがCERN。そこで離れた 所にあるデータを簡単に参照出来るようにって、片手間で物理学者が考え出したのはWWW。CERNの 所長がインタビューで自慢してたぞ。

おいらが初めて立てたWebサーバーは、CERN httpd だったよ。元祖のやつを使ったんだな。 それから、ヨーロッパに負けてなるものかと対抗意識丸出しで米国製のWebサーバーが開発された。 NCSA httpdって名前だったな。これも使ったな。いろいろpatchを充てながら。 そうこうしてると、いろいろpatchを充てるのに嫌気が差してきた人がいた。パッチは一つだけって 願いで、apache httpdが生まれた。これは、おいらも永らく愛用したよ。それ以降の新目の やつは、おいら知らないよ。逆に、 古い古い、CERN httpdなんて知ってる人は少ないだろうね。

話を戻します。 で、view minner-modeってのを有効にすると、いろいろなコマンドをハンドリングしてくれるみたいだ。 だったら、view-modeも加えちゃえ!

(add-hook 'dired-mode-hook
          (lambda ()
              (define-key dired-mode-map "\C-xf" 'dired-show-flow)))

(defun dired-show-flow ()
  (interactive)
  (let ((cmd (format "flow %s/*.c" (dired-get-filename))))
        (shell-command-to-string cmd )
        (switch-to-buffer "flow.png")
        (find-alternate-file "/tmp/flow.png")
        (view-mode)))

どうやら、これで望む動作をしてくれるようになった。パチパチパチ。 ついでに、微妙にキーバインドを変えておいた。まあ、キー割付の取り合いで、set-fill-column に勝ったって 事です。

ついでに、view-modeのキー割付を見ておく。いちいちC-h m するの面倒だからね。

SPC     scroll forward "page size" lines.
          With prefix scroll forward prefix lines.
DEL     scroll backward "page size" lines.
          With prefix scroll backward prefix lines.
z       like  SPC  but with prefix sets "page size" to prefix.
w       like  DEL  but with prefix sets "page size" to prefix.
d       scroll forward "half page size" lines.  With prefix, sets
          "half page size" to prefix lines and scrolls forward that much.
u       scroll backward "half page size" lines.  With prefix, sets
          "half page size" to prefix lines and scrolls backward that much.
s       do forward incremental search.
r       do reverse incremental search.
/       searches forward for regular expression, starting after current page.
          ! and @ have a special meaning at the beginning of the regexp.
          ! means search for a line with no match for regexp.  @ means start
          search at beginning (end for backward search) of buffer.
\       searches backward for regular expression, starting before current page.
n       searches forward for last regular expression.
p       searches backward for last regular expression.
q       quit View mode, restoring this window and buffer to previous state.
          q is the normal way to leave view mode.

以上、おいらが良く使いそうなやつでした。

来年は

今年の更新はこれで終わりです。そろそろ本物のGCをしないと、女房に怒られますからね。何時も 思うんだけど、インクリメンタルGCを常に行っていれば、年に一度のジャイアンツGC なんてする必要ないだろうに。

いやいや、ジャイアンツGCは、神様をお迎えする儀式です。ちゃんとやりましょう。 それが日本人の心の有り様です。

来年のリンクは、 http://space.geocities.jp/hamesspam/から 辿ってください。

それでは、よい年を。