Archive for November, 2009

垂水雄二『悩ましい翻訳語』

Posted by 向井 淳 on Monday, 30 November, 2009

悩ましい翻訳語―科学用語の由来と誤訳

これは良い本だ。

『利己的な遺伝子』などの翻訳で著名な垂水雄二氏が、世に広まっている(主に生物・医学系の)訳語のうち、誤訳しがちなものや事例、誤訳が広まっているもの、誤解から生じた訳語、ちょっと見てていたたまれなくなる訳語、などを解説したエッセイ集。一本一本の内容は比較的短く、軽妙でわかりやすい文章に仕上がっており、ぱらぱらっと興味のあるところだけつまみ食いするといい本になっている。

語られる内容も、それが誤訳だと断定して終わりなのではなくて、その訳語の起源や歴史を紹介したり、代替案を考えたりしていて、そこで語られる蘊蓄がまた面白い。

著者はキャリアの長い翻訳家なので、代替案といっても含蓄がある。たとえば oak (オーク)という樹木を樫の木と訳してはなぜだめなのか。日本にはオークという樹木は厳密には存在しない。海外文学を訳したりしていると、日本には存在しなかったり非常に珍しかったりする動植物がごく普通に描かれるのだが、ここで訳者は苦慮する。学名やら対応する標準和名(やけに長い)では雰囲気が台無しだ。だから、概ね似たような動植物に置き換えて翻訳するということはよく行われている。というのを踏まえた上でなぜ oak を樫と訳してはいけないかというとヨーロッパ文学に登場するのは落葉性のイングリッシュオークだからであり、訳すならコナラなどの方がいいとして、

細かいことをうるさく言うなと文学者から叱られそうだが、冬のオークの森を思い浮かべるとき、樹木が落葉樹であるか、常緑樹であるかによって、そのイメージはまったくちがってしまうはずだ。

と言う。ちなみにこの後、 oak を「樫」と訳すのはどこから来たかという歴史をたどり始め、『聖書』にたどりつくくだりも面白かったが、それは読んでのお楽しみ。

もう一つ面白かったのは「恐竜」という単語で、 dinosaur という英語はギリシア語で「恐ろしい」といった意味の deinos とトカゲを意味する saurus を組み合わせた語だからいい訳だと思われていた(これは有名な話だと思う)。ところが近年になって deinos というのは「最上級、つまり恐ろしいほど大きな、という意味で使っていたことが明らかに」なってしまい、恐竜というのが結果的に誤訳だったことがわかってしまったという。ほかにも、 saurus を蜥蜴などではなく「竜」とした理由であるとか、中生代の爬虫類のほかの訳語についても解説していて、こちらも面白い。

一事が万事こんな具合で、単純にこれがこうだから正しいと教条的に列挙するのではなく、訳せないならカタカナにしてしまえばいいと逃げるのでもなく、どんな訳がなされているかという現状を踏まえつつ、悩んだり解決策を提示したりする。単に日本語に詳しいというのではなく、英語に通じているというのでもなく、両者を行ったり来たりする翻訳という仕事を長年続けてきた著者でなければなかなか書けない内容だろう。

一点だけ、気になったことがあるので書いておく。 generalization を「汎化」と訳すことについて「ほかの分野で使われることはなく」と断言しているが(ほかというのはここでは心理学以外ということ)、私の知る限り機械学習の分野でも generalization のことは「汎化」といい、一般化というような曖昧な言葉ではなく具体的な意味がある。機械学習というのは、だいたい学習データを与えてそのデータに共通の特徴を認識できるようにすることだが、学習アルゴリズムやデータによっては、単に学習データと完全に一致するものにだけ正解してそれ以外ではでたらめになってしまうことがある(over-fittingという)。そうならず、学習データからそれ以外のデータへも適用可能な特徴をちゃんと取り出せる学習アルゴリズムは汎化能力があるとか言ったりする。この訳語の歴史は調べてないのでわからないけれど、心理学分野の訳語から持ってきたものかもしれない。

もちろん、これを一般化と訳していたとしても大した問題はなかったかもしれない。ここの節で著者が主張しているのは、特定の分野内だけで通じるジャーゴンなんて嫌だということである。もっと普通の語でもいいじゃないか、もとが普通の語なんだから、と。ただ、英語では同じ一般名詞が、ある特定の専門分野では専用のジャーゴンがある、というのは個人的にはいいことだと思っている。というのは、原文では一般名詞なのか具体的な定義のある術語なのか分からない場合でも、訳し分けてしまえば日本語の読者にははっきりと区別できて便利だからだ。まれにSFみたいな分野ではそういう専門用語と一般名詞が同じ単語だということを利用したレトリックが使われたりすることがあったりして、そうすると訳者がさらに困るのだが、レアケースなのでそれはSF訳者に泣いてもらいたい。

