2005-04-02 [長年日記]
■はじまりの骨の物語 (富士見ファンタジア文庫)(五代 ゆう/米田 仁士) を読んだ
ぬうぅ、不覚! こんな面白いファンタジーを読みのがしていたとは!
異形コレクションシリーズでいくつかの短編を読んで、気になる作家の一人となった。デビューはまさに私がライトノベル(とは当時は呼んでなかったけど)を一番読んでいた頃。だから名前を見たときにはこのデビュー作の表紙を思い浮かべることができた。
で、BOの105円棚で見かけたときには迷わず手に取った。
いや、面白い。これは「ファンタジー風」でもなく「ライトファンタジー」でもなく、間違いなくファンタジー小説だった。
氏が女性であることをこの本で初めて知った……。
■インプットよりもアウトプット
最近Perlがらみのをエントリを書くことが多いが、これはインプットよりもアウトプットすることで自分の中の理解が進み、知識が体系化されると思っているからだ。
「習うより慣れよ」の言い換えと思ってもらっても構わない。が、自分はインプット−アウトプットの組み合わせを、2組想定している。
1つは「本を読む,サイトで調べる」というインプットと、「ソースを書いてみる」というアウトプット。
もう1つは「実際に実行して動作を確認する」というインプットと、「どういう書き方をすればどういう動作になるか、ということを記述する」というアウトプットだ。
結局1つめのインプットの材料を自分でアウトプットしていることになる。このループを何回か繰り返すと、自分の中の知識がより強固になると信じている。
(追記:ループというよりは、1つ目のインプットとアウトプットを、自分なりに逆方向に作業している、と考えた方が自然か)
最後のアウトプットは、あるいは、人に言葉や図で説明することで成されるかも知れないが、一人で仕事をしているケースだとこういう場に書き連ねるのがいいのかなぁ、と思ってそうしている。
■Rubyでオブジェクト制約言語
例えば、頻出するつまらない例「Account(口座)クラスのbalance(残高)が0以上である」をOCLとRuby-OCLで比べてみる。
OCL:
context Account inv: self.balance >= 0
Ruby-OCL:
Account.inv do | context |
0 <= context.balance
end
これってイテレータ(ブロック)そのままじゃないの!プログラマの思索: Ruby-OCLの方がずっといい!
OCLのソース self.balance からは属性に対する制約のイメージしか沸かないが、Ruby-OCLのソースからは 0 <= context.balance というブロックをEval(評価する)というイメージになる。このイメージの差は大きい。
が本題なのだけど、むしろ
Rubyの特徴はオブジェクト指向よりも、Lispのように処理そのものをデータのように扱えるブロックにあると思うが、こんな所で出てくるとは。
プログラマの思索: Ruby-OCLの方がずっといい!
こちらの方に同意してしまう。
■REDHAT ESの代替
すでに質問がキャンセルされてしまって元を辿ることはできないが、
RedHatLinux ES version3 update4でapt-getをインストールしたいのですが、CD-ROM(4枚)内にもhttp://apt.freshrpms.net/にも i386のrpmはないです。ESでは、apt-getは仕様にないのでしょうか。そうだとしたら、apt-getの代わりになるのはなんでしょうか。すいませんが
という質問があった。
apt-getとは違うけど、
というのがあるということを知った。
サイトのPurposeに
CentOS 2 and 3 are fully compatible rebuilds of RHEL 2 and 3 respectively.
とある。
■Perlである程度以上のシステムを書いている
今までPerlは「スクリプトがエディタ1画面で収まる」程度のテキストフィルタぐらいでしか使ったことがなかったけど、今回は「モジュール分割をすべき」と判断する程度のシステムを構築している。
あと、他のモジュール(package)をバックエンドというか、フレームワークとして使用する、というのもほとんど初めて。
で、そのモジュールのソースを読んでも、どう使っていいのかちっとも判らない。どうやらこれはPerlにおけるオブジェクト指向の作法が判っていない所為だと感じたので、書籍を探してみた。
本屋で端から端まで (といってもそう多くはないけど)目次を読んで、これが良さそうだと目星を付けて買ったのがこれ。
JavaやRubyのオブジェクト指向に慣れて、Perlのソースを読んでも訳判らん人は、この本の 2.21(p147〜p156)を読むととてもよく判るのでないかと。
p147から引用すると
Perlのオブジェクトは次の三つの定義で表せると言われている。
- Perlのオブジェクトはリファレンスによって指し示されるものである。
- クラスはパッケージである。クラスはオブジェクトを扱うためのメソッドを提供する。
- メソッドはサブルーチンである。第1引数としてオブジェクトのリファレンスを取る。
(本当は丸付き数字だが、Webでの公開上、数字付きのリストで示した)
リファレンスというのは値渡しに対する参照渡しのための機構。Cで言うポインタ化演算子の*に近い。
ただし、Perlではリファレンスも普通の変数 $hoge にお構いなく代入できるので、$hoge がスカラー変数なのか何かのリファレンスなのかを注意する必要がある。
もちろんその辺を調べるための演算子*1は存在する。isa や ref がそうだ。
で自分なりの理解を以下に示す。
- ざっと見たところ、オブジェクトのインスタンスは連想配列(ハッシュ)のリファレンスで作成することが多い。他の言語で言うオブジェクト内の変数は、連想配列の key=>value の関連づけで扱われることになる。そして value がさらに配列や連想配列のリファレンスであることが多いので、ソースを注意深く見るか、refを取って調べたりしまくったりする。
- とはいえ、注意深く設計されたオブジェクトであれば、そのインスタンスがどんな構造のリファレンスであるかを調べなくてもいい様なメソッド群を用意しているだろうし、またするべきである。
- パッケージ内のサブルーチンは第1引数としてオブジェクトのリファレンスを取る、と書いたが、これはもう構文上の「約束ごと」と捉えて良い。それは以下に示す。
クラスやインスタンスの作成はもうこんなもんでよい。
package Hoge; sub new { $self = {}; #空の連想配列へのリファレンス。 : :初期化処理 : bless $self; $selfがpackage Hoge であることを明示する(定義づける)。 #bless の返り値は第1引数そのものなのでこの記述で良いが判りづらければ # return bress $self; #とか # bless $self; # retern $self; #と書けばよい。 } sub doHoge { $self = shift; #第1引数はリファレンスなので、shiftして受け取る。 #newで作った$selfが代入されるわけだ。 #続きはただのサブルーチンの要領で書けばよい }
で呼び出し元は、
$hoge = new Hoge(); $hoge->doHoge(var1, var2);
でよい。この$hoge->doHogeがもうシンタックスシュガーの様なもので、「$hogeがリファレンスで何かのパッケージに結びついてれば*2、そのパッケージのdoHogeを呼び出す。その時に (var1, var2) という表記上の引数の前に$hogeを第1引数として追加してやる。」という構文なわけだ。
以上、自分の理解のメモとして示しておく。
また訳わかんなくなったらここを読むのだ。
あと、自分が持っているPerl本を示しておく。
何かのメソッドやサブルーチンでは無さそうな、謎の単語が出てきたらこの索引をまず読む。また演算子の優先度順についてもこの本をまず参照する。
こんなことがしたいんだけど、と思ったら、
の目次を参照する。これを読んでも理解が及ばないようなら最初に挙げた 実践実用Perl―テキスト処理の基礎から情報ポータル構築まで(藤岡 和夫) を読む。
■Yahoo,集団訴訟を受ける
幸い私は、sellerとしてもbuyerとしても詐欺にあったことは無いけど、相当数発生しているんだろうし、個別に対応を迫っても何もしてくれないだろうというのは判る。
それで集団訴訟という形をとったのだろう。
裁判が長引けば「ヤフー」ブランドを使用しているYahoo!BBなども多少の影響を受けるかも知れない。
いや、今までYahoo!BBのせいで「ヤフー」ブランドが影響を受けていたのに比べれば全然対したことはないかと……。