«前の日記(2004-09-09) 最新 次の日記(2004-09-11)» 編集

Matzにっき


2004-09-10 [長年日記]

_ [X31]問題解決

いくつかの問題は解決した。まずは旧マシンの問題から。

以前書いた時計が狂う問題だが、 Thinkpadでも発生したのでハード的な原因ではないことが判明。 いろいろ調べたところ adjtimex パッケージが時刻にドリフトをかけていた。 こんなパッケージいつ入れたっけ。adjtimexパッケージを削除して解決。

次に、Speedstepとサスペンドだが、 うまくいかないカーネルのブートログを、うまくいくカーネルのログと見比べると、 以下のようなACPI関連のものが増えていた。

Sep 10 10:02:14 localhost vmunix:     ACPI-1133: *** Error: Method execution failed [\_SB_.PCI0.PCI1.DOCK.IDE1._STA] (Node efa7ef60), AE_AML_NO_RETURN_VALUE
Sep 10 10:02:14 localhost vmunix:     ACPI-0154: *** Error: Method execution failed [\_SB_.PCI0.PCI1.DOCK.IDE1._STA] (Node efa7ef60), AE_AML_NO_RETURN_VALUE

configはCONFIG_X86_SPEEDSTEP_CENTRINO_ACPI以外全く同じはずなのに、 動作が異なるのは解せないが、ここはあまり追求せずACPIをoffにしたカーネルを作ったところ、 みごと望み通りのSpeedstep + APM suspendが実現した。

しかし、ちょっと試す度にカーネルのフルコンパイルが必要なのはつらかった。 慣れてればもっと上手な方法があるんだろうけど。

ついでだが、これについて調べている途中で見つけた、 tpbというプログラムは収穫であった。画面の切り替え、輝度の操作、ボリュームの操作などを画面に表示してくれる。 Thinkpadユーザはお勧め。

最後、コンピュータとは関係ないんだけど、夕べから今朝にかけて雨が降ったが、 どうやら雨漏りはしていないようだ。 大家さん、ありがとう。

_ [Ruby]callを省略する

Martine FowlerがRubyを使ってクロージャについて紹介している(日本語訳)

確かにクロージャはすごく便利なんだけど、 Rubyのクロージャはcallメソッドを使わないと呼び出せないので、ちょっと気持ち悪い。 まあ、Lispでもfuncallを使わないといけないので「絶対駄目」というほどではないけど。

とはいえ、SchemeやPythonのような

foo.bar(1)

を「foo.barというメソッドオブジェクトを取り出し、1を引数として呼び出し手続きをapplyする」というような セマンティックスは避けたい。 やはり、これはRuby的には「fooに1という引数とともにbarというメッセージを送る」という意味づけをしたいのだ。

で、考えたんだけど、

  • 変数に()がついていた場合には、変数に格納されているオブジェクトの「()」メソッドを呼び出す

というのはどうだろうか。現在、「call」の代わりに「[]」を代用したりしてるけど、 これをずばり「()」メソッドにしちゃうと。そうすると、

fact = lambda{|n| if n == 0 than 1 else fact(n - 1)* n end }
fact(10)

のように書けて気分が良い。

欠点は互換性だ。そんなに凶悪ではないけれども、 ローカル変数名と同じ名前のメソッドがレシーバを省略して呼べなくなる。 あんまり頻繁に発生しそうではないが。

もう一つの問題は大文字で始まる名前のメソッドだ。 Rubyには少数だが大文字で始まるメソッド(Array()とかString()とか)がある。 ローカル変数と違って、定数は定義されているかどうかがコンパイル時にはわからない。

これについてはいくつかの対処法が考えられる。

  • 定数は「()」呼び出しの対象外。
  • 定数に「()」がついたら、実行時にその定数が定義されているかどうかを判定し、 定義されていれば定数の値に「()」呼び出し、定義されていなければその名前のメソッド呼び出し
  • 定数に「()」がついたら、いつも「()」呼び出し。 呼べなくなる「String()」メソッドなどは、Stringクラスに「()」メソッドを定義することで対応。

くらいか。採用するなら、一番きれいなのは最後のものだな。

ただ、Rubyの組み込みの範囲内では大文字で始まるメソッドはクラス名と同一で、 変換を行うものばかりなので最後の案でも問題なさそうだけど、 他で大文字で始まる名前のメソッドを持っているプログラムには、 メソッドの名前を変えるしか対処方法がないのは移行の問題があるかもしれない。

仕様を決めてしまえば、実装はすぐに頭に浮かぶし、たぶん15分くらいでできそうだ。

もっとも、今parse.yを変更すると青木くんがギャッといいそうなので、 手をつけるのは我慢しよう。

_ [Ruby]『るびマ!』

水面下で作業中であった『るびま』こと、『Rubyist Magazine』がとうとう創刊しましたよ。言語をネタとした読み物としてのWeb雑誌というのは、 なかなか面白いスタンスではないかと自画自賛。

とはいえ、私はインタビューに答えただけであとは編集部の皆さんのおかげです。 お疲れさまでした。

追記:

CNET Japanでも取り上げられているぞ。ちょっと感動。

本日のツッコミ(全4件) [ツッコミを入れる]
_ tanimasa (2004-09-10 18:59)

うちも,カーネルを10回ほどコンパイルしました.疲れましたョ〜.apmの設定とか参考にさせて頂きます.(_ _)

_ ささだ (2004-09-10 23:36)

いろいろ根回しがあったのです>CNET

_ Gimite (2004-09-11 22:29)

メソッドの戻り値に対しても()演算子は使えるのでしょうか。<br>hoge.foo()() とか…?

_ まつもと (2004-09-11 23:48)

もうちょっと考えないと「できる」とは言えません。>Gimiteさん<br>当面は一時変数に代入する必要があると思っていてください。

お名前:
E-mail:
コメント:
[]

«前の日記(2004-09-09) 最新 次の日記(2004-09-11)» 編集

track feed Matzにっき Creative Commons License This work is licensed under a Creative Commons License.