長々と反論を書いたが、これは本当にちょっとした些事で、この本は全体として大変面白い。役に立つかというと、翻訳などとは無縁な一般生活では単なるトリビアとして自慢する以外に役に立つシチュエーションはまずないと思うけど、でもおすすめ。


『SFが読みたい!』ベスト投票した

Posted by 向井 淳 on Saturday, 28 November, 2009

もう毎年恒例になった『SFが読みたい!』の年間ベストSF投票をしました。内容は出てからのお楽しみということで。今年はあまり他人と被らない投票になったんではないかなあ。個人的な予想としては、国内は長谷敏司と伊藤計劃の一騎打ちで伊藤計劃の勝利でしょう。海外はペルディード・ストリート・ステーションでしょうね。

また、今度でるのは2010年ということで、今年は00年代ベストを選ぶことになっていた。これは以下の通り。

国内:

  1. あなたのための物語
  2. Self‐Reference ENGINE
  3. 神は沈黙せず () ()
  4. ハーモニー
  5. ラギッド・ガール
  6. 楽園の知恵 -あるいはヒステリーの歴史
  7. 老ヴォールの惑星
  8. 沈黙のフライバイ
  9. 四畳半神話大系
  10. 熱帯

海外:

  1. あなたの人生の物語
  2. しあわせの理由
  3. タフの方舟 (1: 禍つ星) (2: 天の果実)
  4. スペシャリストの帽子
  5. 移動都市
  6. 火星の長城
  7. 最果ての銀河船団 () ()
  8. ふたりジャネット
  9. アッチェレランド
  10. 奇術師

こちらはコメントを書けないので、簡単にコメントを書くことにする。

基本的には読んで面白かったということを基準に選んだ。『20世紀SF』など編纂そのものを高く評価したいものってのもあるけど、そこはばっさりと無視してしまうことにした。また基本的には小説をターゲットとし、エッセイや評論は対象外と考えることにした。レムの『高い城』を入れるかどうかは悩んだのだが入れなかった。また、同一作者は最大で1作品とすることにした。それから、もとは昔に書かれた作品についてはあまり入れないように考慮した。『高い城』を落とした理由や、飛浩隆が『象られた力』でない理由はその辺である。『タフの方舟』も結構古いけど、まあそれはそれだ。

それにしてもこの10年を振り返ると実に感慨深いものがある。そもそもSFマガジン誌上で行われてきた年間ベストを分離独立するようなかたちで『SFが読みたい!』が発刊されたのもちょうど2000年だったというのもある。一方で個人的な事情として、2000年に初めてSFセミナーというイベントに参加し、SFファンダムにかかわるようになってきたのがこの00年代だったし、それはつまり私のSFの評価軸というか物心みたいなものがようやく出来上がってきた10年だったとも思う。2000年ころのベストを見ると当時の自分の感想が思い起こされるが、それは今から考えるとあまり軸足がさだまっていないふらふらした感想だったようにも思うし、余計なことにとらわれない無邪気な感想だとも思える、なんとも感慨深いのだった。10年というのはそういうことができるタイムスパンなのだと改めて実感した。

ところで、ずいぶんと短編集を多く入れたベストだなという気がする。この辺は個人の嗜好のあらわれかも。国内では5、6、7、8が短編、9は短編集(?)という感じ、2も連作短編といった風情がある。海外では1、2、4、6、8が短編集、3と9が連作短編である。ちょっと入れすぎたかも。

ともかく、ここで挙げた作品はどれもおすすめ。未読な人はぜひ。


川端裕人『算数宇宙の冒険 アリスメトリック!』

Posted by 向井 淳 on Thursday, 26 November, 2009

算数宇宙の冒険

ラッカー+イーガン+谷川流な数学小説の怪作。

小学六年生のソラは不思議なものが大好きな同級生のユーキに振り回されて、帰国子女のアランと3人で町内の不思議なものめぐりをしていた(この辺がハルヒ)。UFOのうわさ、ミステリーサークル、未確認生物、幽霊、妖怪変化、隠された秘宝、古代遺跡などなど。けっきょくどれも見つからないまま10月を迎えたある日、謎の転校生と3人は算数宇宙杯という数学大会に参加することになる。その大会への勉強のさなかで主人公たちは不思議な数学空間に行くことになり(この辺がホワイトライト)、最終的には異なる数学体系の世界の侵略に気づく……(この辺がルミナス)。

うまくあらすじをまとめられないけれど、ま、こういう感じ。

横書きで数式が出てくる小説、ということで、実は『数学ガール』みたいなコンセプトの本かと思って読み始めたのだが、結論としては全く違うものだった。数学ガールは基本的には数学や式展開がメインであって、数学のおもしろさが核になっているが、本書では数式はむしろおまけみたいなものであって、物語が主体になっている。また、ルーディ・ラッカーやグレッグ・イーガンの場合は作者はこういう事がわかってるなという感じがあるが、川端さんはその辺が危なっかしいというか、わかっているとしても読者にそれを伝える気はさらさらない。解析接続といった術語は出てくるのだけれど、それがなんなのかは読んでいてもよく分からないし、物語とのつながりがあまりうまくない。

そんなわけで、読後に考えて込んでしまった。この本はどういう性格の本なのだろう? 数学の啓蒙小説ではない。数学の術語が使われてはいるが、数学そのものの本ではない。あと主人公は小学生という設定なのだが、これにはさすがに無理があり、たとえば小学生が読んでわかるような作りにはなっていない。高校生ぐらいから、早くても中学生といったところではないかと思う。複素平面とか関数とか変数という考え方ぐらいはわかってないといけないので。では誰がなんのために読む本なのか? 読者を置いてけぼりにしてでも数学的な内容が書いてあればともかく、この本にはそうしたところがない。かといって、数学的な要素を楽しむべきかというとそうなってもいない。立ち位置が中途半端。

……などと思いながら読んでいたのだけど、どうもその方向でこの作品を捉えるのがうまいことなのかどうか、読みながらだんだん自信がなくなってきた。

たとえばSF(科学小説)が科学啓蒙のための小説であると考えていたのはせいぜいガーンズバックぐらいであって、いまどきそんなことを考えているやつはいないだろう……いや、作家個人として作品を書く目的がそれだという作家はけっこういると思うが、ジャンル全体を見たときに、SFというのはそれだけのジャンルではないということはおおむね合意が取れていると思う。科学的に正確であったり厳密であったりすることを至上とするという「ハードSF」という言葉があるが、これはつまり裏を返すとハードでないSFがいっぱいあるということだ。「これは科学的な厳密さの態度に欠けるので……」というのを作品の批判としてもってくるためにはそれなりの前準備というのが必要なのである。SFにおける「科学的な見地」という鑑賞ポイントは、SFという文学ジャンル全体からしてみても確実に存在はするし、存在しなければならないが、それはあくまでも鑑賞ポイントでしかないわけだ。

で、この議論をそのままMF(数学小説)に置き換えると、前段でわたしがグダグダ書いてきたこの本への批判がナンセンスに見えてくるだろう。なんというか、この本は既存の数学小説があまり目指していないところを目指した本なのかもしれない、という感じがした。だから数学的な説明がどうこう、という批判は実は的を外しているのだろう。

ただ、だからといって手放しで褒めるようなことはやっぱりできない、というか、読み終えても妙なもやもやが心に残る。たとえば主人公たちは物語の過程でいろんな数学的概念を理解・習得していくわけだけれど、基本的に本を読みました、勉強したのでわかるようになりました、ということが説明されるだけになっているのはどうなのか、といったごく真っ当な指摘は可能で、そういうレベルでの瑕疵がちょっと多いような気はする。

おすすめはしないけど、なんとも言えない奇妙な感じはほかの本では絶対に味わえない。


設定ファイルの棚卸し

Posted by 向井 淳 on Saturday, 21 November, 2009

高林さんの設定ファイルの整理 – zsh 編という記事を読んで、そういうのもたまには必要だなぁ、オレもTeXの設定とか残ってるし……と思ってless .zshenvしてみたところ、のっけから

#
# Host Type
#
case $OSTYPE in
        sunos4.*)
...

こんなんになっておりました。

更にいうと実は私はSunOS 4.xなんて全然触ったことはなく、なぜこんな設定があるのかというとこの辺はたしか研究室の先輩の設定ファイルから使える部分を流用してきたときに持ってきたものではないかと思われます(研究室はホームディレクトリをNFS共有しつつSolarisやFreeBSDやLinuxが混在していた環境だったので、そういう設定自体に当時は意味があり、sunos4.*についても敢えて消すほどでもないのでほっといたのだと思う)。しかしなんかもう、老舗のうなぎ屋の秘伝のタレみたいに積み重ねられた、味わい深い設定ファイルですな。

CVSROOTやTEXINPUTSなどの環境変数が設定されているのは今更驚かないとしても、PHONENAMEやJLESSCHARSET、CANNAHOST、SKKSERVERなどが生き残ってたのはさすがに驚きました。ほかはともかく、かんななんてほとんど使ってないのになぜCANNAHOSTの設定が残ってるんだ……。

エイリアスにもalias kterm=”kterm -km euc”とかf=fingerとかみたいに、いちいち味わい深い設定が残されてました。すごいのはalias less=”lv”というのも残ってたし……。PAGERではなくあえてエイリアスにしたのは、たぶん何かにハードコードされてたとか、ついlessって打っちゃう、みたいなどうでもいい理由だったのかなー。いずれにしてもどうでもよすぎだ。

そんなこんなで、たまにはこんな「振り返り」も楽しいものですね。しかし、もしかすると、10年ぐらいして見返したら「このGOROOTって環境変数は何だ!?」ってなったりして。


コリン・タッジ『ザ・リンク ヒトとサルをつなぐ最古の生物の発見』

Posted by 向井 淳 on Tuesday, 10 November, 2009


2007年に驚くべき発見があった。ドイツで1980年代に発見され、そのまま個人収集家のもとで眠っていた化石が世に出たのだったが、これが過去に例がない、ほぼ完全に近い4700万年前の霊長類の化石「イーダ」だった……。

この出だしにぐっとくる。4700万年前のほぼ完全な化石。新種の発見。個人収集家から放出されたというミステリアスな出自。それだけではなく、これが人類につらなる霊長類進化を埋めるミッシング・リンクのひとつであるという。このあたりで読者の熱気は最高潮に達する。

のだが……。

本書は全部で9章に分かれる。1章と2章でだいたい上に書かれている話が説明される。ところが3章から7章のすべてと8章の一部、分量にしておおよそこの本の7割ぐらいの内容はイーダとはまったく何の関係もない。4700万年前というのはどういう時期だったのか。気候は、生態は、植生は。発見されたメッセル・ピットとはどんな土地で、なぜこんなに完全な化石が発見されるのか。霊長類とは何で、どんな分類があり、どんなふうに進化してきたと考えられてきたか……。このあたりの説明も決して悪いとは思わない。読むと面白いし、なるほどなあとも思った。しかしね、いかんせん長すぎるのではないかい。

確かに、霊長類の進化に関する学説が説明されないと8章の説明などわからないところが多くなりすぎてしまうだろう。そういうわけで、この本の説明量は必然だった、という見方もできる。でもオレは違うと思うなあ。2007年に見いだされたばかりで、本の結末によると2009年の2月に「お披露目」をしたばかりの資料である。研究なんてまだまだこれから、わからないことばかりで、この化石から何かを断言するのはまだ早いという時期なのだろう。化石について書けることがあまりないから周辺情報で埋めた本、というのが個人的な印象ですね。

強くはお薦めしないが、肝心の化石の話だと思って読みさえしなければ良い本であるかもしれない。


ニール・ゲイマン『壊れやすいもの』

Posted by 向井 淳 on Tuesday, 10 November, 2009

ニール・ゲイマンといえば、『サンドマン』で有名なコミック原作者であると同時に、『アメリカン・ゴッズ』や『アナンシの血脈』、『コララインとボタンの魔女』などファンタジイの佳作を多く発表している多才な作家だ。とにかく多才というか、器用な作家だなというのが個人的な印象で、読んでいるとおそらくどんな雰囲気の作品でもものにできてしまうのではないか、とさえ思えてしまう。そのゲイマンの器用さが存分に発揮されたのがこの短編集『壊れやすいもの』だ。

詩やショートショートとでもいうべき長さの掌編、短編など総勢31編もの作品が収録されている上に、それぞれに趣向や雰囲気が異なるので、ゲイマンの多才さを知るにはうってつけ。読めばどれか一つは気に入る作品が見つかるんじゃないかと思う。加えて、SFマガジンなどにのみ訳出されていたものも今回かなり収録されているのはポイント高い。おすすめ。

以下、個人的に気に入った作品をいくつか紹介する。

翠色(エメラルド)の習作

もともと「シャーロック・ホームズとラヴクラフトもの」というテーマのアンソロジーのために書かれた短編で、よみがえった旧支配者に支配されるロンドンで顧問探偵を努める例の人物を、同居人の視点から描いた作品。っていうかしかしすごいテーマのアンソロジーもあったものだと思うが、その要求を完璧にこなしている。しかもそれにとどまるだけでなく、「あっ」と言わせるような意表を突くどんでん返しが最後にある点も素晴らしい。

閉店時間

酒場で全然知らない人間に話しかけられて、そこから驚くべきストーリーが語られる、というありがちな枠組みの掌編。どちらかというと民話のような、不思議なだけで意味やオチが語られない奇妙な話だが、外側の語りの使い方が上手くて不思議な余韻を残すことに成功している。

苦いコーヒー

無職でとくにやる気のない男が、ひょんなことから人類学の学会にもぐりこんで発表するはめになるという話。この学会の描写がケッサクで、権威もへったくれもあったもんじゃない雰囲気がくだらない。全体的な雰囲気は若干暗く、幻想なのか妄想なのかわからないようなところはケリー・リンクなどの作品に近く、好み。

スーザンの問題

ナルニア国物語は小学生のときに読んだ。キリスト教的な隠喩なんて全然気付かなかった鈍感な子供だったので、ごく普通に楽しんで読み、当然のように『さいごの戦い』の結末はショックだった。この作品は、さいごの戦いにひとり残されたスーザンの問題について小説のかたちをとって考察する。ナルニア国を最後まで読んでいたならおすすめしたい。

食う者、食わせる者

街で偶然出会った昔の知り合いは、見る陰もなく変貌していた……というところから始まる怪異譚。こういうのは怪異の表現の仕方がキモだと思うが、この作品では敢えてそこを明確に書かずに周辺を描くことで効果を上げている。

サンバード

富豪たちで構成される美食クラブの面々。もう何もかも食べ尽くしてしまったのだろうか、と相談をする。ついに美食クラブも解散なのだろうか、これ以上食べるべき珍味がないという意味で。そこで提案されるのはサンシティのサンバード。サンバードを捉え、食べるべくエジプトに向かうが……。ラファティらしい語り口は大変に完成度が高い、ユーモラスな快作。

ちなみに、詩は正直いってよくわからないのだが、収録されている中では「円盤がきた日」が良いと思った。


参照透明な malloc は可能か (あるいは IO モナドについて)

Posted by 向井 淳 on Friday, 6 November, 2009

alohakun が次のようなことを書いていたのが面白かったので、今日ちょっと帰宅途中につらつら考えたんだけど、twitterでつぶやくには長すぎるのでちょっと書いてみることにします。

malloc() って副作用あるの ? もちろん内部的にはあるだろうけど、外部的な振る舞いだけを見ると、有効なメモリリージョンの先頭アドレスが返ってくるだけだから、観測できないと思うんだけど。 (http://twitter.com/alohakun/status/5433639881)

Haskell で乱数作るときってどうやって参照透明にしてるんだ ? 乱数を直接作る関数は無くて、シードを元に、乱数の無限リストを作るとかなのかな。ならば、確保可能アドレスの無限リストを作れば、副作用の無い参照透明な malloc() は作れるな。 (http://twitter.com/alohakun/status/5434352613)

free や gc が入ってくると破綻するけど。 (http://twitter.com/alohakun/status/5434378848)

話がややこしくなりそうなので free や gc は考えないとするとこれは何が問題なのかということを考えたいと思います。すると問題になるのは、実はむしろ値の永続性にあるのではないかと思いました。

純粋に参照透明であるということは、次のような意味を持ちます。まず、無限リストのようなものを想定した場合、残りのメモリが現在どれくらいかという情報を保持していないといけません。これを「メモリ状態」と呼ぶことにし、仮に変数 m で代替しましょう。すると、 malloc はメモリ状態とサイズ s を受け取り、そのサイズのメモリ領域 a を返す関数ということになります。また、 a を割り当てた残りのメモリ状態 m’ も返さないといけません。

(a, m') = malloc s m

これはちょうど、リスト l の先頭から n 個の要素を取り出す splitAt 関数と似ています。

(x, rest) = splitAt n l

良さそうですよね。

複数のメモリ領域を確保したいとします。

let (a, m') = malloc s m
    (b, m'') = malloc s m'
in ...

これは問題ありません。でもこう書くことも許されます。

let (a, m') = malloc s m
    (b, m'') = malloc s m
in ...

この場合どうなるでしょうか? どちらのmallocも引数はmとsで同じです。したがってaとb、m’とm”は同じものが返されなければなりません。これは非常に都合が悪い。簡単にヤバイことが起こりそうな気がします。

話はそれだけではありません。これはつまり、ある状態のメモリ状態mをずっと持っておくことができるということです。だったら、すごい時間がたってからそのmで再びmallocを読んだならば、まさにそのmと全く同じメモリ状態にmallocしようとしたものを返さないといけません。ようするに任意の時点でのシステムのスナップショットが必要なので、これは現実的に不可能でしょう。

Cleanという言語ではこれらの問題を「一意性型」という考え方で解決します。一意性型の値がプログラム中の複数の場所から参照されることがないことは保証されています。ようするに、同じ引数でmallocを二度呼ぶことはないし、一度どこかでとっておいたメモリ状態変数mは一度しかmallocに渡すことができません。上で挙げたような問題は、メモリ状態mが一意性があるとすれば発生しませんよね。

ではHaskellでこの問題をどう考えればいいでしょうか。ひとまず、引数となるメモリ状態を分離しましょう。ようするに malloc s とだけ書いて、この\m -> (a, m')という関数を考えるわけです。bのためのmallocも同じくmalloc sで、これも\m -> (b, m')な関数です。これだけでは何のかわりもありませんが、次に、こんなメモリ状態を受け取る関数同士を合成する関数合成を考えます。c f g = \m -> let (a, m') = f m in let (b, m'') = g m' in ((a, b), m'')。つまりc (malloc s) (malloc s)は、あるメモリ状態を受け取り、サイズsの領域ふたつを割り当ててその結果のメモリ状態を返します。こんなふうに「メモリ状態を受け取ってなんかの処理をして、その結果の値と処理後のメモリ状態を返す関数」だけがあるとして、そのメモリ状態に対する(cのような)正しい計算を行う関数合成だけを使っていれば、とりあえず問題は起こりません。

ただ、こんな関数合成は見た目がごちゃごちゃしていて汚い。ところが、このような関数合成を行ってくれる便利なライブラリがあります。それはモナドといいます。ここでは、上の関数合成cにあたる処理は「束縛」>>=と呼ばれています。あとはだいたい一緒です。これにモナドの糖衣構文を使えば、

do a <- malloc s
   b <- malloc s

と書くだけで「あるメモリ状態を受け取って、サイズsのメモリ領域aとbを割り当て、そのあとのメモリ状態を返す関数」が出来上がります。

もちろん、実際にこれを実行するにはどこかでメモリ状態を引数として与えないといけませんから、途中で問題が起こる危険性がないとしても問題を先送りしているだけですよね。もしプログラムのどこからか「現在のメモリ状態」を変数として保持できてしまうと、上で書いたように「すごい昔のメモリ状態からもう一度mallocする」ということが可能になってしまうので。そこでひとつの取り決めをします。つまり、プログラム中にmainという名前の関数があると、その関数にシステムがプログラム開始時のメモリ状態を与えてその結果の値を計算する。すると、計算途中のメモリ状態mをHaskellプログラムからアクセスする手段はなく、初期メモリ状態はどこからともなく降ってくるので、問題が解決します。

これがIOモナドと呼ばれるものの正体です。

実際にはIOモナドが扱うのはメモリの状態だけではないですが、概ねこんなふうに考えることができるのではないかと思います。Haskellに副作用が「ない」といっているのはそういうことです。

たとえば、ファイルの読み込みをHaskellではhGetContents hと書きます(hはファイルハンドル)。こういうのは「ファイルハンドルを引数として与えてファイルの中身を返す関数」だと考えがちですが、実はそうではないのです。「ファイルハンドルを引数として与えると、「その時点のコンピュータの状態を引数として受けとればその時点でのファイルの中身と、ファイルを読んだ後のコンピュータの状態とを返す関数」を返す関数」なわけです。

というわけで参照透明なmallocの例としてForein.Marshal.Allocをご覧ください。


『PageRankの数理』

Posted by 向井 淳 on Tuesday, 3 November, 2009

Google PageRankの数理 ―最強検索エンジンのランキング手法を求めて―

良書だと思う。先だって『Googleを支える技術』という本が出たが、それにおとらぬ良書だ。

『Googleを支える技術』はMapReduceやGFSなどGoogleが整備するインフラ面に着目して、それがどういったものであるかを解説していた。言ってみれば本書はそのランキング版というべきかもしれない。ただ、『Googleを支える技術』と決定的に異なる点があり、それはなにかというと、この本では「Googleは実際どういう事をしているか?」ということにあまり重きをおいていないという点にある。

ページランクは1998年に論文として報告されているのだが、その背景的な数学はなかなか面白い。それも、単に数学というだけでなく、「いかに効率的に計算するか?」という課題が別に存在し、それも本書の重要なトピックになっている。そのあたりは実はいろんな大学のいろんな研究者によって研究されていた。この本はそれらの成果を集め、まとめたものである。つまり、ページランクというアイディアはGoogleによるものだが、そこから得られる知見や一般的な数学的な事実、または関連する様々な研究アイディアというものはGoogleとは無関係に存在するわけで、本書はもっぱらそちらについて取り扱っているのだ。また、ほかにもHITSのような、ページランク以外にウェブページのリンク構造を利用したランキングシステムについてもそれなりにページを割いて説明している。したがって、ページランクは本書の主要な内容ではあるけれど、単に野次馬的にGoogleのページランクを解説した凡百な本とは一線を画す。それがこの本の原題であるGoogle’s PageRank and Beyondに込められた思いだろう。

もしあなたがGoogleのランキングシステムについて……とくにその裏をかいてランキングを操作しようと考えているのだとすると、この本は何も役に立たない。そもそもGoogleのランキングだってページランクが全てではないし、本書で述べられているように、”ページランク”というのは実際には単独の数値ではなく様々なパラメータによって挙動を変えるのだ。Googleがどのようなパラメータを用い、どのように計算しているかは基本的に非公開なので正直どうしようもないだろう。

それから、この本はもっぱらウェブページのリンク構造にしか注目していないという弱点もある。実際、たとえばPageRank は、Google がウェブページのランク付けを行ううえで用いる 200 以上の技術のひとつに過ぎないわけだし、現実のランキングにおいてリンク構造だけっていうのは今やありえないだろう。

しかし本書はそれでも役に立つし、何より面白い。

すでに書いてしまったけれども、本書はGoogleが実際に使っているページランクという数値ではなく、ページランクという概念、もしくはウェブページのリンク構造から何らかの意味のある情報を抽出するにはどうしたらいいのか?という課題を説明した本だということになる。たとえば「ページランクは実際にはどのように計算すればいいのか?」「その計算は収束するのか?」といった疑問に本書は答える。それだけではなくて、大規模計算がどうしたら可能になるかとか、楽をする方法はないか、といった現実的な問題も議論される。もっとも、基本的には数学で語られるので(たまにMATLABのサンプルコードが載っているが、MATLABというあたりに著者のお里が知れるよな)、本書で語られる内容を実地に「下ろす」作業は読者の責任となるわけだが。逆に言えば、ある計算法が本書に紹介されるとき、それが正しい答えとなることは理論的にわかるし、正しくないとしてもどれぐらいの誤差がどう出てくるかは理論的に示される。だからこの本は強い。

軽い本じゃない。線形代数に関する知識がある程度必要になるので、その辺が欠如していると読むのはけっこう大変だろう(ぼくも線形代数は得意ではないので、読むのに時間がかかった)。でも面白かった。大学生やこの手のトピックに興味のある技術者に一読を勧める。

ところで、上では理論ばっかり強調したが、本書の著者はもうちょっと「実用」寄りのことを考えていて、たとえばクローラーをMATLABで実装したというサンプルコードがあったりする。が、正直なところこれは蛇足だったように思う。

追記: MATLAB 使うとなにかいけないことがあるのでしょうか? いや、いい悪いはべつにないんですけど、MATLABってある種の研究コミュニティでは非常に愛されているけれど、それ以外の世界ではあまり使われない、みたいな存在だと思っているので、著者はそういう人だよな、と思った次第。ページランクの行列計算はともあれ、クローラーのサンプルコードですらMATLABっていうのはちょっと珍しいなかと。そういう著者なので中身もバリバリ線形代数ですよ、というあたりまで含意したかったけれど、まあそれはさすがに。