医師ウィリアム・ハーヴェイは、ガリレオやデカルトの時代を生き、解剖学で尊敬を集めた人物だそうな。ジェームズ1世やチャールズ1世の侍医だったというが、一般的にはあまり知られていないようである。ハーヴェイ贔屓の人々によると、目立たぬように振る舞うことで悦びを感じるような人物だったとか。真理を語る者にとっては、目立つと災いの降りかかる時代。科学的観点はことごとく宗教論争に巻き込まれ、案の定、ガリレオは宗教裁判にかけられ、デカルトは自由国オランダへ逃れた。全人類を敵に回すぐらいの覚悟がなければ、宗教的教説を打破することはできない。ハーヴェイは心臓と血液の運動についての画期的な理論を提示するが、これまた多大な批判を浴びたようである。本書には、アリストテレス主義の亜流に対する批判が多分に込められている。名指しはしていないが、スコラ学派あたりか。アリストテレスには敬意を払いつつも...
当時の解剖学は、ローマ帝国時代の医師ガレーヌスの学説が一般的だったという。つまり、ルネサンスに至る1500年もの間、この分野は進歩していないと苦言を呈しているわけだ。人体解剖は倫理的に攻撃されやすい分野だが、記録はヒポクラテスよりも前に遡る。言い換えれば、古代ギリシア、ローマ時代の智がいかに偉大であったかを示しているのだけど...
本書に示される血液循環の理論は、現代医学では当たり前とされる。それは... 血液は左心室の搏動によって動脈を介して身体全体に供給され、同様に右心室の搏動によって静脈を介して心臓へ戻す。そして、右心室から肺動脈を通して肺臓と接続され、肺静脈を通って右心室に入る。... といった血液経路である。
特に重視している点は、血液が運動を必要とするだけでなく、再び心臓へ戻ってくることが必要だとしていることである。この理論を証明するために、ハーヴェイは約128種もの動物解剖を行ったというから、その執念には凄まじいものがある。誇張することなく、真理を静かに物語ることが、研究者魂というものであろうか...
また、解剖を通して生命組織を解明しようするだけでなく、病理学の視点も忘れていない。医師の本能であろうか...
「真理への愛と、知識欲に燃えている真の哲学者は、その真理がたとえ誰からこようとも、またいつこようとも、それに対して道をあけないほどに自分が聡明で豊かな知識をもっているものでないことをよく知っており、また彼ら自身の感覚からいっても、決してそれほどに知識に富んではいないのである。」
従来の理論では、右心室は肺臓のために栄養を供給する役割があり、左心室は身体全体に血液を供給する役割があるとされ、血液は肝臓あたりで作られ、一方通行で身体の各部でそのまま消費されると考えられていたという。アリストテレスの時代から、血液の供給を生気の供給と呼んでいたそうな。動脈には生気がみなぎっており、赤々とした赤血球こそが生気の源とし、赤が生、青が死の代名詞とされてきた。生気とは極めて哲学的な表現だが、生気を酸素と読み替えるだけで、医学書っぽくさせる。尚、本書には、酸素や二酸化炭素という用語は登場しない。呼吸に関する空気と生気で区別されるぐらいか。
ハーヴェイは、右心室と左心室で役割が違うことに疑問を持った様子から語り始める。しかしながら、機能的な対称性を信じたとしても心臓の位置は左に偏っているし、実際に右心室と肺臓が接続されていれば、アリストテレスの構造論もそんなに悪くはあるまい。問題は、それを実証もせずに鵜呑みにすることであろう。想像や予測はできても、それを実証することこそ自然科学者の使命である。
とはいえ、凡庸な酔いどれときたら、こうした研究者たちの主張を鵜呑みにするしかない。ほとんどの知識は自分で確かめたものではなく、本を読んでお茶を濁すことぐらいしかできないのだ。それでも、手も足も出ない知識の渦の中に身を投じると、それが快感になってくるから困ったものである。ハーヴェイは、老人(プビリウス・テレンティウス・アフェル)が書いた喜劇の中に、こんな格言があることを紹介してくれる。
「ただ年齡(とし)をとり、経験をつむことは、なんら新しい変革をもたらさない。知っていると思っていることも、本当に知っているのではない。至上のものとして大切にしていることも、身をもってためしたうえでなければ、それを信じない。... このように、まったく理性を以てその生涯を、よく生きぬいた人は、いまだかつてみられない。」
1. 停止メカニズムと起動メカニズム
人体組織の構成を観察するだけなら、死体を解剖すればいい。だが、生命のメカニズムを解明するとなると... 動物愛護団体から集中砲火を浴びそうだ。
ハーヴェイは、心臓が停止する順序を手で触りながら克明に綴っている。最初に左心室が搏動をやめ、次に左心耳、ついに右心室が停止し、最後に死亡が確認されているにもかかわらず、右心耳はなお搏動し、生命は右心耳において最後まで残留するという。そして、心臓が漸次死に近づきつつある間に、心耳の二搏、三搏した後に、心臓はあたかも再び覚醒したかのように時折反応し、やがて緩やかになると。心臓が搏動を停止した後も、心耳がなお搏動している間は、心室中に搏動が認められるらしい。心耳が搏動するということは、血液の放出も見られるということであろうか。
なるほど、停止メカニズムを逆に辿れば、起動メカニズムを想像することもできそうである。ここには、デカルトの機械論をより具体化しようとした印象がある。人間機械論的ですらあるけど...
鼓動メカニズムがポンプの原理である以上、一時的に停止しても蘇生できる可能性がある。つまり、鼓動がたまーに乱れたり、瞬時に停止してもおかしくないほど、際どい関係から成り立っている。そこに呼吸作用が関与する。
では、呼吸の正体とはなんであろうか?赤血球が二酸化炭素を放出して、代わりに酸素を取り込む。化学では酸化と呼ばれるやつだ。こんな単純な交換作用によって、生命が維持されるとは... これを宇宙の奇跡とするか、神の仕業とするか、あるいは、何億年もかけて獲得した進化の産物に過ぎないとするか、まぁ、好きにすればいい...
注目したいのは、心臓の運動に心耳が関与していることを重視している点である。尚、心房という用語が登場しないのは、心室で抽象化しているのだろうか?
左右の心耳は同時に運動し、左右の心室も同時に運動するが、それぞれの系統は同時に起こらないという。心耳が先行して心臓の運動がこれに続くという。心耳が起動タイミングを作っているということか?心臓がポンプ運動を起動しているのは確かなようだが、一旦起動を始めると、身体全体が惰性的な周期運動を続ける。血液の放出からの圧力、すなわち、左心室側から主導されるということになろうか。そうなると、心耳には、物理的な連動波、鼓動波や周期波の伝播、ひいては、リズムを整える役割があるのだろうか?心耳と呼ぶからには、受動的な伝播運動なのかもしれない... などと解釈してみたものの、ん~... よく分からん。実は、それほど重要でない組織ってことはないの?ハーヴェイ先生!
まぁ、モノの有難味ってやつは、失った時に実感できるもの。その機能を排除した時、どうなるか?それを実験してみれば明らかになろう... おっと、動物保護団体の眼が怖い!
「肺臓と心臓とは、血液のための倉庫、源泉および宝庫であって、血液がそこで完成されるための実験場である。」
2. 動脈と静脈の対称性、そして、静脈弁の神秘
本書は、静脈の全域に配置されるシグマ字型の弁があることに注目している。つまり、逆流防止機構があることに。動脈には、逆流防止は必要ないのだろうか?血液の放出圧力で制御できると言えば、そうかもしれん。大動脈の入り口には弁があるけど...
弁は、分岐のあるところに明らかに多く見られるが、それだけではないという。頭部など上部へ血液を流れやすくする役割もあろうが、単に重力に逆らうためのものではないらしい。動脈から噴出したものを、静脈を通して必ず心臓へ戻す必要があると指摘している。そして、食物の摂取量から換算して、大量に血液を供給するには、循環路を巡っているとするしか、充満させることはできないという。ハーヴェイは血液の放出圧力と脈拍数から、血液の供給量を算出して見せる。
生命維持のためには栄養は必要であるが、食物を摂取してそれを消費するという工程だけでは説明がつかないのも確かだ。エネルギー保存則の観点からも、エネルギーの逃げ道が必要である。動脈こそが生気を与えるとされる従来の理論に対して、動脈と静脈の対称性こそが、安定した整脈をもたらすというわけである。
尚、静脈内に膜のような弁があることを最初に唱えたのは、ヤコブ・シルビゥスという人だそうな。ただ、弁は発見されたものの、用途が解明できなかったという。
ところで、本書では扱われないが、循環系には血管系とは別にリンパ系ってやつがある。血管系が燃料補給の役割があるとすれば、リンパ系は余分な組織液を排除する役割があるとされる。素人感覚では、リンパ系を静脈で兼用できそうな気もするが、そう単純でもないのだろう。
また、同じく本書では扱われないが、怪我などで身体が異常状態になると、動脈と静脈の間に痩管という連絡路ができると聞く。例えば、硬膜動静脈瘻といった病では、動脈と静脈が直接つながるといったことが起こるらしい。正常状態では、太い動脈から細い動脈へ、更に細い毛細血管を経て静脈へ繋がる。静脈から動脈へ移ることは心臓を経由しない限り不可能なはずだが、循環系に異常がきたすと、こんな補完機能まで具えているとは、生命の神秘どころか脅威すら感じる。
尚、本書は毛細血管までは言及されない。後に、マルセロウ・マルビギィが顕微鏡によって毛細血管を発見することに...
「哲学者が言ったとおり、人間は宇宙の中心だ。マクロの世界とミクロの世界の中間にいる。そのどちらも無限だ。赤いのは赤血球だけだよ。それも動脈内だけ。あとは海水に似た結晶だ。生命の川だな。... 全長10万マイルある。」
... 映画「ミクロの決死圏」より
Contents
- 2014-09-14 "動物の心臓ならびに血液の運動に関する解剖学的研究" William Harvey 著
- 2014-09-07 "種の起原(上/下)" Charles Darwin 著
- 2014-08-31 Surface Pro3 とISPのモデム(NETGEAR CG3000D)をWiFi接続
- 2014-08-24 Surface Pro3 から見た Win8.1
- 2014-08-17 開封の儀を執り行う... Surface Pro3
- 2014-08-10 "数学と論理をめぐる不思議な冒険" Joseph Mazur 著
- 2014-08-03 "連分数のふしぎ" 木村俊一 著
- 2014-07-27 "ガベージコレクションのアルゴリズムと実装" 中村成洋/相川光 著 竹内郁雄 監修
- 2014-07-20 "Emacs Lisp テクニックバイブル" るびきち 著
- 2014-07-13 "実践 Common Lisp" Peter Seibel 著
2014-09-14
2014-09-07
"種の起原(上/下)" Charles Darwin 著
生物学に触れるのに、進化論を避けて通るわけにはいかない。ただ、科学の中でも極めて社会学的な印象が強く、遠ざけてきたところがある。自然淘汰説では、自由放任や市場原理と結びつけて、弱肉強食と重ねる経済学者も少なくない。それでも、科学者から芸術家に至るまで実に幅広い分野でダーウィンを称賛する声を耳にするし、遺伝子工学が量子力学と深くかかわる様子から徐々に興味を惹き、いつかはダーウィン!と意気込んでいた。案の定、つまらないイメージを払拭してくれる。尚、多くの翻訳版が混在する中、比較的新しい光文社版(渡辺政隆訳)を手にとる。
「種の起源」は、専門家向けの学術書ではなく、一般読者向けに発行されたそうな。当時、大著「自然淘汰説」の執筆を進めていたところ、諸般の事情から要約を刊行する必要に迫られたとか。確かに、感情的批判の避けられない説ではある。要約にしては大作だが...
この時代、まだ遺伝の仕組みが皆目解明されておらず、ダーウィン自身、遺伝の法則についてまったく分かっていないことを表明している。この真摯な態度こそ自然科学者たるもの。彼はなにも、人類の祖先を猿と言っているわけでもなければ、ヒトの祖先についてすら触れていない。ひたすら飼育栽培や家畜、あるいは野生の動植物を観察しながら、進化の原理を論証しているだけだ。もちろんヒトの種も含めてのことだが、批判を想定し、言葉を選びながら語っている。要するに、あらゆる生物種が共通の祖先を持つと言っているだけで、現存する生物種の優劣を語っているわけではない。
「私は類推から出発して、地球上にかつて生息したすべての生物はおそらく、最初に生命が吹き込まれたある一種類の原始的な生物から由来していると判断するほかない。」
その本旨は、地上を豊富な生命で満たすための条件として、多様性と分岐の性質を主軸に置く。そして、すべての生命は指数関数的に増殖する性質を持ち、そのために生存闘争が生じるのは必然で、数を抑制するために大量絶滅の機会は避けられないとしている。これは、T.R.マルサス風の人口論ではないか。自然淘汰の原理が機能しなければ生物の分布は偏り、地上がこれほど多様な種で満たされることはないというわけだ。
近年、個々の生物種のDNA配列が明らかにされると、すべての生物種に共通点が多いことが発見される。見た目が明らかに違う生物でも、DNAレベルでは驚くほど似通っているというのは、自然の驚異を感じずにはいられない。構造を司る遺伝子メカニズムは、スイッチをオン/オフするだけで多様な形態をこしらえる機能を具えている。まるでプログラマブルデバイスのように。地上に存在する構造体は、すべて選択と分岐で説明がつくのかもしれない。これが偶然性ってやつの正体であろうか。生ってやつは、死を運命づけられてこそ生となる。だからこそ次の生を夢見るのであろうか。しかも、子孫の複製では、ほとんどの動植物が二つの個体で結ばれることを望む。雌雄同体であっても、やはり結合を求める。生の複製だけなら単体で生殖する方が合理的であろうが、遺伝子にはほんの少し変身願望があるようだ。生活環境が不変ではないことが、結合と分岐の原理を育み、適応能力を身につける。この意志こそ進化の正体であろうか。運命には、切り開く運命があれば、逆らえぬ運命がある。双方を調和させる意志こそ運命とうまく付き合う術なのだろう...
「個々の事象は神の力が個別に介入することで起こっているわけではない。神が定めた一般法則によって起こっているのだ。」
... W.ヒューエル「ブリッジウォーター叢書」より
自然淘汰説は、ある種の利益主義と言えなくはない。だが、自然的な利益と人為的な利益を区別する必要がある。個々の生物が具える体制、構造、習性を厳密に精査し、よりよいものを選択しながら保存すると同時に悪いものを排除する。自然の力とはなんと偉大であろう。だが、人間は自然の意志を解しているだろうか?人間精神はそこまで進化しうるだろうか?ダーウィンはこれを問うているようでもある。
人間の意志は、無意識の領域では自然の意志に適っているのかもしれないが、その一方で、意識できる領域ではどうであろう。満腹なライオンは人が側を歩いても襲わない。底なしの欲望を抱いているのは人間ぐらいなものだ。人為的に遺伝子操作された食物ばかり食べていると、その生命体はいずれ報いを受けるのかは知らん。
ところで、進化論といえば、お馴染みのイメージ図がある。腰を曲げて腕を引きずりながら歩く猿から、背筋を伸ばして直立歩行する人類へ段階的に変化していく、あれだ。ダーウィンの生きた19世紀は、すべての生物は神が個別にこしらえたとするキリスト教的な創造説が支配的な時代。人類の住む地球は、既に宇宙の中心でないどころか太陽系の中心ですらないことが証明され、生物の起源は神の御手が介在できる最後の砦であった。当時、ダーウィンは猿になぞらえた風刺画で揶揄される。
現在でもなお、人間の祖先はチンパンジーなどという誤解がある。ヒトに最も近い種といえば、そのあたりではあるが。おまけに、進化論を教育の場に持ち込むべきではないと主張する道徳者どもがいる。人間自身を崇めれば、人類のルーツに敏感に反応する。これも、ある種の民族優位主義のようなものか。人間社会では多数決が崇められるのに、宇宙では生命が存在する地球はごく稀な存在で、変質や奇形の類いとなろう。だが、これまた神の祝福を受けた天体と解す。人間のご都合主義、恐るべし。マスコミ連中が面白おかしく書きたてれば、興味本位で群がる民衆によって真っ当な学説が捻じ曲げられる。単に注目されたいという脂ぎった欲望が、真理を探求したいという純粋な欲望を圧殺にかかる。そんな構図は現在とて変わらないが、はたして自然淘汰の原理に適っているのやら。尤も俗世間に惑わされない資質を持った天才たちが、真の意味で人間社会を支えているであろうし、どんな状況下でも必要以上のドーパミンを発することはないのだろう。ダーウィンは、あの世でつぶやいているに違いない。戯言を科学に持ち込んで人類の叡智を崇める種が祖先だと言うのなら、自分自身は哀れな類人猿を祖先に持つ方がましだと...
1. 連続性と離散性
自然淘汰説は、想像を絶するほどの長い時間によって徐々に変化する過程を前提にした説である。つまり、連続性の概念によって支えられている。よって、ダーウィン批判は、地質学調査が示す不連続性によって巻き起こる。それは、最古の化石が堆積するシルル紀や、多様な生物が爆発的に出現したカンブリア紀を、どう説明するかにかかっている。
ダーウィンは、地質学的調査の不完全性を指摘する。種の絶滅は、隆起や沈降といった地質学的に保存の難しい状況で生じやすいために、連続的に移行する生物の連鎖を地質学に求めても難しいというわけだ。その信念は、「自然は飛躍せず」という自然史学の古い格言に沿っている。ただ、ちと言い訳じみていて、やや苦しく、かなりくどい言明を感じる。素人目にも、気候の大変動期が鍵になりそうなことは想像できそうなものだが...
そこで、ダーウィンをちょいと擁護してみよう。今では突然変異説ともうまく融和しているので、そんな必要もなかろうが、酔っ払いはお喋りよ...
社会学的、経済学的な観察において、連続性という概念に因われ過ぎるのは、現代とてあまり変わらない。人間の思考力は、記憶や知識といった元手を拠り所にするだけに、連続性とすこぶる相性がいい。その一方で、物理現象の多くがは離散的に生じるのも事実で、それは量子力学が示している。原子構造は、原子核の周りに電子が安定した軌道を描く。引力が一様に働けば電子は徐々に原子核に近づき、いずれ原子核に落ちそうなものだが、実際の電子軌道は整数倍で安定し、電子の存在数まで制限されている。電子に欠落が生じれば、化学反応を起こして安定状態へ戻ろうとする。そぅ、エネルギー状態には安定を求める性質があり、エネルギー準位は極めて離散的だということだ。だからといって、力の作用が離散的というわけではない。力が連続的に加えられながらも、状態遷移では離散的なのである。宇宙における物質分布にしても、均等ではなく、島宇宙や銀河といったクラスター化が生じる。気候の大変革もまた一夜にして起こる。The Day After Tomorrow... 映画の見過ぎか。
社会現象もまた離散的に生じる。革命や金融危機といった類いがそれだ。あれだけ巨大なソビエト連邦ですら一夜で崩壊した。社会学には、ティッピングポイントという用語がある。小さな民衆エネルギーがある閾値を超えた途端に、突如として大きな変化を見せる。今まで見向きもされなかった商品が、口コミによって突然売れ始めることだってある。人間社会では、出る杭は打たれる!の原理が常に働き、既得権益を守ろうとする種が変種への移行を拒み続ける。変種がとって代わるには、種の持つエネルギーの閾値を超えたエネルギーを蓄積する必要がある。微妙な変化を果たした中間的な変種が生まれては、既存の種によってすぐに絶滅させられる。
その一方で、種が限りなく数を増やせば、居場所を拡大するために、形質を分岐させていくしかあるまい。群れる習性が、狂った変種を多発させるのかは知らんが。その避けられない結果として絶滅が多発し、すべての生物は離散的に配列されることになろう。保存しようとする意志も、変異しようとする意志も、エネルギーの塊のごとく機能する。したがって、むしろ進化の過程が離散的であることが、自然淘汰説を後押ししている、と解するのはどうであろうか...
ところで、種と変種の違いとはなんであろう?人間の認識力では、多数派を種とし、少数派を変種とするぐらいなもの。少しぐらい疑問を持っても、多数派で安住する方が楽だ。一人の欲望が支配する独裁主義も恐ろしいが、多数派というだけで正義とされる民主主義も恐ろしい。ならば、頭がおかしいと言われるぐらいがちょうどいいのかもしれん...
「種とはきわめて顕著な特徴をもつ永続的な変種にすぎない。」
2. 性淘汰の原理
飼育下では、雌雄の一方だけに奇妙な特徴が出現し、その特徴が遺伝的に固定される例が多いという。性淘汰は、生存闘争ではなく、異性をめぐる闘争によって決まり、精力絶倫な雄がその場所で最も適合する個体となり、最も多くの子孫を残す。性の勝者だけに繁殖が許され、不屈の闘争心が武器となる角や爪、あるいは腕力を身に付けさせる。こうした形質的な差異が生じるのも、二次性徴の類いであろうか。ライオンの鬣のように見かけで脅す性質もあれば、人間社会では金銭や権威という空虚な武器も生み出される。雄どうしの戦いが熾烈を極めるのは、一夫多妻制への夢が隠されているのかは知らん。
その一方で、嬢王蜂に雄が群がる社会もある。性の同質化が進めば、雄の運動能力が雌に追い越されることもあろう。人間の種では、精神力や腕力で既に逆転した事例がわんさとあり、男性が子を産むという変異が生じる日が来るのかもしれん。
さて、雌と雄に分かれる生物は、子が生まれるにあたって、二つの個体がその都度結ばれることになる。それはそれで不合理に映るが、ことはそう単純ではない。交尾は単なる性的快楽を求めるためだけではない。奇妙なのは、雌雄同体の動植物でさえ受精が起こることで、究極の男女平等社会でもなさそうである。雌雄同体のカタツムリ、ミミズ、ヒルなど大部分のものは二個体間の交尾によって生殖する。遺伝子コピーのために二つの個体が協力しあうとは、何を意味するのか?死を運命づけられたものの生への執着か?いくら子供に夢を託したところで、親の言うとおりにならないのが人の世。
ただ、性淘汰の作用は自然淘汰ほど厳格ではないらしい。死をもたらすわけではないし、単に子孫を残さない選択をするだけ。しかも、二次性徴の変異性は高いという。生命の潜在意識には、命の保障付きで変身してみたいという願望でもあるのか?成長過程も個人差が大きい。人間では、女性の方が二次性徴の発現時期が早いとされる。こうした傾向は、精神的な作用も大きいだろう。子どもの頃は、女子の方が妙に大人っぽかったりする。
また、変異作用が大きいと、遠い祖先に逆戻りする形質も見られるという。しかも、失った形質を取り戻す傾向は、一時的な変種状態となるのではなく、何世代にも受け継げられるとか。人間社会にも、古典回帰といった文化活動が度々起こる。その代表はルネサンスだが、社会に幻滅すれば思想回帰も生じよう。
生命ってやつは、亜変種を試みては形質を戻すという作用を繰り返しているようである。変異とは、生命的危機とのリスクの大きさによって、必要なエネルギー準位で決まる現象とすることはできそうか。だとすると、生命的危機のないところでは、いくらでも変異が生じていることになる。個性ってやつも変異の一種であろうか。現代社会も亜変種の一つであろうか...
3. 退化の原理
「自然淘汰は、有益な変異をもつ個体は保存し、不利な変異をもつ個体は排除するという、生と死の使い分けで作用する。」
自然界とは、不要なものが淘汰されるという、そんな単純なものであろうか?少なくとも、その基準が人間の都合で決まるものではあるまい。不要そうに見える器官でも、そうでないかもしれない。確かに、身体の中で必要とされる部分の発達は著しい反面、使用されない部分は劣っていく傾向がある。人間の盲腸は小さく、不用の代名詞のような言われようだが、草食動物にとっては意味があり、そこに微生物を飼ってセルロースを分解させる。そして、微生物のたまり場を虫垂と呼んだりする。痕跡器官ってやつもある。本来の用をなさなくなった器官が、わずかに形だけが残しているような。尾骶骨が、それだ。
「一般に自然史学の研究書では、痕跡器官は "対称性を保つため" とか "自然の計画を全うする" ために創造されたものだという言い方がされている。しかしそれでは何も説明したことにならないと思う。単に事実を言い換えているにすぎないからだ。」
自然条件下よりも飼育栽培下の方が、変異がはるかに生じやすい上に奇形が生じる頻度も高いという。生殖機能は、生活環境の変化に影響されやすく、精神的に、肉体的に乱されると、変異も生じやすい。同じ種であっても、気候や気温の違いで血液の流れ方が違うだろうし、性格や運動機能も違うだろう。器官だけでなく生物体そのものの大きさも、住みやすいように相対的な関係から適切な大きさに保たれるだろう。恐竜が絶滅したのは、その巨大さにあるという説もある。地球の重力に対して、適切な重量と数というのがあるのだろう。
また、知覚能力は、生活環境の危険性との関係から生じる。洞窟や深海など暗闇で生活する動物は視力がほぼ消滅し、その代償に触覚や聴覚を発達させるといった変質をもたらす。アヒルが空を飛べないのは、飼育慣れしたからであろうか。視力や聴力が衰えるのも、恵まれた環境の裏返しであろうか。利便性にどっぷりと浸かれば認識能力を衰えさせ、なんでも周囲のせいにし、他人のせいにし、精神だけが旺盛になるのだろうか。仮想映像ばかり見慣れていると、そのうち実質が見えなくなるのだろうか...
4. 交雑と雑種形成
なぜ、かくも多様な生物が存在するのだろうか?その答えを求めて、ダーウィンは雑種形成にこだわる。このあたりも宗教的批判は避けられない...
雑種を作る簡単な方法といえば、遺伝的に異なる種どうしを交配させることであろう。しかし一般的に、異種間では雑種はできないとされるし、もしできたとしても、雑種個体には生殖能力がないとされる。トラの雌とライオンの雄の間のライガーや、ライオンの雌とヒョウの雄の間のレオポンは、いずれも不稔とされる。ラバやケッティも。それは、人工的に仕向けられたからであろうか?種間によって生殖的隔離があるかどうかは重要である。
ダーウィンは、新種が誕生するのは、既存の変種から独自性を獲得した結果だとしている。そして、雑種に生殖能力がないというのは、自然淘汰の直接的な作用ではなく、あくまでも二次的な作用だとしている。
では、生殖能力が保てる程度においての交雑はありうるのだろうか?人間と他の動物の交雑で子供が生まれるとすれば、ぞっとする社会となりそう。その一方で、血縁が近すぎると奇形が生まれやすいというのは、何を意味するのだろうか?異種間でも、適当に近縁で適当に離れているのが望ましいということはあるかもしれない。ちなみに、人間同士でも相性があるようだ。子供ができないからと相手のせいにして離婚すると、再婚してそれぞれの夫婦に子供ができたという話も聞く。なんのために離婚したのやら?子供を作ることだけが、夫婦の使命でもなかろうに。
それはともかく、自然淘汰説では、祖先が共通であっても、不稔性が生じることが重要だとしている。雑種が生存競争において不利となれば、雑種を作ることを拒む意識が働くだろう。しかし、雑種が有利となる場合もありそうなもの。それが、現存する雑種ということであろうか?偉大な生物史において、雑種が生じる現象も、既に安定時期にあるのだろうか?人間も、猿も、ゴリラも、過去の生物よりもちょいと有利な雑種というだけのことかもしれん。
一方で、植物には容易く交雑できるものがあるという。機能の抽象度という意味では、動物よりも植物の方が高等という見方ができるかもしれない。おそらく、動物よりも植物の方が先に繁栄した時代を迎えたであろう。生命力の逞しさでも、樹齢何千年と生きるものがある。余計な動きをせず、つまらないことも語らず、実にシンプルな生命体モデルだ。無駄な活動をしなければ縄張り争いで揉めることもないし、余計な存在感を示す必要もないし、精神の進化に集中できそうだ。交雑を受け入れる能力においても、多様性の受容能力は、植物の方がはるかに高等なのかもしれない。種子植物がミツバチに花粉を運ばせる受精モデルは、うまいこと動物を奴隷化している。しかも、本能を操って。夜の社交場に漂う美しい花びらや甘美な香りに惑わされるのは、動物の因果な習性よ...
5. 本能の起源
本能と習性は似ているが、起源が違うという。そう言いながら、ダーウィンはこの言葉の定義を諦めている感がある。古来、本能は先験的なものか?経験的なものなか?という哲学的論争がある。本能には普遍的な目的があるのだろうか?判断力の基底になっている直観も本能の類いであろうか?気まぐれとも、ちと違いそうか。習性は本能よりも経験的であろうか。
さらに、経験とはなんであろうか?記憶を根源にしているとすれば、DNAにも情報が記憶されている。本能と習性には、無意識の領域において類似点が多いような気がする。やはり、自然の意志と、人間の意志を区別せねばなるまい。本能とは、習性を昇華させた意志であろうか?もしそうだとすれば、習性を本能にする段階とは、直感を直観に昇華させるような過程であろうか?
習性は生活環境において育まれる。本能が習性の積み重ねから生じるとすれば、環境の変化によって本能もまた修正されるだろう。奴隷狩りや人種差別といった意志が、本能からきているとは思えない。だが、働きアリの奴隷振りはどうであろう?彼らに奴隷という自覚はないだろうけど。植物の意志がフィナボッチ数列や螺旋パターンを求め続ける一方で、人間の意志は十進数に囚われて金銭勘定を毎日繰り返す。こんなところに普遍的な意志が生じるかは知らんが、アリストテレスの生まれつき奴隷説も生あるものの宿命に見えてくる。自律神経系ですら自分の意志で説明できそうにない。自然淘汰説をもってしても、本能の起源を説明するとなると、やはり手強い...
「種の起源」は、専門家向けの学術書ではなく、一般読者向けに発行されたそうな。当時、大著「自然淘汰説」の執筆を進めていたところ、諸般の事情から要約を刊行する必要に迫られたとか。確かに、感情的批判の避けられない説ではある。要約にしては大作だが...
この時代、まだ遺伝の仕組みが皆目解明されておらず、ダーウィン自身、遺伝の法則についてまったく分かっていないことを表明している。この真摯な態度こそ自然科学者たるもの。彼はなにも、人類の祖先を猿と言っているわけでもなければ、ヒトの祖先についてすら触れていない。ひたすら飼育栽培や家畜、あるいは野生の動植物を観察しながら、進化の原理を論証しているだけだ。もちろんヒトの種も含めてのことだが、批判を想定し、言葉を選びながら語っている。要するに、あらゆる生物種が共通の祖先を持つと言っているだけで、現存する生物種の優劣を語っているわけではない。
「私は類推から出発して、地球上にかつて生息したすべての生物はおそらく、最初に生命が吹き込まれたある一種類の原始的な生物から由来していると判断するほかない。」
その本旨は、地上を豊富な生命で満たすための条件として、多様性と分岐の性質を主軸に置く。そして、すべての生命は指数関数的に増殖する性質を持ち、そのために生存闘争が生じるのは必然で、数を抑制するために大量絶滅の機会は避けられないとしている。これは、T.R.マルサス風の人口論ではないか。自然淘汰の原理が機能しなければ生物の分布は偏り、地上がこれほど多様な種で満たされることはないというわけだ。
近年、個々の生物種のDNA配列が明らかにされると、すべての生物種に共通点が多いことが発見される。見た目が明らかに違う生物でも、DNAレベルでは驚くほど似通っているというのは、自然の驚異を感じずにはいられない。構造を司る遺伝子メカニズムは、スイッチをオン/オフするだけで多様な形態をこしらえる機能を具えている。まるでプログラマブルデバイスのように。地上に存在する構造体は、すべて選択と分岐で説明がつくのかもしれない。これが偶然性ってやつの正体であろうか。生ってやつは、死を運命づけられてこそ生となる。だからこそ次の生を夢見るのであろうか。しかも、子孫の複製では、ほとんどの動植物が二つの個体で結ばれることを望む。雌雄同体であっても、やはり結合を求める。生の複製だけなら単体で生殖する方が合理的であろうが、遺伝子にはほんの少し変身願望があるようだ。生活環境が不変ではないことが、結合と分岐の原理を育み、適応能力を身につける。この意志こそ進化の正体であろうか。運命には、切り開く運命があれば、逆らえぬ運命がある。双方を調和させる意志こそ運命とうまく付き合う術なのだろう...
「個々の事象は神の力が個別に介入することで起こっているわけではない。神が定めた一般法則によって起こっているのだ。」
... W.ヒューエル「ブリッジウォーター叢書」より
自然淘汰説は、ある種の利益主義と言えなくはない。だが、自然的な利益と人為的な利益を区別する必要がある。個々の生物が具える体制、構造、習性を厳密に精査し、よりよいものを選択しながら保存すると同時に悪いものを排除する。自然の力とはなんと偉大であろう。だが、人間は自然の意志を解しているだろうか?人間精神はそこまで進化しうるだろうか?ダーウィンはこれを問うているようでもある。
人間の意志は、無意識の領域では自然の意志に適っているのかもしれないが、その一方で、意識できる領域ではどうであろう。満腹なライオンは人が側を歩いても襲わない。底なしの欲望を抱いているのは人間ぐらいなものだ。人為的に遺伝子操作された食物ばかり食べていると、その生命体はいずれ報いを受けるのかは知らん。
ところで、進化論といえば、お馴染みのイメージ図がある。腰を曲げて腕を引きずりながら歩く猿から、背筋を伸ばして直立歩行する人類へ段階的に変化していく、あれだ。ダーウィンの生きた19世紀は、すべての生物は神が個別にこしらえたとするキリスト教的な創造説が支配的な時代。人類の住む地球は、既に宇宙の中心でないどころか太陽系の中心ですらないことが証明され、生物の起源は神の御手が介在できる最後の砦であった。当時、ダーウィンは猿になぞらえた風刺画で揶揄される。
現在でもなお、人間の祖先はチンパンジーなどという誤解がある。ヒトに最も近い種といえば、そのあたりではあるが。おまけに、進化論を教育の場に持ち込むべきではないと主張する道徳者どもがいる。人間自身を崇めれば、人類のルーツに敏感に反応する。これも、ある種の民族優位主義のようなものか。人間社会では多数決が崇められるのに、宇宙では生命が存在する地球はごく稀な存在で、変質や奇形の類いとなろう。だが、これまた神の祝福を受けた天体と解す。人間のご都合主義、恐るべし。マスコミ連中が面白おかしく書きたてれば、興味本位で群がる民衆によって真っ当な学説が捻じ曲げられる。単に注目されたいという脂ぎった欲望が、真理を探求したいという純粋な欲望を圧殺にかかる。そんな構図は現在とて変わらないが、はたして自然淘汰の原理に適っているのやら。尤も俗世間に惑わされない資質を持った天才たちが、真の意味で人間社会を支えているであろうし、どんな状況下でも必要以上のドーパミンを発することはないのだろう。ダーウィンは、あの世でつぶやいているに違いない。戯言を科学に持ち込んで人類の叡智を崇める種が祖先だと言うのなら、自分自身は哀れな類人猿を祖先に持つ方がましだと...
1. 連続性と離散性
自然淘汰説は、想像を絶するほどの長い時間によって徐々に変化する過程を前提にした説である。つまり、連続性の概念によって支えられている。よって、ダーウィン批判は、地質学調査が示す不連続性によって巻き起こる。それは、最古の化石が堆積するシルル紀や、多様な生物が爆発的に出現したカンブリア紀を、どう説明するかにかかっている。
ダーウィンは、地質学的調査の不完全性を指摘する。種の絶滅は、隆起や沈降といった地質学的に保存の難しい状況で生じやすいために、連続的に移行する生物の連鎖を地質学に求めても難しいというわけだ。その信念は、「自然は飛躍せず」という自然史学の古い格言に沿っている。ただ、ちと言い訳じみていて、やや苦しく、かなりくどい言明を感じる。素人目にも、気候の大変動期が鍵になりそうなことは想像できそうなものだが...
そこで、ダーウィンをちょいと擁護してみよう。今では突然変異説ともうまく融和しているので、そんな必要もなかろうが、酔っ払いはお喋りよ...
社会学的、経済学的な観察において、連続性という概念に因われ過ぎるのは、現代とてあまり変わらない。人間の思考力は、記憶や知識といった元手を拠り所にするだけに、連続性とすこぶる相性がいい。その一方で、物理現象の多くがは離散的に生じるのも事実で、それは量子力学が示している。原子構造は、原子核の周りに電子が安定した軌道を描く。引力が一様に働けば電子は徐々に原子核に近づき、いずれ原子核に落ちそうなものだが、実際の電子軌道は整数倍で安定し、電子の存在数まで制限されている。電子に欠落が生じれば、化学反応を起こして安定状態へ戻ろうとする。そぅ、エネルギー状態には安定を求める性質があり、エネルギー準位は極めて離散的だということだ。だからといって、力の作用が離散的というわけではない。力が連続的に加えられながらも、状態遷移では離散的なのである。宇宙における物質分布にしても、均等ではなく、島宇宙や銀河といったクラスター化が生じる。気候の大変革もまた一夜にして起こる。The Day After Tomorrow... 映画の見過ぎか。
社会現象もまた離散的に生じる。革命や金融危機といった類いがそれだ。あれだけ巨大なソビエト連邦ですら一夜で崩壊した。社会学には、ティッピングポイントという用語がある。小さな民衆エネルギーがある閾値を超えた途端に、突如として大きな変化を見せる。今まで見向きもされなかった商品が、口コミによって突然売れ始めることだってある。人間社会では、出る杭は打たれる!の原理が常に働き、既得権益を守ろうとする種が変種への移行を拒み続ける。変種がとって代わるには、種の持つエネルギーの閾値を超えたエネルギーを蓄積する必要がある。微妙な変化を果たした中間的な変種が生まれては、既存の種によってすぐに絶滅させられる。
その一方で、種が限りなく数を増やせば、居場所を拡大するために、形質を分岐させていくしかあるまい。群れる習性が、狂った変種を多発させるのかは知らんが。その避けられない結果として絶滅が多発し、すべての生物は離散的に配列されることになろう。保存しようとする意志も、変異しようとする意志も、エネルギーの塊のごとく機能する。したがって、むしろ進化の過程が離散的であることが、自然淘汰説を後押ししている、と解するのはどうであろうか...
ところで、種と変種の違いとはなんであろう?人間の認識力では、多数派を種とし、少数派を変種とするぐらいなもの。少しぐらい疑問を持っても、多数派で安住する方が楽だ。一人の欲望が支配する独裁主義も恐ろしいが、多数派というだけで正義とされる民主主義も恐ろしい。ならば、頭がおかしいと言われるぐらいがちょうどいいのかもしれん...
「種とはきわめて顕著な特徴をもつ永続的な変種にすぎない。」
2. 性淘汰の原理
飼育下では、雌雄の一方だけに奇妙な特徴が出現し、その特徴が遺伝的に固定される例が多いという。性淘汰は、生存闘争ではなく、異性をめぐる闘争によって決まり、精力絶倫な雄がその場所で最も適合する個体となり、最も多くの子孫を残す。性の勝者だけに繁殖が許され、不屈の闘争心が武器となる角や爪、あるいは腕力を身に付けさせる。こうした形質的な差異が生じるのも、二次性徴の類いであろうか。ライオンの鬣のように見かけで脅す性質もあれば、人間社会では金銭や権威という空虚な武器も生み出される。雄どうしの戦いが熾烈を極めるのは、一夫多妻制への夢が隠されているのかは知らん。
その一方で、嬢王蜂に雄が群がる社会もある。性の同質化が進めば、雄の運動能力が雌に追い越されることもあろう。人間の種では、精神力や腕力で既に逆転した事例がわんさとあり、男性が子を産むという変異が生じる日が来るのかもしれん。
さて、雌と雄に分かれる生物は、子が生まれるにあたって、二つの個体がその都度結ばれることになる。それはそれで不合理に映るが、ことはそう単純ではない。交尾は単なる性的快楽を求めるためだけではない。奇妙なのは、雌雄同体の動植物でさえ受精が起こることで、究極の男女平等社会でもなさそうである。雌雄同体のカタツムリ、ミミズ、ヒルなど大部分のものは二個体間の交尾によって生殖する。遺伝子コピーのために二つの個体が協力しあうとは、何を意味するのか?死を運命づけられたものの生への執着か?いくら子供に夢を託したところで、親の言うとおりにならないのが人の世。
ただ、性淘汰の作用は自然淘汰ほど厳格ではないらしい。死をもたらすわけではないし、単に子孫を残さない選択をするだけ。しかも、二次性徴の変異性は高いという。生命の潜在意識には、命の保障付きで変身してみたいという願望でもあるのか?成長過程も個人差が大きい。人間では、女性の方が二次性徴の発現時期が早いとされる。こうした傾向は、精神的な作用も大きいだろう。子どもの頃は、女子の方が妙に大人っぽかったりする。
また、変異作用が大きいと、遠い祖先に逆戻りする形質も見られるという。しかも、失った形質を取り戻す傾向は、一時的な変種状態となるのではなく、何世代にも受け継げられるとか。人間社会にも、古典回帰といった文化活動が度々起こる。その代表はルネサンスだが、社会に幻滅すれば思想回帰も生じよう。
生命ってやつは、亜変種を試みては形質を戻すという作用を繰り返しているようである。変異とは、生命的危機とのリスクの大きさによって、必要なエネルギー準位で決まる現象とすることはできそうか。だとすると、生命的危機のないところでは、いくらでも変異が生じていることになる。個性ってやつも変異の一種であろうか。現代社会も亜変種の一つであろうか...
3. 退化の原理
「自然淘汰は、有益な変異をもつ個体は保存し、不利な変異をもつ個体は排除するという、生と死の使い分けで作用する。」
自然界とは、不要なものが淘汰されるという、そんな単純なものであろうか?少なくとも、その基準が人間の都合で決まるものではあるまい。不要そうに見える器官でも、そうでないかもしれない。確かに、身体の中で必要とされる部分の発達は著しい反面、使用されない部分は劣っていく傾向がある。人間の盲腸は小さく、不用の代名詞のような言われようだが、草食動物にとっては意味があり、そこに微生物を飼ってセルロースを分解させる。そして、微生物のたまり場を虫垂と呼んだりする。痕跡器官ってやつもある。本来の用をなさなくなった器官が、わずかに形だけが残しているような。尾骶骨が、それだ。
「一般に自然史学の研究書では、痕跡器官は "対称性を保つため" とか "自然の計画を全うする" ために創造されたものだという言い方がされている。しかしそれでは何も説明したことにならないと思う。単に事実を言い換えているにすぎないからだ。」
自然条件下よりも飼育栽培下の方が、変異がはるかに生じやすい上に奇形が生じる頻度も高いという。生殖機能は、生活環境の変化に影響されやすく、精神的に、肉体的に乱されると、変異も生じやすい。同じ種であっても、気候や気温の違いで血液の流れ方が違うだろうし、性格や運動機能も違うだろう。器官だけでなく生物体そのものの大きさも、住みやすいように相対的な関係から適切な大きさに保たれるだろう。恐竜が絶滅したのは、その巨大さにあるという説もある。地球の重力に対して、適切な重量と数というのがあるのだろう。
また、知覚能力は、生活環境の危険性との関係から生じる。洞窟や深海など暗闇で生活する動物は視力がほぼ消滅し、その代償に触覚や聴覚を発達させるといった変質をもたらす。アヒルが空を飛べないのは、飼育慣れしたからであろうか。視力や聴力が衰えるのも、恵まれた環境の裏返しであろうか。利便性にどっぷりと浸かれば認識能力を衰えさせ、なんでも周囲のせいにし、他人のせいにし、精神だけが旺盛になるのだろうか。仮想映像ばかり見慣れていると、そのうち実質が見えなくなるのだろうか...
4. 交雑と雑種形成
なぜ、かくも多様な生物が存在するのだろうか?その答えを求めて、ダーウィンは雑種形成にこだわる。このあたりも宗教的批判は避けられない...
雑種を作る簡単な方法といえば、遺伝的に異なる種どうしを交配させることであろう。しかし一般的に、異種間では雑種はできないとされるし、もしできたとしても、雑種個体には生殖能力がないとされる。トラの雌とライオンの雄の間のライガーや、ライオンの雌とヒョウの雄の間のレオポンは、いずれも不稔とされる。ラバやケッティも。それは、人工的に仕向けられたからであろうか?種間によって生殖的隔離があるかどうかは重要である。
ダーウィンは、新種が誕生するのは、既存の変種から独自性を獲得した結果だとしている。そして、雑種に生殖能力がないというのは、自然淘汰の直接的な作用ではなく、あくまでも二次的な作用だとしている。
では、生殖能力が保てる程度においての交雑はありうるのだろうか?人間と他の動物の交雑で子供が生まれるとすれば、ぞっとする社会となりそう。その一方で、血縁が近すぎると奇形が生まれやすいというのは、何を意味するのだろうか?異種間でも、適当に近縁で適当に離れているのが望ましいということはあるかもしれない。ちなみに、人間同士でも相性があるようだ。子供ができないからと相手のせいにして離婚すると、再婚してそれぞれの夫婦に子供ができたという話も聞く。なんのために離婚したのやら?子供を作ることだけが、夫婦の使命でもなかろうに。
それはともかく、自然淘汰説では、祖先が共通であっても、不稔性が生じることが重要だとしている。雑種が生存競争において不利となれば、雑種を作ることを拒む意識が働くだろう。しかし、雑種が有利となる場合もありそうなもの。それが、現存する雑種ということであろうか?偉大な生物史において、雑種が生じる現象も、既に安定時期にあるのだろうか?人間も、猿も、ゴリラも、過去の生物よりもちょいと有利な雑種というだけのことかもしれん。
一方で、植物には容易く交雑できるものがあるという。機能の抽象度という意味では、動物よりも植物の方が高等という見方ができるかもしれない。おそらく、動物よりも植物の方が先に繁栄した時代を迎えたであろう。生命力の逞しさでも、樹齢何千年と生きるものがある。余計な動きをせず、つまらないことも語らず、実にシンプルな生命体モデルだ。無駄な活動をしなければ縄張り争いで揉めることもないし、余計な存在感を示す必要もないし、精神の進化に集中できそうだ。交雑を受け入れる能力においても、多様性の受容能力は、植物の方がはるかに高等なのかもしれない。種子植物がミツバチに花粉を運ばせる受精モデルは、うまいこと動物を奴隷化している。しかも、本能を操って。夜の社交場に漂う美しい花びらや甘美な香りに惑わされるのは、動物の因果な習性よ...
5. 本能の起源
本能と習性は似ているが、起源が違うという。そう言いながら、ダーウィンはこの言葉の定義を諦めている感がある。古来、本能は先験的なものか?経験的なものなか?という哲学的論争がある。本能には普遍的な目的があるのだろうか?判断力の基底になっている直観も本能の類いであろうか?気まぐれとも、ちと違いそうか。習性は本能よりも経験的であろうか。
さらに、経験とはなんであろうか?記憶を根源にしているとすれば、DNAにも情報が記憶されている。本能と習性には、無意識の領域において類似点が多いような気がする。やはり、自然の意志と、人間の意志を区別せねばなるまい。本能とは、習性を昇華させた意志であろうか?もしそうだとすれば、習性を本能にする段階とは、直感を直観に昇華させるような過程であろうか?
習性は生活環境において育まれる。本能が習性の積み重ねから生じるとすれば、環境の変化によって本能もまた修正されるだろう。奴隷狩りや人種差別といった意志が、本能からきているとは思えない。だが、働きアリの奴隷振りはどうであろう?彼らに奴隷という自覚はないだろうけど。植物の意志がフィナボッチ数列や螺旋パターンを求め続ける一方で、人間の意志は十進数に囚われて金銭勘定を毎日繰り返す。こんなところに普遍的な意志が生じるかは知らんが、アリストテレスの生まれつき奴隷説も生あるものの宿命に見えてくる。自律神経系ですら自分の意志で説明できそうにない。自然淘汰説をもってしても、本能の起源を説明するとなると、やはり手強い...
2014-08-31
Surface Pro3 とISPのモデム(NETGEAR CG3000D)をWiFi接続
おもちゃの噂を嗅ぎつけたお客人が、見物にやってきた...
さて、仕事場(= 自宅)には無線系統が二つある。普段はルータ(Yamaha RT107e)にぶら下げたアクセスポイント(NEC Aterm WG300HP)を利用し、プロバイダ(Jcomさん)が提供するモデム(NETGEAR CG3000D)搭載のWiFi機能はずっと眠らせてきた。
そこで、こいつを起こして客人に解放しようと思ったら、ちょっとビックリ!
まず、CG3000D はブリッジモードで動作中。尚、工事屋さんがそのように設置していったし、その方が都合がいい。そして、無線端末と CG3000D をLANケーブルでつないでおいて、Jcomサイトからダウンロードした設定用ソフト(WLANSetup_cg3000d.exe)をセットアップするだけで簡単につながる。無線端末をつなぐために、わざわざ有線経由で設定するという発想もどうかと思うが、サポートが楽になるのだろう。このソフトは、MACアドレスを CG3000D に自動登録する仕掛けも具えている。
てなわけで、Surface をLANアダプタ(BUFALLO LUA3-U2-ATX)経由でつないで、難なく完了!802.11n のチャネル幅は、20MHz/40MHz が選択でき、もちろん 40MHz に設定。実測値は、50Mbps ってとこか。実は、モデム直の 5GHz帯に期待していたが、ルータ越えの 2.4GHz帯(Aterm)の方が速かったりして...
まぁ、ここまではいいだろう。
ところが、この設定用ソフト、CG3000D の動作モードをルータモードに切り替えやがる。ちょっと考えれば当たり前だが、一言ぐらい断ってもええんでないかい!
ブリッジモードでは、RT107e に素通しでグローバルアドレス(IPv4)が振られるが、ルータモードでは、DHCP 経由でローカルアドレスが振られる。もちろん、無線端末にもローカルアドレスが振られる。まさか、端末の数だけグローバルアドレスを与えてくれるわけがない。ルータモードは必然であり、すぐに推察できる。
とはいえ、無線がつながった途端に、有線側が一斉にダウンしたのには仰天!いくら感覚の麻痺した泥酔者でもよ。おまけに、RT107e は外からのローカル空間に対してブロックしている。それは、こっちの都合だけど。修復には、RT107e のフィルタ設定を修正するだけで、1分とかからない。ただし、VPN を張る時は、ちと頭が痛い!
やはり、もう一度眠ってもらおう。お詫びに強烈な睡眠薬を投与してあげる...
世間では、かんたん設定やら自動設定やらが横行し、便利なことは結構だが、油断も隙もあったもんじゃない!と思う今日この頃であった...
参考までに、試した構成は...
CG3000D(ルータモード:DHCP,WiFi) - RT107e(DHCP) - Aterm(ブリッジモード)
元に戻した構成は...
CG3000D(ブリッジモード) - RT107e(DHCP,VPN) - Aterm(ブリッジモード)
補足... RT107e のLAN側には、SW-hub経由でマシン群をぶら下げ、Aterm は無線アクセスポイントでしか使っていない。Aterm をルータモードにすると、ローカル空間が二つになって経路管理がスッキリしない。
余談... Aterm WG300HP は、DLNA準拠のメディアサーバを具え、余計な機能だと思っていたが、Surface のおかげで、ちょっぴりええんでないかい!
さて、仕事場(= 自宅)には無線系統が二つある。普段はルータ(Yamaha RT107e)にぶら下げたアクセスポイント(NEC Aterm WG300HP)を利用し、プロバイダ(Jcomさん)が提供するモデム(NETGEAR CG3000D)搭載のWiFi機能はずっと眠らせてきた。
そこで、こいつを起こして客人に解放しようと思ったら、ちょっとビックリ!
まず、CG3000D はブリッジモードで動作中。尚、工事屋さんがそのように設置していったし、その方が都合がいい。そして、無線端末と CG3000D をLANケーブルでつないでおいて、Jcomサイトからダウンロードした設定用ソフト(WLANSetup_cg3000d.exe)をセットアップするだけで簡単につながる。無線端末をつなぐために、わざわざ有線経由で設定するという発想もどうかと思うが、サポートが楽になるのだろう。このソフトは、MACアドレスを CG3000D に自動登録する仕掛けも具えている。
てなわけで、Surface をLANアダプタ(BUFALLO LUA3-U2-ATX)経由でつないで、難なく完了!802.11n のチャネル幅は、20MHz/40MHz が選択でき、もちろん 40MHz に設定。実測値は、50Mbps ってとこか。実は、モデム直の 5GHz帯に期待していたが、ルータ越えの 2.4GHz帯(Aterm)の方が速かったりして...
まぁ、ここまではいいだろう。
ところが、この設定用ソフト、CG3000D の動作モードをルータモードに切り替えやがる。ちょっと考えれば当たり前だが、一言ぐらい断ってもええんでないかい!
ブリッジモードでは、RT107e に素通しでグローバルアドレス(IPv4)が振られるが、ルータモードでは、DHCP 経由でローカルアドレスが振られる。もちろん、無線端末にもローカルアドレスが振られる。まさか、端末の数だけグローバルアドレスを与えてくれるわけがない。ルータモードは必然であり、すぐに推察できる。
とはいえ、無線がつながった途端に、有線側が一斉にダウンしたのには仰天!いくら感覚の麻痺した泥酔者でもよ。おまけに、RT107e は外からのローカル空間に対してブロックしている。それは、こっちの都合だけど。修復には、RT107e のフィルタ設定を修正するだけで、1分とかからない。ただし、VPN を張る時は、ちと頭が痛い!
やはり、もう一度眠ってもらおう。お詫びに強烈な睡眠薬を投与してあげる...
世間では、かんたん設定やら自動設定やらが横行し、便利なことは結構だが、油断も隙もあったもんじゃない!と思う今日この頃であった...
参考までに、試した構成は...
CG3000D(ルータモード:DHCP,WiFi) - RT107e(DHCP) - Aterm(ブリッジモード)
元に戻した構成は...
CG3000D(ブリッジモード) - RT107e(DHCP,VPN) - Aterm(ブリッジモード)
補足... RT107e のLAN側には、SW-hub経由でマシン群をぶら下げ、Aterm は無線アクセスポイントでしか使っていない。Aterm をルータモードにすると、ローカル空間が二つになって経路管理がスッキリしない。
余談... Aterm WG300HP は、DLNA準拠のメディアサーバを具え、余計な機能だと思っていたが、Surface のおかげで、ちょっぴりええんでないかい!
2014-08-24
Surface Pro3 から見た Win8.1
Win8.1 は、全般的に大雑把な行動パターンには向いていそうである。視覚的にも分かりやく、そんなに悪くない。既に、Win7 でその傾向を示しているが、多くのユーザを囲い込もうとすれば、使い方は庶民化していくだろう。
実際、タッチパネル操作で違和感はない。指で操作するにはアイコンはそこそこ大きい方がいいし、マウス操作では余計なAeroスナップ機能もタッチパネルではちょっと便利。
なによりも、スタート画面のタイル構想は、単にアプリ起動の一覧だけではなく、最新情報の通知という大きな役割がある。天気予報やニュース、カレンダーやスケジュール、メールやSNSなど。ストアには、ろくなものが見当たらないが、可能性を感じさせてくれる。とりあえず欲しいのはバッテリー残量表示、そして、バックグランドでタスクを動かすことが多いので、CPUやメモリのモニタであろうか。タスクマネージャやリソースメータあたりのグラフから、スタート画面にピン留めできるのでもいい。さらに、せっかくのタイルに、JavaScript などのコードが埋めこめれば、本格的なポータル画面に位置づけることができるだろう。セキュリティポリシーに反するか?既に無法地帯か...
しかしながら、デスクトップ環境で、わざわざディスプレイまで手を伸ばそうとは思わない。ましてやマルチディスプレイ環境で。それに、マウスの方が細かい操作に向いている。ただ、ノート環境だからこそ、セカンダリディスプレイの活用幅が拡がるという見方もできそうだ。いずれにせよ、用途が多様化すれば、ユーザインターフェースも多様化しそうなもの。デスクトップPCの Win7 を Win8.1 にアップする気にはなれん...
世間全般の傾向として、大雑把な仕様になりつつあるようだ。Webサービスには、何年も放置された些細なバグが目立つ。使う分には、ほとんど支障にならないので、無視するようになっていく。情報が氾濫する社会では、つまらない事を気にしている余裕はない。鈍感になるということか。
Win8.1 にしても、余計なカスタマイズは歓迎されない。ユーザは本当に自由を獲得しているのだろうか?おまけに、デフォルト値や推奨、といったものが信用ならない。つい最近、自動アップデートを強く推奨しておきながら、おかげで起動しなくなった!と世間では騒いでいた。しかも対処法では、レジストリをいじれ!と堂々と宣言する。知識のある者はより快適に、知識のない者はより言いなりに... 機会均等という一見美しい理念も、能動的性格と受動的性格をはっきりと区別させ、格差を助長させるのかもしれん。そりゃ、毎日呑んだくれてりゃ、ついていけんよ!
通信業界も負けじと、課金方向に誘導しやがる。プライバシーポリシーでは、心地良いフレーズが踊る。
"we may share your personal information..."
だが、share を use と置き換えるとゾッとする。we ってのも怪しい。政府や企業、あるいはテロリストも含まれるってことだ。SNSを取り巻く世界には、個人情報の分析から利益を上げるビジネスモデルによって這い上がってきた企業が群がる。通信業者は、こんなことを平然と宣言する。
「当社は、利用目的の達成のために、利用者から個人情報をご提供いただくことがあります!」
人類の叡智を共有するとは、なんと美しい理念であろう。クラウド時代では、すべてを持たなくて済む、いや、持った気になれる。では、真の所有者は誰か?いまやビッグデータは、漏洩経路を辿ることすらできず、独り歩きを始めた。利便性が宗教化すると、いっそう自己責任が問われる。そもそも所有なんてものは、幻想なのかもしれん...
ところで、社会の多様化、生活様式の多様化が進む一方で、なぜこうもコモディティ化が促進されるのだろうか?単純に経済効果を狙っているだけか?少々使い方が合わなくても、人間は馴らされやすい動物ということか?最新製品を持っている、使っているというだけで、一つのステータスになっているのは確かだ。アリストテレスの生まれつき奴隷説も、あながち間違いとは言えまい。ちなみに、進化という言葉は迷信化しやすい... と誰が言ったかは知らん。
1. Microsoftアカウントとローカルアカウント
まず、アカウント空間が二つあることに戸惑う。OneNote などのアプリで「共有&同期」思想を活用するためには、Microsoftアカウントとローカルアカウントが関連付けられている必要がある。実際、関連付けることを推奨している。だが、余計なデータ転送をバックグランドでされたくない場合や、完全なローカル空間で仕事がしたい場合もある。そんな時は、ローカルアカウントで起動すればいい。おかげで、ストアアプリの利用やインストールなどをアカウント毎に制限できるわけだが、管理思想がどうも肌に合わない。
特に驚いたのは、購入して最初のセットアップ時にユーザ名やパスワードが聞かれるので、安易に答えると、意図しないフォルダ名がローカル空間に作成される。"c:\User\ユーザ名" てな具合に。姓と名が聞かれ、どちらの入力もサボれないようになっていて、名の方がフォルダ名になった。世間では、漢字名を指定して往生した人も少なくないようだ。
このフォルダ名を変更したければ、別のローカルアカウントを作成して、こちらにMicrosoftアカウントとの関連付けを移して、元のアカウントを削除すればいい。
しかし、だ。散々カスタマイズした挙句にこれをやれば、環境設定を最初からやり直し... 冗談じゃない!そこで、環境を保持したままフォルダ名を変更するには、実体名とレジストリにエントリされるポインタ値をいじればいい。当然ながら、この整合性が崩れると起動画面が崩れる。しかも、ポインタ値は、Microsoftアカウントとの関連付けにも使われる。
したがって、変更作業では、Administrator権限を持ったダミーのローカルアカウントを作成し、そこで作業しなければならない。そして、実体名(c:\Users\ユーザ名)と、以下のレジストリにエントリされるポインタ値を変更する。
"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\"
ここで該当するUIDの "ProfileImagePath" を変更。
その後、改めて元のユーザ名でログインし、Microsoftアカウントとの関連付けを戻せば修復できる。理屈では...
ただし、危険な作業であることは間違いないし、そのまま放置するのが最も賢明な選択かもしれない。実は一度しくじったが、Administrator権限を持つ別のアカウントがあれば、どうにでもなる。また、レジストリにゴミが溜まったり、アプリケーションによっては多少の不具合が出るかもしれない。ちなみに、おいらの場合、Windows Media Player の再生リスト群が二重になった。どちらが本物かはすぐに判別でき、偽物の方を削除すれば済む。要するに、パス変更でリンク関係が崩れることになるので、注意が必要!
2. セキュリティソフト... avast!2014 vs. Windows Defender
avast!を愛用してきたが、アクションセンターが Windows Defender との共存を嫌う。無理やり共存させる手もなくはないが、却ってスッキリしない。おまけに、アクションセンターが、起動が重い!バッテリー寿命が短くなる!などと騒ぎよる。ここは素直に Windows Defender にしてみるかぁ...
3. タッチキーボードとスクリーンキーボード
デフォルトのタッチキーボードで、イライラ!
記号キーを表示するために、[&123]ボタンで切り替えなければならないし、ファンクションキーも見当たらない。そこで、ハードウェア準拠のキーボードが選択できる。
[PC設定の変更] -> [PCとデバイス] -> [入力]で、"ハードウェアに準拠したレイアウトをタッチキーボードオプションとして追加する" スイッチをオン。
これで、タッチキーボードの右下で、物理キーボード風のマークが選択可能となる。
また、タッチキーボードとは別にスクリーンキーボードというのがある。これは使えそうだ。大きさと場所が自由に変えられるし、邪魔な時は透過表示ボタンがある。そして、スタート画面とデスクトップ画面の間で移動しても、キーボードは表示したまま。これはどうでもええか、いや余計か...
4. ついでに、大雑把な作りを感じたものをメモっておく
デスクトップ画面のアイコン間隔を微調整するには、レジストリをいじるしかなさそうだ。Win7 には[画面デザインの詳細設定]ってやつがあるが...
"HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics"
試しに、アカウント画像を作成してみると、デフォルト状態に戻せない。なんじゃそりゃ!画像を消すには、これまたレジストリをいじるしかなさそうだ。作成という概念はあっても、削除という概念はないのか?
"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AccountPicture\Users\"
ここで該当する SID にアクセス許可を与えて、以下のキーを削除。
"Image200, Image240, Image40, Image448, Image96"
... 結局、レジストリをいじる羽目になるのなら、Windows のGUI思想は成功へ導いているのだろうか?金儲けで成功すれば、それは成功というわけか...
実際、タッチパネル操作で違和感はない。指で操作するにはアイコンはそこそこ大きい方がいいし、マウス操作では余計なAeroスナップ機能もタッチパネルではちょっと便利。
なによりも、スタート画面のタイル構想は、単にアプリ起動の一覧だけではなく、最新情報の通知という大きな役割がある。天気予報やニュース、カレンダーやスケジュール、メールやSNSなど。ストアには、ろくなものが見当たらないが、可能性を感じさせてくれる。とりあえず欲しいのはバッテリー残量表示、そして、バックグランドでタスクを動かすことが多いので、CPUやメモリのモニタであろうか。タスクマネージャやリソースメータあたりのグラフから、スタート画面にピン留めできるのでもいい。さらに、せっかくのタイルに、JavaScript などのコードが埋めこめれば、本格的なポータル画面に位置づけることができるだろう。セキュリティポリシーに反するか?既に無法地帯か...
しかしながら、デスクトップ環境で、わざわざディスプレイまで手を伸ばそうとは思わない。ましてやマルチディスプレイ環境で。それに、マウスの方が細かい操作に向いている。ただ、ノート環境だからこそ、セカンダリディスプレイの活用幅が拡がるという見方もできそうだ。いずれにせよ、用途が多様化すれば、ユーザインターフェースも多様化しそうなもの。デスクトップPCの Win7 を Win8.1 にアップする気にはなれん...
世間全般の傾向として、大雑把な仕様になりつつあるようだ。Webサービスには、何年も放置された些細なバグが目立つ。使う分には、ほとんど支障にならないので、無視するようになっていく。情報が氾濫する社会では、つまらない事を気にしている余裕はない。鈍感になるということか。
Win8.1 にしても、余計なカスタマイズは歓迎されない。ユーザは本当に自由を獲得しているのだろうか?おまけに、デフォルト値や推奨、といったものが信用ならない。つい最近、自動アップデートを強く推奨しておきながら、おかげで起動しなくなった!と世間では騒いでいた。しかも対処法では、レジストリをいじれ!と堂々と宣言する。知識のある者はより快適に、知識のない者はより言いなりに... 機会均等という一見美しい理念も、能動的性格と受動的性格をはっきりと区別させ、格差を助長させるのかもしれん。そりゃ、毎日呑んだくれてりゃ、ついていけんよ!
通信業界も負けじと、課金方向に誘導しやがる。プライバシーポリシーでは、心地良いフレーズが踊る。
"we may share your personal information..."
だが、share を use と置き換えるとゾッとする。we ってのも怪しい。政府や企業、あるいはテロリストも含まれるってことだ。SNSを取り巻く世界には、個人情報の分析から利益を上げるビジネスモデルによって這い上がってきた企業が群がる。通信業者は、こんなことを平然と宣言する。
「当社は、利用目的の達成のために、利用者から個人情報をご提供いただくことがあります!」
人類の叡智を共有するとは、なんと美しい理念であろう。クラウド時代では、すべてを持たなくて済む、いや、持った気になれる。では、真の所有者は誰か?いまやビッグデータは、漏洩経路を辿ることすらできず、独り歩きを始めた。利便性が宗教化すると、いっそう自己責任が問われる。そもそも所有なんてものは、幻想なのかもしれん...
ところで、社会の多様化、生活様式の多様化が進む一方で、なぜこうもコモディティ化が促進されるのだろうか?単純に経済効果を狙っているだけか?少々使い方が合わなくても、人間は馴らされやすい動物ということか?最新製品を持っている、使っているというだけで、一つのステータスになっているのは確かだ。アリストテレスの生まれつき奴隷説も、あながち間違いとは言えまい。ちなみに、進化という言葉は迷信化しやすい... と誰が言ったかは知らん。
1. Microsoftアカウントとローカルアカウント
まず、アカウント空間が二つあることに戸惑う。OneNote などのアプリで「共有&同期」思想を活用するためには、Microsoftアカウントとローカルアカウントが関連付けられている必要がある。実際、関連付けることを推奨している。だが、余計なデータ転送をバックグランドでされたくない場合や、完全なローカル空間で仕事がしたい場合もある。そんな時は、ローカルアカウントで起動すればいい。おかげで、ストアアプリの利用やインストールなどをアカウント毎に制限できるわけだが、管理思想がどうも肌に合わない。
特に驚いたのは、購入して最初のセットアップ時にユーザ名やパスワードが聞かれるので、安易に答えると、意図しないフォルダ名がローカル空間に作成される。"c:\User\ユーザ名" てな具合に。姓と名が聞かれ、どちらの入力もサボれないようになっていて、名の方がフォルダ名になった。世間では、漢字名を指定して往生した人も少なくないようだ。
このフォルダ名を変更したければ、別のローカルアカウントを作成して、こちらにMicrosoftアカウントとの関連付けを移して、元のアカウントを削除すればいい。
しかし、だ。散々カスタマイズした挙句にこれをやれば、環境設定を最初からやり直し... 冗談じゃない!そこで、環境を保持したままフォルダ名を変更するには、実体名とレジストリにエントリされるポインタ値をいじればいい。当然ながら、この整合性が崩れると起動画面が崩れる。しかも、ポインタ値は、Microsoftアカウントとの関連付けにも使われる。
したがって、変更作業では、Administrator権限を持ったダミーのローカルアカウントを作成し、そこで作業しなければならない。そして、実体名(c:\Users\ユーザ名)と、以下のレジストリにエントリされるポインタ値を変更する。
"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\"
ここで該当するUIDの "ProfileImagePath" を変更。
その後、改めて元のユーザ名でログインし、Microsoftアカウントとの関連付けを戻せば修復できる。理屈では...
ただし、危険な作業であることは間違いないし、そのまま放置するのが最も賢明な選択かもしれない。実は一度しくじったが、Administrator権限を持つ別のアカウントがあれば、どうにでもなる。また、レジストリにゴミが溜まったり、アプリケーションによっては多少の不具合が出るかもしれない。ちなみに、おいらの場合、Windows Media Player の再生リスト群が二重になった。どちらが本物かはすぐに判別でき、偽物の方を削除すれば済む。要するに、パス変更でリンク関係が崩れることになるので、注意が必要!
2. セキュリティソフト... avast!2014 vs. Windows Defender
avast!を愛用してきたが、アクションセンターが Windows Defender との共存を嫌う。無理やり共存させる手もなくはないが、却ってスッキリしない。おまけに、アクションセンターが、起動が重い!バッテリー寿命が短くなる!などと騒ぎよる。ここは素直に Windows Defender にしてみるかぁ...
3. タッチキーボードとスクリーンキーボード
デフォルトのタッチキーボードで、イライラ!
記号キーを表示するために、[&123]ボタンで切り替えなければならないし、ファンクションキーも見当たらない。そこで、ハードウェア準拠のキーボードが選択できる。
[PC設定の変更] -> [PCとデバイス] -> [入力]で、"ハードウェアに準拠したレイアウトをタッチキーボードオプションとして追加する" スイッチをオン。
これで、タッチキーボードの右下で、物理キーボード風のマークが選択可能となる。
また、タッチキーボードとは別にスクリーンキーボードというのがある。これは使えそうだ。大きさと場所が自由に変えられるし、邪魔な時は透過表示ボタンがある。そして、スタート画面とデスクトップ画面の間で移動しても、キーボードは表示したまま。これはどうでもええか、いや余計か...
4. ついでに、大雑把な作りを感じたものをメモっておく
デスクトップ画面のアイコン間隔を微調整するには、レジストリをいじるしかなさそうだ。Win7 には[画面デザインの詳細設定]ってやつがあるが...
"HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics"
試しに、アカウント画像を作成してみると、デフォルト状態に戻せない。なんじゃそりゃ!画像を消すには、これまたレジストリをいじるしかなさそうだ。作成という概念はあっても、削除という概念はないのか?
"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AccountPicture\Users\"
ここで該当する SID にアクセス許可を与えて、以下のキーを削除。
"Image200, Image240, Image40, Image448, Image96"
... 結局、レジストリをいじる羽目になるのなら、Windows のGUI思想は成功へ導いているのだろうか?金儲けで成功すれば、それは成功というわけか...
2014-08-17
開封の儀を執り行う... Surface Pro3
十年前のノートPCを、誤魔化し、誤魔化し... もう我慢できん。ついに衝動買いに走る。モノは「Core i5 + 128GB SSD + 4GB RAM」搭載モデル。思い切って Core i7 を選択する手もあるが、貧乏性には辛い。そして、これがチーム・モバイっちの面々...
タブレット型を選んだのは、メモ機能が欲しかったからである。特に睡眠中に考えつくことが多いので、枕元にメモ用紙を置いていないと落ち着かない。ただ真っ暗でないと眠れないので、メモをとる時は灯りをつけることになる。そこで、手書き入力のできる軽いマシンがあるとありがたい。実際、スリープしたままでもバッテリーの持ちがいいので、毎晩一緒にスリープよ。
ついでに街中の情報を感じながら歩いてみるが、ちとでかい!軽くなったとはいえ、喫茶店あたりで落ち着かないと開く気がしない。そして、スタバ戦略にしてやられる!
しかしながら、本当に必要なのはノートPCとしての装備だ。Surface には前々から目をつけていたが、いまいち気乗りしない。モバイル用途だけなら、こいつを選ぶ理由がないし、タブレット型とノート型の両方を持つのが現実的だと考えている。
こいつが仕事で使い物にならなければ大損だが、引退間際の酔っ払いだって、たまには冒険したい。I/F装備が貧弱な気もしなくはないが、他のスペックを眺める限り、ちっぽけなリスクだろう。実際、USBの電源供給はしょぼいが、SSDの起動が速いし、補って余るものがある。まだまだ手足には程遠いが、幸せに近づきつつある... ような気がする今日この頃であった...
開封して、いきなりタッチパネルで30分ぐらい悪戦苦闘!まず、ストア・アプリの終了の仕方が分からん。画面の左端でスワイプして起動アプリの一覧を表示させ、終了したいアプリをつかんで画面の下端までスライドし、しばらく待つと画面がくるりと回転して終了する。アプリ内では、上端でつかんで下端までスライドし、しばらく待つと画面がくるりと回転して終了する。おぉ~っ...!しかし、3回見たら飽きる。わざわざ回転させなくても、下端に放り投げれば終了できたりして...
さらに、右クリックで悩む。目的の場所で、押したまましばらく待って放すだけ。
どうも、しばらくってのが待ちきれん... 年寄りって言うな!
1. Type Cover(Pro3用) = USキーボード
ノートPCを購入する上で、いつも悩ましいのがキーボードの選択である。OSが多言語対応だというのに、日本で購入する場合、日本語キーボードしか選択肢を与えないというメーカは実に多い。日本マイクロソフトとて例外ではない。このグローバル時代に、外国人たちはどうしてるんだろう?
ちなみに、おいらは二十年来、英語配列キーボードしか使う気がしないネアンデルタール人だ。日本語の刻印が目障りな上に、変換ボタンに圧迫されてスペースキーが短い... ここまでは許せても、記号文字(Shift + !@#...)の配置が違うのはどうも。数式には欠かせない文字群、こいつらを探そうとするだけで思考の妨げになる。キー入力は脳と直結するだけに長く叩くほどストレスとなり、キーボードのデザインにこだわる技術屋は少なくない。そもそも日本語キーを直接叩く人が、知人には一人もいない。八十にもなろうかというお婆ちゃんですら、ローマ字入力をする。
... などと愚痴りながら、Type Cover は並行輸入版を別購入するものの、正規版より1万円ほど高いのはいかんともしがたい。
しかし、モノはそこそこいい!バックライト装備で真っ暗でも叩けるし、打鍵感も悪くない!Home/End/PgUp/PgDn や、チャームに直接アクセスできるキーも揃っている。
タッチパッドもなかなか!当初、なんて使えないパッドだと嘆いていたが、操作法を開拓していくうちに印象がまるで逆転。指感覚では分かりにくいが、手前端に左クリックボタンと右クリックボタンが隠れている。ドラッグ&ドロップは、一本指でタップし、二本目の指でタップしたまま動かす... と思っていたら、一本指でも、ダブルタップして押したまま動かせばいい。ドラッグ&ドロップが改善されるだけで、こうも様変わりするものであろうか。一度キーボードに手が固定されると、億劫な上に惚れっぽい酔っ払いはタッチパネルへ手がいかなくなる。
とりあえず、左サイドで威張っている CapsLock を抹殺して、Ctrl にマッピングしておくかぁ...
2. バッテリー
バッテリーの持ちは意外といい。SSD のメリットも大きそうだ。
まずは、Type Cover を接続し、バックライトを消した状態で、映画や音楽の再生、ファイル転送などでストレスをかけてみる。スリープだけオフにして、他の設定はデフォルトのまま。すると、5時間ほどで、"バッテリー残量がなくなっています(10%)" と大きく表示される。仕様には、ブラウジングで8時間程度となっているが、大袈裟でもなさそうだ。日帰り出張ぐらいなら電源を持ち歩かなくてもよさそう。充電は、起動したままでもそこそこ進み、フル充電に2時間ちょい...
さらに、CPUをガンガン動かす演算処理を残量30%あたりから試す。CPU使用率 70% - 80%、クロック 2.80GHz 近辺をうろちょろするような... さすがに熱を持つ。残量20%の時点で、10%の通知は30分後ぐらいかなぁ... と構えていると、10分ぐらいでいきなり残量ゼロの警告が出て、慌てて電源をつなぐ。バッテリー駆動で、ここまで酷使することはないだろうが、リチウムイオンの特性からして減りだすと速そうだ。いくらリチウムイオン式の二次電池が安定性が高いとはいえ、電解物質の特性からしてメモリ効果を完全にゼロにはできないだろう。使いきってフル充電... を繰り返す方が持ちはいいのだろうけど、シェーバーのような感覚にはなれそうにない。
ちなみに、スタート画面にバッテリー残量表示のアプリがあってもよさそうなものだが、今のところストアには見当たらない。わざわざチャームを出さなければならない上に、表示も貧弱!
3. ハイバネーション
さて、最も気になるのはハイバネーションだ。ハードウェアとOSの相性が現れやすい機能でもある。古くから電源系のトラブルの元という印象があるので、デスクトップ環境では叩き斬るわけだが、ノート環境ではそうもいかん。
電源ボタンには、スリープ、シャットダウン、再起動の三つがエントリされている。これに、休止状態ってのがあるはず。
powercfg -a で確認すると休止状態は利用可能になっているが、無理に表に出すこともあるまい。ただ、シャットダウンしても、Type Cover を叩くと起動することがある。最初は操作ミスだと思っていたが、やはり何度かある。デフォルトで「高速スタートアップ」が有効になっているが、こいつが臭い。でも、やめられん!スリープの方は、ある程度時間が経つと休止状態になるようで、こちらはありがたい。
ちなみに、システムを完全にシャットダウンやコールドリブートさせるためには、こうやればいいらしい。
shutdown /s /t 0 # シャットダウン
shutdown /r /t 0 # コールドリブート
尚、再起動はコールドリブートという噂を耳にしたが、ほんとかなぁ...
本当のシャットダウンではないとすれば、起動の速さをアピールするためのズルか?同期系アプリとの関連性はどうなっているのか?例えば、シャットダウンしたつもりで街を歩いていて、勝手にフリースポットに接続してファイル転送でもやられたらかなわん... まさか!共有やら、同期やら、便利なことは結構だが、裏で何をされるか油断も隙もあったもんじゃない!
4. WiFi機能を試す
無線アクセスポイントを外出先で5ヶ所ほど試したが、接続できない場所は今のところない。スターバックス(at_STARBUCKS_Wi2)もOK。実は、我が家のWiFiルータが一番苦労してたりして...
ちなみに、地元の魚町商店街(UomachiWLAN)は、田舎ながら頑張っている。番地ごとにアクセスポイントを設置して、通りをすべてカバーしようと。無防備だけど。たまーに「制限あり」と表示されて断絶することがあるが、再接続でOK。ただ、隣の通りに行った途端に電波は届かない。
ところで、「制限あり」という症状は、なかなか侮れないようだ。"Surface, Win8.1, 制限あり" で検索すると、対処法がわんさと出てくる。OSの再起動、ドライバのアップデートや再インストール、ルータとの相性など、あるいは諦めた!というものまで...
Surfaceの問題か?Win8.1の問題か?は知らんが、対処法が収束していないことは根本的な問題を抱えているかもしれない。802.11ac が、まだ安定していないというのもありそうか。とりあえず、11n でつながってくれれば文句はない。いずれにせよ、信頼できるアクセスポイントでないと、重要な作業をやる気はしない。重要ポイントで使い物にならなければ困る、さっそく夜の社交場への出張計画を立てるとしよう...
5. 手書きメモツール... OneNote2013 vs. Windows Journal
OneNote には、なんとなく期待していた。尚、標準装備される Office2013 をセットアップすると、OneNote2013 が使えるようになる。こちらの方が断然いい。
Surfaceペンの頭を、シャーペンのようにカチっと押すと、OneNote が起動する。
ペンからの起動を OneNote から OneNote2013 に切り替えるには...
[ファイル] -> [オプション] -> [詳細設定]で、"既定の OneNote アプリケーション" をチェック。
最初、この項目が表示されなかったが、Office2013 を更新すると表示される。
AdobeReader と連携して、pdfファイルが挿入できる。要するに印刷環境さえ整えていれば、ExcelでもWordでも印刷イメージでインポートできる。この機能は大きい。セミナーなどで資料を見ながら、手書きでメモが加えられる。
しかしながら、本当にメモ機能として有効なのは、ファイル保存という概念を取り去ったことだろう。シャットダウンしてもデータが残るので、純粋にメモに集中できる。
ただ、"OneNote のクリーンアップ作業中"というメッセージが出て、起動が異常に遅い場合がある。同期でもとっているのか?どうもクラウドってやつは油断ならん!
ちなみに、Note Anytime ってのもある。タッチキーボードと合わせてかなりのことができそうだが、そこまで機能はいらない。
前からあるツールだが、Windows Journal も悪くない。勝手に雲に上げられたくなければ、こちらの方がいいかもしれない。こいつも、「Journal ノート ライタ」ってやつを[ツール]からインストールしておけば、印刷可能な環境でファイルがインポートできる。しかし、普通のアプリ同様、ファイル保存をやらないとデータが残らない。
この差は意外と大きい。いかにコンピューティングがファイルってやつに付きまとわれてきたか、を考えさせられる。そして、改めてメモという行動パターンを見つめなおすことに... 結局、OneNote2013 に病みつき!
6. OneDrive と「共有&同期」宗教
OneDrive は標準でバインドされる。クラウド空間に15GB容量を無料に提供してくれるサービスのこと。おかげで、OneNote などのアプリで「共有&同期」の概念が前提できるわけだが、有難迷惑なところが多分にある。
ただし、デフォルトの保存先をローカルに変更することも可能。
[PC設定の変更] -> [OneDrive] -> [ファイルの保存」で、"ドキュメントを既定でOneDriveに保存" スイッチをオフ。
これで本当に安心できるのかは知らんが、とりあえず信じてみよう。
さらに、[同期の設定] にわんさと項目が出現するのに仰天!こいつは、環境設定で最初にやるべきではないか。ネットワークに参加している他の Win8.1 マシン上で、Microsoftアカウントにログインしようものなら、環境ごと同期を始めそうな項目が並んでいる。スタート画面のレイアウト、ウィンドウのデザイン、個人設定のテーマ、ブラウザ環境、言語設定...
バックアップ設定では、OneDrive と同期させておくと、PCの復元もできる。確かに便利なものもあるが、デフォルトですべてオンになっているのは強烈!
ちなみに、起動時のログインに、Microsoftアカウントとローカルアカウントが選択できるが、これも悩ましい。例えば、全アプリ一覧画面の構成が気に入らないから、以下のディレクトリでショートカット群の階層を整理すると、再起動だけでは不十分で、同期がとれるまで反映されないようだ。
"c:\ProgramData\Microsoft\Windows\Start Menu\Programs"
全般的に余計なカスタマイズは歓迎されない。ユーザは本当に自由を獲得しているのだろうか?
ところで、持たない時代とは、持たれる時代ということか。じゃ、誰に?そんなこと知ったこっちゃない。ますます鈍感力が問われる時代ということか。生物は危険性を認知できるからこそ進化してきたはずだが...
タブレット型を選んだのは、メモ機能が欲しかったからである。特に睡眠中に考えつくことが多いので、枕元にメモ用紙を置いていないと落ち着かない。ただ真っ暗でないと眠れないので、メモをとる時は灯りをつけることになる。そこで、手書き入力のできる軽いマシンがあるとありがたい。実際、スリープしたままでもバッテリーの持ちがいいので、毎晩一緒にスリープよ。
ついでに街中の情報を感じながら歩いてみるが、ちとでかい!軽くなったとはいえ、喫茶店あたりで落ち着かないと開く気がしない。そして、スタバ戦略にしてやられる!
しかしながら、本当に必要なのはノートPCとしての装備だ。Surface には前々から目をつけていたが、いまいち気乗りしない。モバイル用途だけなら、こいつを選ぶ理由がないし、タブレット型とノート型の両方を持つのが現実的だと考えている。
こいつが仕事で使い物にならなければ大損だが、引退間際の酔っ払いだって、たまには冒険したい。I/F装備が貧弱な気もしなくはないが、他のスペックを眺める限り、ちっぽけなリスクだろう。実際、USBの電源供給はしょぼいが、SSDの起動が速いし、補って余るものがある。まだまだ手足には程遠いが、幸せに近づきつつある... ような気がする今日この頃であった...
開封して、いきなりタッチパネルで30分ぐらい悪戦苦闘!まず、ストア・アプリの終了の仕方が分からん。画面の左端でスワイプして起動アプリの一覧を表示させ、終了したいアプリをつかんで画面の下端までスライドし、しばらく待つと画面がくるりと回転して終了する。アプリ内では、上端でつかんで下端までスライドし、しばらく待つと画面がくるりと回転して終了する。おぉ~っ...!しかし、3回見たら飽きる。わざわざ回転させなくても、下端に放り投げれば終了できたりして...
さらに、右クリックで悩む。目的の場所で、押したまましばらく待って放すだけ。
どうも、しばらくってのが待ちきれん... 年寄りって言うな!
1. Type Cover(Pro3用) = USキーボード
ノートPCを購入する上で、いつも悩ましいのがキーボードの選択である。OSが多言語対応だというのに、日本で購入する場合、日本語キーボードしか選択肢を与えないというメーカは実に多い。日本マイクロソフトとて例外ではない。このグローバル時代に、外国人たちはどうしてるんだろう?
ちなみに、おいらは二十年来、英語配列キーボードしか使う気がしないネアンデルタール人だ。日本語の刻印が目障りな上に、変換ボタンに圧迫されてスペースキーが短い... ここまでは許せても、記号文字(Shift + !@#...)の配置が違うのはどうも。数式には欠かせない文字群、こいつらを探そうとするだけで思考の妨げになる。キー入力は脳と直結するだけに長く叩くほどストレスとなり、キーボードのデザインにこだわる技術屋は少なくない。そもそも日本語キーを直接叩く人が、知人には一人もいない。八十にもなろうかというお婆ちゃんですら、ローマ字入力をする。
... などと愚痴りながら、Type Cover は並行輸入版を別購入するものの、正規版より1万円ほど高いのはいかんともしがたい。
しかし、モノはそこそこいい!バックライト装備で真っ暗でも叩けるし、打鍵感も悪くない!Home/End/PgUp/PgDn や、チャームに直接アクセスできるキーも揃っている。
タッチパッドもなかなか!当初、なんて使えないパッドだと嘆いていたが、操作法を開拓していくうちに印象がまるで逆転。指感覚では分かりにくいが、手前端に左クリックボタンと右クリックボタンが隠れている。ドラッグ&ドロップは、一本指でタップし、二本目の指でタップしたまま動かす... と思っていたら、一本指でも、ダブルタップして押したまま動かせばいい。ドラッグ&ドロップが改善されるだけで、こうも様変わりするものであろうか。一度キーボードに手が固定されると、億劫な上に惚れっぽい酔っ払いはタッチパネルへ手がいかなくなる。
とりあえず、左サイドで威張っている CapsLock を抹殺して、Ctrl にマッピングしておくかぁ...
2. バッテリー
バッテリーの持ちは意外といい。SSD のメリットも大きそうだ。
まずは、Type Cover を接続し、バックライトを消した状態で、映画や音楽の再生、ファイル転送などでストレスをかけてみる。スリープだけオフにして、他の設定はデフォルトのまま。すると、5時間ほどで、"バッテリー残量がなくなっています(10%)" と大きく表示される。仕様には、ブラウジングで8時間程度となっているが、大袈裟でもなさそうだ。日帰り出張ぐらいなら電源を持ち歩かなくてもよさそう。充電は、起動したままでもそこそこ進み、フル充電に2時間ちょい...
さらに、CPUをガンガン動かす演算処理を残量30%あたりから試す。CPU使用率 70% - 80%、クロック 2.80GHz 近辺をうろちょろするような... さすがに熱を持つ。残量20%の時点で、10%の通知は30分後ぐらいかなぁ... と構えていると、10分ぐらいでいきなり残量ゼロの警告が出て、慌てて電源をつなぐ。バッテリー駆動で、ここまで酷使することはないだろうが、リチウムイオンの特性からして減りだすと速そうだ。いくらリチウムイオン式の二次電池が安定性が高いとはいえ、電解物質の特性からしてメモリ効果を完全にゼロにはできないだろう。使いきってフル充電... を繰り返す方が持ちはいいのだろうけど、シェーバーのような感覚にはなれそうにない。
ちなみに、スタート画面にバッテリー残量表示のアプリがあってもよさそうなものだが、今のところストアには見当たらない。わざわざチャームを出さなければならない上に、表示も貧弱!
3. ハイバネーション
さて、最も気になるのはハイバネーションだ。ハードウェアとOSの相性が現れやすい機能でもある。古くから電源系のトラブルの元という印象があるので、デスクトップ環境では叩き斬るわけだが、ノート環境ではそうもいかん。
電源ボタンには、スリープ、シャットダウン、再起動の三つがエントリされている。これに、休止状態ってのがあるはず。
powercfg -a で確認すると休止状態は利用可能になっているが、無理に表に出すこともあるまい。ただ、シャットダウンしても、Type Cover を叩くと起動することがある。最初は操作ミスだと思っていたが、やはり何度かある。デフォルトで「高速スタートアップ」が有効になっているが、こいつが臭い。でも、やめられん!スリープの方は、ある程度時間が経つと休止状態になるようで、こちらはありがたい。
ちなみに、システムを完全にシャットダウンやコールドリブートさせるためには、こうやればいいらしい。
shutdown /s /t 0 # シャットダウン
shutdown /r /t 0 # コールドリブート
尚、再起動はコールドリブートという噂を耳にしたが、ほんとかなぁ...
本当のシャットダウンではないとすれば、起動の速さをアピールするためのズルか?同期系アプリとの関連性はどうなっているのか?例えば、シャットダウンしたつもりで街を歩いていて、勝手にフリースポットに接続してファイル転送でもやられたらかなわん... まさか!共有やら、同期やら、便利なことは結構だが、裏で何をされるか油断も隙もあったもんじゃない!
4. WiFi機能を試す
無線アクセスポイントを外出先で5ヶ所ほど試したが、接続できない場所は今のところない。スターバックス(at_STARBUCKS_Wi2)もOK。実は、我が家のWiFiルータが一番苦労してたりして...
ちなみに、地元の魚町商店街(UomachiWLAN)は、田舎ながら頑張っている。番地ごとにアクセスポイントを設置して、通りをすべてカバーしようと。無防備だけど。たまーに「制限あり」と表示されて断絶することがあるが、再接続でOK。ただ、隣の通りに行った途端に電波は届かない。
ところで、「制限あり」という症状は、なかなか侮れないようだ。"Surface, Win8.1, 制限あり" で検索すると、対処法がわんさと出てくる。OSの再起動、ドライバのアップデートや再インストール、ルータとの相性など、あるいは諦めた!というものまで...
Surfaceの問題か?Win8.1の問題か?は知らんが、対処法が収束していないことは根本的な問題を抱えているかもしれない。802.11ac が、まだ安定していないというのもありそうか。とりあえず、11n でつながってくれれば文句はない。いずれにせよ、信頼できるアクセスポイントでないと、重要な作業をやる気はしない。重要ポイントで使い物にならなければ困る、さっそく夜の社交場への出張計画を立てるとしよう...
5. 手書きメモツール... OneNote2013 vs. Windows Journal
OneNote には、なんとなく期待していた。尚、標準装備される Office2013 をセットアップすると、OneNote2013 が使えるようになる。こちらの方が断然いい。
Surfaceペンの頭を、シャーペンのようにカチっと押すと、OneNote が起動する。
ペンからの起動を OneNote から OneNote2013 に切り替えるには...
[ファイル] -> [オプション] -> [詳細設定]で、"既定の OneNote アプリケーション" をチェック。
最初、この項目が表示されなかったが、Office2013 を更新すると表示される。
AdobeReader と連携して、pdfファイルが挿入できる。要するに印刷環境さえ整えていれば、ExcelでもWordでも印刷イメージでインポートできる。この機能は大きい。セミナーなどで資料を見ながら、手書きでメモが加えられる。
しかしながら、本当にメモ機能として有効なのは、ファイル保存という概念を取り去ったことだろう。シャットダウンしてもデータが残るので、純粋にメモに集中できる。
ただ、"OneNote のクリーンアップ作業中"というメッセージが出て、起動が異常に遅い場合がある。同期でもとっているのか?どうもクラウドってやつは油断ならん!
ちなみに、Note Anytime ってのもある。タッチキーボードと合わせてかなりのことができそうだが、そこまで機能はいらない。
前からあるツールだが、Windows Journal も悪くない。勝手に雲に上げられたくなければ、こちらの方がいいかもしれない。こいつも、「Journal ノート ライタ」ってやつを[ツール]からインストールしておけば、印刷可能な環境でファイルがインポートできる。しかし、普通のアプリ同様、ファイル保存をやらないとデータが残らない。
この差は意外と大きい。いかにコンピューティングがファイルってやつに付きまとわれてきたか、を考えさせられる。そして、改めてメモという行動パターンを見つめなおすことに... 結局、OneNote2013 に病みつき!
6. OneDrive と「共有&同期」宗教
OneDrive は標準でバインドされる。クラウド空間に15GB容量を無料に提供してくれるサービスのこと。おかげで、OneNote などのアプリで「共有&同期」の概念が前提できるわけだが、有難迷惑なところが多分にある。
ただし、デフォルトの保存先をローカルに変更することも可能。
[PC設定の変更] -> [OneDrive] -> [ファイルの保存」で、"ドキュメントを既定でOneDriveに保存" スイッチをオフ。
これで本当に安心できるのかは知らんが、とりあえず信じてみよう。
さらに、[同期の設定] にわんさと項目が出現するのに仰天!こいつは、環境設定で最初にやるべきではないか。ネットワークに参加している他の Win8.1 マシン上で、Microsoftアカウントにログインしようものなら、環境ごと同期を始めそうな項目が並んでいる。スタート画面のレイアウト、ウィンドウのデザイン、個人設定のテーマ、ブラウザ環境、言語設定...
バックアップ設定では、OneDrive と同期させておくと、PCの復元もできる。確かに便利なものもあるが、デフォルトですべてオンになっているのは強烈!
ちなみに、起動時のログインに、Microsoftアカウントとローカルアカウントが選択できるが、これも悩ましい。例えば、全アプリ一覧画面の構成が気に入らないから、以下のディレクトリでショートカット群の階層を整理すると、再起動だけでは不十分で、同期がとれるまで反映されないようだ。
"c:\ProgramData\Microsoft\Windows\Start Menu\Programs"
全般的に余計なカスタマイズは歓迎されない。ユーザは本当に自由を獲得しているのだろうか?
ところで、持たない時代とは、持たれる時代ということか。じゃ、誰に?そんなこと知ったこっちゃない。ますます鈍感力が問われる時代ということか。生物は危険性を認知できるからこそ進化してきたはずだが...
2014-08-10
"数学と論理をめぐる不思議な冒険" Joseph Mazur 著
数学を小説のように読ませてくれる書とは、こういうものを言うのであろうか。そこには、タレスやピュタゴラスによって始まった幾何的思考から、カントールやゲーデルを苛ませた無限の概念に至るまでの論理思考の旅物語がある。幾何的思考の根源は、精神空間を物理空間に投影しようという試みから始まった。そこに代数的思考、すなわち記号が融合すると、アレフという別世界が開ける。「万物は数である」という信仰が崇められ、数学が極めて宗教臭い時代、無限の概念はゼノンのアキレスと亀の競争物語によって伝えられた。アリストテレスは、「現実的な無限」と「可能的な無限」を区別し、自然数の集合を「可能的な無限」と考えたようである。アルキメデスに至っては、既に可能無限から実無限の概念へ飛躍していたのではないか、という研究報告がある。だからといって、ニュートンやライプニッツの微積分学の功績が色褪せることはない。ほんの束の間ヒルベルトの時代、宇宙のすべては数学で完全に記述できるとされた。しかし、ゲーデルがどんな論理にも不完全性が紛れ込むことを証明すると、数学はまたしても哲学の領域へ引き戻される。人類は、無限を手懐けるために二千年以上もの旅を続けてきたが、いまだ精神空間を完璧に物理空間に投影できないでいる。数学は、永遠に哲学に幽閉され続けるのかもしれん...
「数学は精神で構成するものであり、精神の活動を通す以外には、実存性はもちえない。記号、方程式、定理は、数学の内容を伝えるための手段にすぎない。それらのものは命題をなし、それが集まって物語となる。」
数学の王道は演繹原理にある。それは、ユークリッドが原論で示した証明への道筋だ。純粋な証明ほど説得力のあるものはない。自己主張を論理武装しようとするのは、それが説得の道だからだ。
しかしながら、説得の道にはもう一つある。見たまんま!ってやつだ。実際、原論は五つの公準から成り立っている。公準とは、平たく言えば前提である。つまり、証明の要なし、いや、証明できない自明な命題があることを承知せよ!と要請している。すべての論理証明が前提によって成り立つとすれば、前提の根源を考察せずにはいられない。人間は何事を思考するにも、まず直感や直観の類いを働かせる。インスピレーションとは、ある種の霊感のようなものであろうか。そうした思いつきは極めて経験的であり、演繹に至る前に帰納という思考を試している。純粋な思考だけで定理は導けない。寄り道、回り道、近道といった思考実験を繰り返すうちに、定理らしきものがうっすらと見えてくる。学問に王道なし!とは、この道だ。王道を探るには、覇道や邪道も探ることになる。定理への道は前提から始まる、これを帰納原理とでもしておこうか。とはいえ、邪道ばかり歩いていると疲れる...
前提ほど脆いものはない。まさに非ユークリッド幾何学は、第五公準の崩壊によってもたらされた。第五公準の言い換えはいくつもあるが、ここではルジャンドルの言葉を拝借しよう。
「角の和が180度に等しい三角形が少なくともひとつ存在する。」
だからといって、ユークリッドを蔑む者はいないだろう。ポアンカレはこう言ったという。
「ひとつの幾何学が他の幾何学に比べてより正しいということはありえない。どちらが便利かと言えるだけである。」
人間社会もまた、すべて前提によって成り立っている。社会制度、政治体制、経済システムなどすべてが。民主主義社会では説得の力がモノを言う。説得力とは奇妙なもので、論理だけでは心もとなく、信じこませる何かひと押しがいる。すると、大数の法則は多数決の原理と結びつき、感情の向う確率論に支配されるという寸法よ。これを意志力というかは知らん。物事が客観性から乖離するほど扇動の力が武器となる。アピールやプレゼンテーションなどと呼ばれる技術が、それだ。精神が素粒子で構成されているとすれば、量子力学に従うはず。そこで、宇宙人たちの噂を耳にした。地球という天体には、マクスウェルの悪魔君が大勢いる世界があるとさ...
「天秤は、おもりを載せれば必然的に下がらざるをえない。それと同じく、精神は明白な証明には屈せざるを得ない。精神がからっぽで、釣り合い用のおもりがなければ、最初に言われたことの説得力の重みにすぐに負けてしまう。」
... モンテーニュ「エセー」の中のキケロの引用...
1. 疑い深きトマス君!
著者ジョセフ・メイザーは、マールボロ大学の数学教授。彼は講義中にこんな実験をしたという...
まず前提で、2p - 1 は、p が素数の時、必ず素数になると宣言する。そして、2 から 19 までの数を計算して見せる。わざと p = 11 を飛ばして。さて、受講生の反応はいかに...
1000 の桁に達すると、学生諸君は教授の権威によりかかる。だが、冷静になってくると、ある学生が疑念を抱き始めたという。最前列に陣取る彼の名は、トマス君!イエスの復活を信じなかった、疑い深きトマスにかけているのかは知らん。彼は、実例だけでは証明にならないと食い下がる。確かに、p = 11 や p = 23 では成り立たない。
211 -1 = 2047 = 23 x 89
223 -1 = 8,388,607 = 47 x 178,481
数学は純粋な判断であり、想像力が作る虚構とは次元が違うという評判だが、それは本当だろうか?数学だって、経験を基に憶測で納得しているところがあるのでは...
学校は、証明の手順を真似することを教える。証明を思いつく方法を教えるわけではないし、教えられるものでもない。試験とは、既存の証明をまる写しすれば良い成績が取れる仕組みである。おいらが好青年と呼ばれていた頃、数学は暗記科目ではないと固く信じていた。試験中に公式を導くところから始めていると、とても時間が足りない。決定的だったのは大学に入ってからだ。暗記科目と割り切れないと単位がとれない... どうせ落ちこぼれの愚痴よ!
おっと、話を戻すと...
反証するには一つの反例を示せばいい。だが、証明の方はどうであろう?真理が精神空間に映し出される幻影に過ぎないとすれば、数学もまた芸術の域にある。証明への道が無条件のエクスタシーを与えるならば、数学もなかなかの宗教だ。今でも証明されていない難題が真であることを頑なに信じて、その証明に人生を捧げている研究者たちがいる。その定理は、あてすっぽに真理らしきものを、気まぐれに語っただけかもしれないのに...
ポアンカレ曰く、「すべてを疑うのも、すべてを信じるのも、同じように都合のいい手だ。どちらもよく考えてみなくてすむ。」
2. 推論式(シロジズム)と自己矛盾性
数学の論証は、推論式によって組み立てられる。つまり、「もし~ならば~...」式の束によって。本書は「シロジズム」と呼んでいるが、なかなか微妙な用語である。論理学の根源は、アリストテレスの演繹モデルに従う。「すべての人は死ぬ。ソクラテスは人である。故にソクラテスは死ぬ。」 の類いだ。この手の三段論法を好む社会学者や経済学者は、実に多い。歴史は言うであろう。戦争が起こる時は必ず強大な軍事指導者がいたと。故に、強大な指導者がいる時は必ず戦争が起こると。
一方で、三段論法の危険性を忌み嫌う数学者や科学者は少なくない。ただ、一つの命題が他の命題との依存関係によって成り立っていることは事実だ。キェルケゴール風に言えば... 命題とは一つの関係、その関係はそれ自身に関係する関係の関係の... 狂ったか!
関係が複雑ならば、論理をほぐすために、カルノー図のような見た目で解釈する方法がある。実際、ブール代数を簡略化して真の意味を探ろうとする思考が、コンピュータシステムを支えている。こうした論理性は、境界条件によって支えられている。
ただ、論証できるからといって意味があるとは限らないし、結論が前提から導き出せるとしても前提の正しさとは無関係だ。ここに、根源的な論理の脆弱性が内包されている。ウィトゲンシュタインは、考えを伝える時に混乱を避ける方法は、論理的に正確な言語を作り、それぞれの単語に一つしか意味を持たないようにすることだとしたという。
しかしながら、一つの意味とはどういう意味か?精神の内で勝手にイメージされるものを、どうやって一つに集約できるのか?客観性に満ちているはずの専門用語ですら、微妙にニュアンスの違いを見せ、誰一人として同じ言葉を喋っちゃいない。記号に意味が生じた時、既に感覚と結びついているではないか。
とはいえ、人間社会は、矛盾だらけの言語を用いながら、それなりに通じ合っている。確かに、代数的記号は無味乾燥的なものだ。x = y という式の意味は、それ以上でも、それ以下でもない。だが、人間が解釈した途端に客観性を失う。コンピュータ言語だって人間が意味解釈をすれば、そりゃ暴走もする。純粋客観とは、無認識の領域にしかないのかもしれん。ここに、数学の抱える自己矛盾性があるのではなかろうか...
3. 数を数え続ける動物
プラトンのあまり知られていない短い対話篇「エピノミス」は、こんなことを論じているという。
「動物の魂は、理性的な計算ができなければ、魂の力の長所すべてを得ることはできないだろうし、2 と 3、奇数と偶数を認識できず、数をまったく知らない人は、事物を合理的に説明することはできないだろう。事物について、感覚と記憶しか有しないからだ。それで勇気や沈着などのその他の長所がなくなるわけではないにしても。しかし真に語ることができなければ、人は決して賢くはならず、十全な徳の最も重要な成分である賢さがないことには、その人は完全な善に達することはありえず、したがって幸福にもなれないことになる。」
人間は自然数の概念になんの疑いもなく、数え続けてきた。数の概念がなければ文明すら成り立たない。それはプラトンの言うように、本能的に理性を求めている証であろうか?
ところで、ユプノ族というニューギニアの奥地に暮らす原住民には、手の込んだ計算法があるそうな。まず指から始まり、いろいろな体の部分を指定の順に右から左へ移りながら、33 まで数えるという。
ちなみに、フランス式指電卓というものがあると聞く。
「計算機がなくても、掛け算が出来る便利な方法があるのをご存じですか。俗にいうフランス式指電卓です。
7 x 8 = 56 の場合、左は、7 を表します。御一緒に... いち、にぃ、さん、しぃ、ごぉ、ろく、しち。右は、8 を表します。御一緒に... いち、にぃ、さん、しぃ、ごぉ、ろく、しち、はち。次は答えです。十の位は立ってる指を足します。2 + 3 で 5 ですね。一の位は折れてる指を掛けます。3 x 2 で 6。ということで、7 x 8 = 56。九九を忘れた方はぜひやってみてください。
では次に、8 x 9 = 72 にチャレンジ。いち、にぃ... これ大変時間がかかります。お好きな方は自分でやってみてください。」
... 「警部補・古畑任三郎スペシャル 笑うカンガルー」より...
4. 有限と無限の境界
エレアのゼノンは、亀にハンデをやれば、いくら足の速いアキレスでも勝てないことを論じた。アキレスが亀のスタート時点に着いた時には亀はさらに先に進んでおり、次の亀のスタート時点に着いた時には亀はさらに進んでいる。これを繰り返せば、永遠に追いつけないと。この謎掛けには、摩訶不思議な世界がある。亀もアキレスも、有限の時間で、有限の距離を進んでいる。なのに、追いつく距離は無限に縮まり、迫りくる無限小の時間の中でもがき続ける。それでも、境界条件をちょいと加えると論理は崩れるかもしれん。
「靴下さえ履いていたら、アキレスもちゃんと勝ったはずだ!」
さて、有理数と無理数の違いにも摩訶不思議な境界がある。有理数とは、分母と分子を自然数で表せる数。自然数は無限にあり、分母も分子も無限に配置できる。どんな有理数と有理数の間にも必ず有理数を配置できるわけで、無限小の隙間を埋め尽くせそうな気がする。にもかかわらず、有理数では表せない無理数ってやつが存在しやがる。そりゃ、ピュタゴラス教団も慌てるわね。無理数とは、無限の自然数で配置される有理数よりも、高貴な無限なのか?無限にも濃度があるというカントールの主張は、出任せではなさそうである。
それにしても、初めてカントールの無限に触れた時には、たまげた!デカルト座標上のすべての点は、数直線上の点と一対一で対応できるというのだから。集合論は詐欺か?論理とは、屁理屈と紙一重の世界にある... とでもしておこうか。
これと似た感覚がトポロジーの世界にもあって、ドーナツもコーヒーカップも同じ形とされる。形の属性において「位相」にだけ着目すれば、確かにそうなる。もはや常識ってやつは、まるで役に立たない。着眼条件をちょいと変えるだけで、客観性の視点も変わるということだ。
無限濃度の境界条件には「可算」という概念がある。平たく言えば、数えることが可能かどうかによって濃度が区別されるということ。無限と無限を比較する時、一対一の対応というと少々抵抗があるので、対応するものが必ず一つだけあるとしたらどうだろう。言い方をちょいと変えただけよ。直観的に大小関係を感じても、互いに無限個あれば、対応がつかないなんてことはありえない。同じ原理を用いれば、整数も、偶数も、奇数も、はたまた有理数もすべて同じ無限個数ということになる。
「有限の世界が無限の世界と出会うところには、ヘリも境界も端も限界もない。有限の図が無限の図になる特定の瞬間もない。」
ここで、人間の直観には、見たまんま!という思考原理が働くことに注意しよう。知覚の危険性が潜んでいることを。例えば、生まれつきの盲人が40歳で視力回復手術を受けた時の体験談を読むと、階段が目の前にあるのに、足下に危険があることすら認識できないと語っていた。形の属性は確実に認識できても、それが自分の身にどんな作用が生じるかまでは分からないらしい。そして、映像情報が大量に脳に入り込み、処理能力が追いつけず、却って精神病を患うことになる。あるいは、よく見慣れた人の顔でも、逆さに見ると誰だか見分けがつかなかったりする。人間は、知覚情報だけで認知処理をしているわけではない。論理思考とはいえ、極めて経験的だということだ。
カントールの無限は、人間にとって純粋に思考することが、いかに難しいかを問うている。現実に人間社会には、解釈され過ぎた常識ってやつで溢れている。客観性の能力を放棄したかのごとく...
「ここでの教訓は、帰納による論証には、疑いを向けた方がいいということだ。ただ、帰納による論証もそれなりに地位があるのは確かで、本当らしい印象を作ろうとするときには、非常に役に立つ。」
5. 連続体仮説ってどうよ?
無限濃度の記号は、ヘブライ文字の ℵ(アレフ) が用いられる。カントールはカトリック系だったと思うが。
それはさておき、有理数の集合と無理数の集合には、可算という境界概念において区別される。整数や有理数の濃度は、ℵ0 と表し、実数の濃度 c に対して次の関係が成り立つとされる。
ℵ0 < c
これが、「連続体仮説」ってやつだ。日常的な数の感覚では、有理数よりも無理数の方がはるかに多い。まさに見たまんま!可算の条件に照らしても、自然数で表せないものを数えるなんて不可能に思えるし、直観的には連続体仮説は真に映る。
しかし、だ。次の命題が真だとすると、どうだろうか?
「どの二つの有理数の間にも無理数があり、どの二つの無理数の間にも有理数がある。」
これは直感に反する。二つの有理数の間に必ず無理数があるのはいい。二つの有理数の差がとても小さいとすると、その差をπで割り、結果を小さい方に足す。これで、元の二つの間にある無理数が一つ得られる。
問題は、無理数の間に有理数が必ずあるか?だ。二つの無理数を a, b とし、xy座標において原点から傾き a と b の直線α, βを引く。p, q を整数とすると、二つの直線は格子点(p, q)を避けて通るはず。そうでないと、傾きが q/p となって有理数となる。a と b の間には必ず角が生じる。その間の直線を無限に延ばせば、必ず格子点(p, q)のどれかに捕まるという。なんとも信じがたいが、そうなるらしい。
となると、無理数は、二つの有理数の間に存在するという関係から、可算という条件に当てはまるのではないか?二つの有理数の中間値に対して、見事に一対一で対応づけているではないか。ん~... アル中ハイマーには、無限濃度とアルコール濃度の区別が永遠につきそうにない...
「数学は精神で構成するものであり、精神の活動を通す以外には、実存性はもちえない。記号、方程式、定理は、数学の内容を伝えるための手段にすぎない。それらのものは命題をなし、それが集まって物語となる。」
数学の王道は演繹原理にある。それは、ユークリッドが原論で示した証明への道筋だ。純粋な証明ほど説得力のあるものはない。自己主張を論理武装しようとするのは、それが説得の道だからだ。
しかしながら、説得の道にはもう一つある。見たまんま!ってやつだ。実際、原論は五つの公準から成り立っている。公準とは、平たく言えば前提である。つまり、証明の要なし、いや、証明できない自明な命題があることを承知せよ!と要請している。すべての論理証明が前提によって成り立つとすれば、前提の根源を考察せずにはいられない。人間は何事を思考するにも、まず直感や直観の類いを働かせる。インスピレーションとは、ある種の霊感のようなものであろうか。そうした思いつきは極めて経験的であり、演繹に至る前に帰納という思考を試している。純粋な思考だけで定理は導けない。寄り道、回り道、近道といった思考実験を繰り返すうちに、定理らしきものがうっすらと見えてくる。学問に王道なし!とは、この道だ。王道を探るには、覇道や邪道も探ることになる。定理への道は前提から始まる、これを帰納原理とでもしておこうか。とはいえ、邪道ばかり歩いていると疲れる...
前提ほど脆いものはない。まさに非ユークリッド幾何学は、第五公準の崩壊によってもたらされた。第五公準の言い換えはいくつもあるが、ここではルジャンドルの言葉を拝借しよう。
「角の和が180度に等しい三角形が少なくともひとつ存在する。」
だからといって、ユークリッドを蔑む者はいないだろう。ポアンカレはこう言ったという。
「ひとつの幾何学が他の幾何学に比べてより正しいということはありえない。どちらが便利かと言えるだけである。」
人間社会もまた、すべて前提によって成り立っている。社会制度、政治体制、経済システムなどすべてが。民主主義社会では説得の力がモノを言う。説得力とは奇妙なもので、論理だけでは心もとなく、信じこませる何かひと押しがいる。すると、大数の法則は多数決の原理と結びつき、感情の向う確率論に支配されるという寸法よ。これを意志力というかは知らん。物事が客観性から乖離するほど扇動の力が武器となる。アピールやプレゼンテーションなどと呼ばれる技術が、それだ。精神が素粒子で構成されているとすれば、量子力学に従うはず。そこで、宇宙人たちの噂を耳にした。地球という天体には、マクスウェルの悪魔君が大勢いる世界があるとさ...
「天秤は、おもりを載せれば必然的に下がらざるをえない。それと同じく、精神は明白な証明には屈せざるを得ない。精神がからっぽで、釣り合い用のおもりがなければ、最初に言われたことの説得力の重みにすぐに負けてしまう。」
... モンテーニュ「エセー」の中のキケロの引用...
1. 疑い深きトマス君!
著者ジョセフ・メイザーは、マールボロ大学の数学教授。彼は講義中にこんな実験をしたという...
まず前提で、2p - 1 は、p が素数の時、必ず素数になると宣言する。そして、2 から 19 までの数を計算して見せる。わざと p = 11 を飛ばして。さて、受講生の反応はいかに...
1000 の桁に達すると、学生諸君は教授の権威によりかかる。だが、冷静になってくると、ある学生が疑念を抱き始めたという。最前列に陣取る彼の名は、トマス君!イエスの復活を信じなかった、疑い深きトマスにかけているのかは知らん。彼は、実例だけでは証明にならないと食い下がる。確かに、p = 11 や p = 23 では成り立たない。
211 -1 = 2047 = 23 x 89
223 -1 = 8,388,607 = 47 x 178,481
数学は純粋な判断であり、想像力が作る虚構とは次元が違うという評判だが、それは本当だろうか?数学だって、経験を基に憶測で納得しているところがあるのでは...
学校は、証明の手順を真似することを教える。証明を思いつく方法を教えるわけではないし、教えられるものでもない。試験とは、既存の証明をまる写しすれば良い成績が取れる仕組みである。おいらが好青年と呼ばれていた頃、数学は暗記科目ではないと固く信じていた。試験中に公式を導くところから始めていると、とても時間が足りない。決定的だったのは大学に入ってからだ。暗記科目と割り切れないと単位がとれない... どうせ落ちこぼれの愚痴よ!
おっと、話を戻すと...
反証するには一つの反例を示せばいい。だが、証明の方はどうであろう?真理が精神空間に映し出される幻影に過ぎないとすれば、数学もまた芸術の域にある。証明への道が無条件のエクスタシーを与えるならば、数学もなかなかの宗教だ。今でも証明されていない難題が真であることを頑なに信じて、その証明に人生を捧げている研究者たちがいる。その定理は、あてすっぽに真理らしきものを、気まぐれに語っただけかもしれないのに...
ポアンカレ曰く、「すべてを疑うのも、すべてを信じるのも、同じように都合のいい手だ。どちらもよく考えてみなくてすむ。」
2. 推論式(シロジズム)と自己矛盾性
数学の論証は、推論式によって組み立てられる。つまり、「もし~ならば~...」式の束によって。本書は「シロジズム」と呼んでいるが、なかなか微妙な用語である。論理学の根源は、アリストテレスの演繹モデルに従う。「すべての人は死ぬ。ソクラテスは人である。故にソクラテスは死ぬ。」 の類いだ。この手の三段論法を好む社会学者や経済学者は、実に多い。歴史は言うであろう。戦争が起こる時は必ず強大な軍事指導者がいたと。故に、強大な指導者がいる時は必ず戦争が起こると。
一方で、三段論法の危険性を忌み嫌う数学者や科学者は少なくない。ただ、一つの命題が他の命題との依存関係によって成り立っていることは事実だ。キェルケゴール風に言えば... 命題とは一つの関係、その関係はそれ自身に関係する関係の関係の... 狂ったか!
関係が複雑ならば、論理をほぐすために、カルノー図のような見た目で解釈する方法がある。実際、ブール代数を簡略化して真の意味を探ろうとする思考が、コンピュータシステムを支えている。こうした論理性は、境界条件によって支えられている。
ただ、論証できるからといって意味があるとは限らないし、結論が前提から導き出せるとしても前提の正しさとは無関係だ。ここに、根源的な論理の脆弱性が内包されている。ウィトゲンシュタインは、考えを伝える時に混乱を避ける方法は、論理的に正確な言語を作り、それぞれの単語に一つしか意味を持たないようにすることだとしたという。
しかしながら、一つの意味とはどういう意味か?精神の内で勝手にイメージされるものを、どうやって一つに集約できるのか?客観性に満ちているはずの専門用語ですら、微妙にニュアンスの違いを見せ、誰一人として同じ言葉を喋っちゃいない。記号に意味が生じた時、既に感覚と結びついているではないか。
とはいえ、人間社会は、矛盾だらけの言語を用いながら、それなりに通じ合っている。確かに、代数的記号は無味乾燥的なものだ。x = y という式の意味は、それ以上でも、それ以下でもない。だが、人間が解釈した途端に客観性を失う。コンピュータ言語だって人間が意味解釈をすれば、そりゃ暴走もする。純粋客観とは、無認識の領域にしかないのかもしれん。ここに、数学の抱える自己矛盾性があるのではなかろうか...
3. 数を数え続ける動物
プラトンのあまり知られていない短い対話篇「エピノミス」は、こんなことを論じているという。
「動物の魂は、理性的な計算ができなければ、魂の力の長所すべてを得ることはできないだろうし、2 と 3、奇数と偶数を認識できず、数をまったく知らない人は、事物を合理的に説明することはできないだろう。事物について、感覚と記憶しか有しないからだ。それで勇気や沈着などのその他の長所がなくなるわけではないにしても。しかし真に語ることができなければ、人は決して賢くはならず、十全な徳の最も重要な成分である賢さがないことには、その人は完全な善に達することはありえず、したがって幸福にもなれないことになる。」
人間は自然数の概念になんの疑いもなく、数え続けてきた。数の概念がなければ文明すら成り立たない。それはプラトンの言うように、本能的に理性を求めている証であろうか?
ところで、ユプノ族というニューギニアの奥地に暮らす原住民には、手の込んだ計算法があるそうな。まず指から始まり、いろいろな体の部分を指定の順に右から左へ移りながら、33 まで数えるという。
ちなみに、フランス式指電卓というものがあると聞く。
「計算機がなくても、掛け算が出来る便利な方法があるのをご存じですか。俗にいうフランス式指電卓です。
7 x 8 = 56 の場合、左は、7 を表します。御一緒に... いち、にぃ、さん、しぃ、ごぉ、ろく、しち。右は、8 を表します。御一緒に... いち、にぃ、さん、しぃ、ごぉ、ろく、しち、はち。次は答えです。十の位は立ってる指を足します。2 + 3 で 5 ですね。一の位は折れてる指を掛けます。3 x 2 で 6。ということで、7 x 8 = 56。九九を忘れた方はぜひやってみてください。
では次に、8 x 9 = 72 にチャレンジ。いち、にぃ... これ大変時間がかかります。お好きな方は自分でやってみてください。」
... 「警部補・古畑任三郎スペシャル 笑うカンガルー」より...
4. 有限と無限の境界
エレアのゼノンは、亀にハンデをやれば、いくら足の速いアキレスでも勝てないことを論じた。アキレスが亀のスタート時点に着いた時には亀はさらに先に進んでおり、次の亀のスタート時点に着いた時には亀はさらに進んでいる。これを繰り返せば、永遠に追いつけないと。この謎掛けには、摩訶不思議な世界がある。亀もアキレスも、有限の時間で、有限の距離を進んでいる。なのに、追いつく距離は無限に縮まり、迫りくる無限小の時間の中でもがき続ける。それでも、境界条件をちょいと加えると論理は崩れるかもしれん。
「靴下さえ履いていたら、アキレスもちゃんと勝ったはずだ!」
さて、有理数と無理数の違いにも摩訶不思議な境界がある。有理数とは、分母と分子を自然数で表せる数。自然数は無限にあり、分母も分子も無限に配置できる。どんな有理数と有理数の間にも必ず有理数を配置できるわけで、無限小の隙間を埋め尽くせそうな気がする。にもかかわらず、有理数では表せない無理数ってやつが存在しやがる。そりゃ、ピュタゴラス教団も慌てるわね。無理数とは、無限の自然数で配置される有理数よりも、高貴な無限なのか?無限にも濃度があるというカントールの主張は、出任せではなさそうである。
それにしても、初めてカントールの無限に触れた時には、たまげた!デカルト座標上のすべての点は、数直線上の点と一対一で対応できるというのだから。集合論は詐欺か?論理とは、屁理屈と紙一重の世界にある... とでもしておこうか。
これと似た感覚がトポロジーの世界にもあって、ドーナツもコーヒーカップも同じ形とされる。形の属性において「位相」にだけ着目すれば、確かにそうなる。もはや常識ってやつは、まるで役に立たない。着眼条件をちょいと変えるだけで、客観性の視点も変わるということだ。
無限濃度の境界条件には「可算」という概念がある。平たく言えば、数えることが可能かどうかによって濃度が区別されるということ。無限と無限を比較する時、一対一の対応というと少々抵抗があるので、対応するものが必ず一つだけあるとしたらどうだろう。言い方をちょいと変えただけよ。直観的に大小関係を感じても、互いに無限個あれば、対応がつかないなんてことはありえない。同じ原理を用いれば、整数も、偶数も、奇数も、はたまた有理数もすべて同じ無限個数ということになる。
「有限の世界が無限の世界と出会うところには、ヘリも境界も端も限界もない。有限の図が無限の図になる特定の瞬間もない。」
ここで、人間の直観には、見たまんま!という思考原理が働くことに注意しよう。知覚の危険性が潜んでいることを。例えば、生まれつきの盲人が40歳で視力回復手術を受けた時の体験談を読むと、階段が目の前にあるのに、足下に危険があることすら認識できないと語っていた。形の属性は確実に認識できても、それが自分の身にどんな作用が生じるかまでは分からないらしい。そして、映像情報が大量に脳に入り込み、処理能力が追いつけず、却って精神病を患うことになる。あるいは、よく見慣れた人の顔でも、逆さに見ると誰だか見分けがつかなかったりする。人間は、知覚情報だけで認知処理をしているわけではない。論理思考とはいえ、極めて経験的だということだ。
カントールの無限は、人間にとって純粋に思考することが、いかに難しいかを問うている。現実に人間社会には、解釈され過ぎた常識ってやつで溢れている。客観性の能力を放棄したかのごとく...
「ここでの教訓は、帰納による論証には、疑いを向けた方がいいということだ。ただ、帰納による論証もそれなりに地位があるのは確かで、本当らしい印象を作ろうとするときには、非常に役に立つ。」
5. 連続体仮説ってどうよ?
無限濃度の記号は、ヘブライ文字の ℵ(アレフ) が用いられる。カントールはカトリック系だったと思うが。
それはさておき、有理数の集合と無理数の集合には、可算という境界概念において区別される。整数や有理数の濃度は、ℵ0 と表し、実数の濃度 c に対して次の関係が成り立つとされる。
ℵ0 < c
これが、「連続体仮説」ってやつだ。日常的な数の感覚では、有理数よりも無理数の方がはるかに多い。まさに見たまんま!可算の条件に照らしても、自然数で表せないものを数えるなんて不可能に思えるし、直観的には連続体仮説は真に映る。
しかし、だ。次の命題が真だとすると、どうだろうか?
「どの二つの有理数の間にも無理数があり、どの二つの無理数の間にも有理数がある。」
これは直感に反する。二つの有理数の間に必ず無理数があるのはいい。二つの有理数の差がとても小さいとすると、その差をπで割り、結果を小さい方に足す。これで、元の二つの間にある無理数が一つ得られる。
問題は、無理数の間に有理数が必ずあるか?だ。二つの無理数を a, b とし、xy座標において原点から傾き a と b の直線α, βを引く。p, q を整数とすると、二つの直線は格子点(p, q)を避けて通るはず。そうでないと、傾きが q/p となって有理数となる。a と b の間には必ず角が生じる。その間の直線を無限に延ばせば、必ず格子点(p, q)のどれかに捕まるという。なんとも信じがたいが、そうなるらしい。
となると、無理数は、二つの有理数の間に存在するという関係から、可算という条件に当てはまるのではないか?二つの有理数の中間値に対して、見事に一対一で対応づけているではないか。ん~... アル中ハイマーには、無限濃度とアルコール濃度の区別が永遠につきそうにない...
2014-08-03
"連分数のふしぎ" 木村俊一 著
ピタゴラス教団は、整数では表せない数を忌み嫌い、隠蔽工作に走った。「万物は数である」を崇拝する者たちにとって、無理数は宇宙の理性に反する存在だったのである。自然数を分母と分子に配置する表記法に限界を感じるのは、現代人とて大して変わるまい。実際、あらゆるデジタルシステムは実数演算を近似値で誤魔化している。浮動小数点演算で答えが合わないと騒ぐ新人君を見かければ、IEEE754の意義を匂わせてやればいい。
ところが、だ!
ここに分数の底力を魅せつける一冊がある。連分数とやらを用いれば、無理数とて正体が暴けるというのだ。黄金比だろうが、超越数だろうが... はたまた、閏年も、12音階も、松ぼっくりも...
自然数、恐るべし!
連分数とは、分母の中に分数が含まれ、その分数の分母にさらに分数が含まれ... というように分数が階段状に連なったもの。こいつが本格的に活躍を始めたのは17世紀頃だが、古代ギリシア人はこれに近い思考法を知っていた。ユークリッドの互除法が、それだ。二つの数における最大公約数を求めるとは、約分しながら既約分数に迫ることであり、まさに連分数の発想である。もっともユークリッド原論では除算ではなく減算で示されるので、より厳密に言えば、互減法とするべきだという意見も耳にする。共通した線分の長さを除いていくという意味では、互除法でそれほど違和感はないけど。
それはさておき、問題は単純な操作の繰り返し回数にある。連分数における有理数と無理数の境界は、連なり方が有限か無限かだ。とはいえ、古代ギリシア人だって無限の連なり方を想像できなかったわけがなかろう。自然数が無限に連なることを数直線上で表せば、循環小数や循環連分数といったものも想像できそうなもの。幾何学表記の無限は神に崇められても、整数論表記の無限は悪魔とでもいうのか?神も、悪魔も、人間がこしらえた概念であることに違いはない。数が宗教の域に達すると、もう手に負えん...
ところで、平方根を語呂合わせで覚えたりする。一夜一夜に人見頃... 人並みにおごれや... 富士山麓オウム鳴く... 円周率は、30桁もあれば事足りる。産医師異国に向かう、産後厄なく産児、みやしろに虫さんさん闇に鳴く...
そういえば、この手の覚え歌で英語版をあまり聞かない。単語の文字数を割り当てる技は見かけるが、ゼロはどうするんだろう?なぁーに、心配はいらん。ゼロが登場するのは30桁より後ろだ。遥か果てにファインマン・ポイントという理性の配列があることを知らなくても、男性諸君のπ(オッパイ)好きは変わらんよ!
1. 初期値と周期性の原理
小数点以下を10進数で1から順に並べた数を、「チャンパーノウン数」と呼ぶそうな。
0.1234567891011121314...
こうした規則性は連分数との相性の良さを予感させる。小数の循環パターンが見抜ければ、数値解析も容易となろう。問題となるのは、循環しないか、循環してもパターンが長すぎる場合だ。本書は、数の並びのパターンが見抜けなくても、連分数を用いれば数の正体が見抜ける可能性を匂わせてくれる。
数列の生成パターンで有名なものにフィボナッチ数列がある。最初の数を{1, 1}とし、{0, 1}でもええが、後は2つの数を足して次の数を作るということを繰り返す。
{1, 1, 2, 3, 5, 8, 13, ...}
これに似たもので、「リュカ数列」というものがあるそうな。最初の数を{2, 1}とし、後の操作は同じ。
{2, 1 ,3, 4 ,7, 11, 18, 29, ...}
このような数列の重要性は、初期値と繰り返される操作という二つで構成されるアルゴリズムの単純さにある。この事例では足し算されるが、引き算でも、剰余算でも、それこそどんな関数でもOK!思考原理は、等比数列や等差数列、はたまたユークリッドの互除法やニュートン法も同じだ。このような数列アルゴリズムは、デジタルシステムを設計する際の検証法において、システムの苦手とするパターン生成、ノイズ発生器、乱数生成などで重宝できる。分数は割り算であるが、具体的な処理では多項式に排他論理を組み合わせることで等価性が得られたりする。連分数は、ある種の循環アルゴリズムという見方はできそうである。
もしかしたら、あらゆる数は何らかの循環性に支配されているのかもしれない。フーリエ解析では、三角関数の直交性を利用して成分分解すれば、どんな数でも近似値を、それなりに得ることができる。フラクタル解析では、縮小拡大、回転、反転といった単純な幾何学操作によって、どんな図形にも相似パターンを、それなりに当てはめることができる。あらゆる物理現象は、初期値、境界条件と言ってもいいが、これと周期性で決定できそうな気がする。もしかしたら、素数の出現パターンにも周期性があるのかもしれん。しかも、初期値が変わるだけで、まったく様変わりするような... 実は、多様性の正体とは、初期値の違いだけなのかもしれん。これを社会では環境と呼んでいる...
2. 黄金比と松ぼっくり
縦横比が黄金比となる長方形が最も美しい図形という説があるが、それは本当だろうか?美とは、周辺との調和によって生じる概念であり、絶対的な概念ではあるまい。少なくとも、人間の感覚に絶対というものはない。正五角形が崇められるのは、辺と対角線の長さの関係が黄金比になるからであろうか。古来、五芒星に宗教的な意味が与えられてきた。真ん中に現れる正五角形に対角線を引けば、正五角形の無限地獄へ誘なう... という魂胆かはしらん。
さて、黄金比は、x2 - x - 1 = 0 の解である。x2 = x + 1 ... つまり、2乗すると1増えるような数。もちろん、黄金比を2乗しても同じ結果が得られる。
( (1 + √5)/2 )2 = (1 + 2√5 + 5)/4 = 1 + (1 + √5)/2
フィボナッチ数が一際輝いているのは、隣り合う2項の比が黄金比に近づくことにある。松ぼっくりが、宇宙においてどんな役割を果たしているのかは知らん。ただ、松ぼっくりの鱗片にフィボナッチ数が現れれば、ここに宇宙法則を感じずにはいられない。葉っぱたちが複雑に混在すれば、平等に太陽の光を欲する。互いに重ならないように満遍なく太陽の光を浴びることができれば、究極の民主主義像が描ける。その答えが、フィボナッチ数なのか?
本書は、次のような配列シミュレーションををやってみせる。
まず、葉っぱの付け方は...
最初に、1本目の枝を右方向に出し、丸い葉を1枚つける。
次に、一定の角度θだけ回転した方向に枝を出し、2枚目の葉をつける。枝は1枚目より少し長めにする。
さらに、同じ角度θだけ回転した方向に枝を出し、3枚目の葉をつける。枝は2枚目よりさらに長めにする。
以下、繰り返し...
次に、長さのルールは...
円形の葉の半径を1とし、1枚目の葉の長さは1、2枚目の枝の長さは√2、3枚目は√3、4枚目は√4(= 2)...
回転角θは90度とし、螺旋を描く。
これを有理数回転で配置すると徐々に隙間ができていき、無理数回転で配置するとうまいこと隙間を埋めることができる。自然界は、無理数回転を要請しているのか?
「有理数による近似がもっとも悪い無理数は、黄金比である。もしかしたら植物はそのことを知っていて、黄金比回転で葉っぱや松ぼっくりの鱗片を配置しているので、植物の渦巻きの腕の本数にフィボナッチ数が出てくるのかもしれない。」
3. 12音階と53音階
1オクターブを12の半音に分けた音階理論は、ピタゴラスが構築したとされる。その正体を、本書は16世紀に考案された対数と連分数を組み合わせて解き明かそうとする。対数は、実に奇妙ながら便利な道具だ。なにしろ、掛け算の世界を足し算の世界に変えてくれるのだから。おかげで、指数関数的に増加する物理現象を比例関係で考察することができ、電気回路では利得の概念が単純化できる。
さて、人間の耳は対数耳になっているという。確かに、耳の周波数特性は、計算尺のように数字が大きいところで目盛の幅が詰まっている。人間が音程の違いを聞き取るのは、周波数の差ではなく周波数の比である。ピタゴラスはそのことに気づいていたことになる。そして、一弦琴で弦の長さと周波数の関係を示した。
「ピタゴラスが "簡単な整数比であらわされる2音がよく協和する" という原理から、ド : ソ = 2 : 3 という周波数比を繰り返し適用することでピタゴラス音律を作った。その後、より簡単な整数比を実現するように改良された純正律があらわれ、さらに転調しやすく改良された平均律があらわれた。」
12音階平均律とは、対数の世界で12等分するということ、すなわち、2の12乗根をとることである。
本書は、12音階平均律よりもっと美しくなりそうな53音階平均律を提示している。しかも、モーツァルトの父レオポルトが書いたバイオリンの教則本にも、これにピッタリ合う記述があるそうな!
4. 近似と精度
無理数を連分数で近似する場合、精度の見極めでは、程よい次数で連分数を打ち切ることになる。その次数は、偶数次において小さめの近似、奇数次において大きめの近似、この間を振動している。
「αの連分数近似として p/q という分数が出てきたら、その誤差、つまり |α - p/q| は、1/q2 以下である。... αが無理数であれば、|α - p/q| < 1/q2 を満たすような整数のペア {p, q} が無限組存在する。」
ただし、これは2次の場合。n次の有理数の場合では「リウビィユの定理」というものがあるという。
「実数αはn次の代数的、つまり有理数係数のn次方程式の解としてあらわされる数であるとする。このとき、αの近似分数 p/q で、誤差が 1/q(n + 1) 以下のものは有限個しかない。」
さて注目したいのは、幾何学的なアルゴリズムで「中間近似分数」というものを紹介してくれる。X-Y 平面上において、整数座標の格子状に釘を打ち付けた様子を考える。そして、原点と目的の点との間を糸で張り、原点側で最初にひっかかる釘(0, 1)と(1, 0)の間で糸を上下させる。糸がどの釘で折れ曲がるかの中間点を拾っていき、その中間点を連分数の要素とすれば、近似分数が得られるという発想だ。
例えば、5/7 の近似分数を求める場合、原点(0, 0)と座標(5,7)の間を糸で結ぶと、折れ曲がる釘が(0, 1), (1, 0), (1, 1), (3, 2)、通過する釘が(2, 1), (4, 3)となる様子が示される。これらの座標が、連分数の中間近似分数に対応する。しかも、糸が上下する様子がそのまま誤差として見える。誤差関数もまた連分数で記述できるというわけだ。
5. マハーラノービスの問題
ラマヌジャンがケンブリッジにいた頃、友人のインド人数学者マハーラノービスが雑誌の難問コーナーから、こんな問題を見つけてきたという。
「通りの家がずらっと並んでいて、端から順番に1番、2番、... と番地番号がつけられている。さて、ある家の左側に並んでいる番地番号を全て足した数と右側に並んでいる番地番号を全て足した数がちょうど同じになるという。この家の番地番号は何番で、通りには家が何軒あるか?ただし、通りの家の数は50軒以上、1500軒以下とする。」
ラマヌジャンは、即座に50軒未満の場合で、通りの数が8軒、家の番地番号は6番と答えたそうな。
1 + 2 + 3 + 4 + 5 = 15 = 7 + 8
他の解は、通りの数が49軒、番地番号が35番の場合。
1 + 2 + ... + 34 = 34 x 35 / 2 = 595
= (36 + 49) x (49 - 35) / 2 = 36 + 37 + ... + 49
これを幾何学的に表すと、底辺が軒数の49、高さが存在する番地番号の49、の直角二等辺三角形の面積で表すことができる。番地番号35は、その斜辺の過程のどこかにあるはず。すると、底辺と高さの比は √2 であり、その思考法では、連分数による √2 の近似法に置き換えられる。代数的には、通りの軒数をn、番地番号をm とすると、次の方程式を満たすような自然数の組(n, m)を求める問題となる。
1 + 2 + ... + (m - 1) = (m + 1) + (m + 2) + ... + n
1 + 2 + ... + n = (1 + 2 + ... + (m - 1)) + m + ((m + 1) + (m + 2) + ... + n)
この二つの方程式から
n(n + 1)/2 = m + 2m(m - 1)/2 = m + (m2 - m) = m2
そして、n(n + 1)/2 が平方数になるような n を求める問題に変えている。答えは、(n, m) = (288, 204)。
1 + 2 + ... + 203 = 203 x 204 / 2 = 20706
= (205 + 288) x (288 - 204) / 2 = 205 + 206 + ... + 288
尚、本書には具体的な解法が紹介される。ちと複雑だが、なかなか興味深い!
ところが、だ!
ここに分数の底力を魅せつける一冊がある。連分数とやらを用いれば、無理数とて正体が暴けるというのだ。黄金比だろうが、超越数だろうが... はたまた、閏年も、12音階も、松ぼっくりも...
自然数、恐るべし!
連分数とは、分母の中に分数が含まれ、その分数の分母にさらに分数が含まれ... というように分数が階段状に連なったもの。こいつが本格的に活躍を始めたのは17世紀頃だが、古代ギリシア人はこれに近い思考法を知っていた。ユークリッドの互除法が、それだ。二つの数における最大公約数を求めるとは、約分しながら既約分数に迫ることであり、まさに連分数の発想である。もっともユークリッド原論では除算ではなく減算で示されるので、より厳密に言えば、互減法とするべきだという意見も耳にする。共通した線分の長さを除いていくという意味では、互除法でそれほど違和感はないけど。
それはさておき、問題は単純な操作の繰り返し回数にある。連分数における有理数と無理数の境界は、連なり方が有限か無限かだ。とはいえ、古代ギリシア人だって無限の連なり方を想像できなかったわけがなかろう。自然数が無限に連なることを数直線上で表せば、循環小数や循環連分数といったものも想像できそうなもの。幾何学表記の無限は神に崇められても、整数論表記の無限は悪魔とでもいうのか?神も、悪魔も、人間がこしらえた概念であることに違いはない。数が宗教の域に達すると、もう手に負えん...
ところで、平方根を語呂合わせで覚えたりする。一夜一夜に人見頃... 人並みにおごれや... 富士山麓オウム鳴く... 円周率は、30桁もあれば事足りる。産医師異国に向かう、産後厄なく産児、みやしろに虫さんさん闇に鳴く...
そういえば、この手の覚え歌で英語版をあまり聞かない。単語の文字数を割り当てる技は見かけるが、ゼロはどうするんだろう?なぁーに、心配はいらん。ゼロが登場するのは30桁より後ろだ。遥か果てにファインマン・ポイントという理性の配列があることを知らなくても、男性諸君のπ(オッパイ)好きは変わらんよ!
1. 初期値と周期性の原理
小数点以下を10進数で1から順に並べた数を、「チャンパーノウン数」と呼ぶそうな。
0.1234567891011121314...
こうした規則性は連分数との相性の良さを予感させる。小数の循環パターンが見抜ければ、数値解析も容易となろう。問題となるのは、循環しないか、循環してもパターンが長すぎる場合だ。本書は、数の並びのパターンが見抜けなくても、連分数を用いれば数の正体が見抜ける可能性を匂わせてくれる。
数列の生成パターンで有名なものにフィボナッチ数列がある。最初の数を{1, 1}とし、{0, 1}でもええが、後は2つの数を足して次の数を作るということを繰り返す。
{1, 1, 2, 3, 5, 8, 13, ...}
これに似たもので、「リュカ数列」というものがあるそうな。最初の数を{2, 1}とし、後の操作は同じ。
{2, 1 ,3, 4 ,7, 11, 18, 29, ...}
このような数列の重要性は、初期値と繰り返される操作という二つで構成されるアルゴリズムの単純さにある。この事例では足し算されるが、引き算でも、剰余算でも、それこそどんな関数でもOK!思考原理は、等比数列や等差数列、はたまたユークリッドの互除法やニュートン法も同じだ。このような数列アルゴリズムは、デジタルシステムを設計する際の検証法において、システムの苦手とするパターン生成、ノイズ発生器、乱数生成などで重宝できる。分数は割り算であるが、具体的な処理では多項式に排他論理を組み合わせることで等価性が得られたりする。連分数は、ある種の循環アルゴリズムという見方はできそうである。
もしかしたら、あらゆる数は何らかの循環性に支配されているのかもしれない。フーリエ解析では、三角関数の直交性を利用して成分分解すれば、どんな数でも近似値を、それなりに得ることができる。フラクタル解析では、縮小拡大、回転、反転といった単純な幾何学操作によって、どんな図形にも相似パターンを、それなりに当てはめることができる。あらゆる物理現象は、初期値、境界条件と言ってもいいが、これと周期性で決定できそうな気がする。もしかしたら、素数の出現パターンにも周期性があるのかもしれん。しかも、初期値が変わるだけで、まったく様変わりするような... 実は、多様性の正体とは、初期値の違いだけなのかもしれん。これを社会では環境と呼んでいる...
2. 黄金比と松ぼっくり
縦横比が黄金比となる長方形が最も美しい図形という説があるが、それは本当だろうか?美とは、周辺との調和によって生じる概念であり、絶対的な概念ではあるまい。少なくとも、人間の感覚に絶対というものはない。正五角形が崇められるのは、辺と対角線の長さの関係が黄金比になるからであろうか。古来、五芒星に宗教的な意味が与えられてきた。真ん中に現れる正五角形に対角線を引けば、正五角形の無限地獄へ誘なう... という魂胆かはしらん。
さて、黄金比は、x2 - x - 1 = 0 の解である。x2 = x + 1 ... つまり、2乗すると1増えるような数。もちろん、黄金比を2乗しても同じ結果が得られる。
( (1 + √5)/2 )2 = (1 + 2√5 + 5)/4 = 1 + (1 + √5)/2
フィボナッチ数が一際輝いているのは、隣り合う2項の比が黄金比に近づくことにある。松ぼっくりが、宇宙においてどんな役割を果たしているのかは知らん。ただ、松ぼっくりの鱗片にフィボナッチ数が現れれば、ここに宇宙法則を感じずにはいられない。葉っぱたちが複雑に混在すれば、平等に太陽の光を欲する。互いに重ならないように満遍なく太陽の光を浴びることができれば、究極の民主主義像が描ける。その答えが、フィボナッチ数なのか?
本書は、次のような配列シミュレーションををやってみせる。
まず、葉っぱの付け方は...
最初に、1本目の枝を右方向に出し、丸い葉を1枚つける。
次に、一定の角度θだけ回転した方向に枝を出し、2枚目の葉をつける。枝は1枚目より少し長めにする。
さらに、同じ角度θだけ回転した方向に枝を出し、3枚目の葉をつける。枝は2枚目よりさらに長めにする。
以下、繰り返し...
次に、長さのルールは...
円形の葉の半径を1とし、1枚目の葉の長さは1、2枚目の枝の長さは√2、3枚目は√3、4枚目は√4(= 2)...
回転角θは90度とし、螺旋を描く。
これを有理数回転で配置すると徐々に隙間ができていき、無理数回転で配置するとうまいこと隙間を埋めることができる。自然界は、無理数回転を要請しているのか?
「有理数による近似がもっとも悪い無理数は、黄金比である。もしかしたら植物はそのことを知っていて、黄金比回転で葉っぱや松ぼっくりの鱗片を配置しているので、植物の渦巻きの腕の本数にフィボナッチ数が出てくるのかもしれない。」
3. 12音階と53音階
1オクターブを12の半音に分けた音階理論は、ピタゴラスが構築したとされる。その正体を、本書は16世紀に考案された対数と連分数を組み合わせて解き明かそうとする。対数は、実に奇妙ながら便利な道具だ。なにしろ、掛け算の世界を足し算の世界に変えてくれるのだから。おかげで、指数関数的に増加する物理現象を比例関係で考察することができ、電気回路では利得の概念が単純化できる。
さて、人間の耳は対数耳になっているという。確かに、耳の周波数特性は、計算尺のように数字が大きいところで目盛の幅が詰まっている。人間が音程の違いを聞き取るのは、周波数の差ではなく周波数の比である。ピタゴラスはそのことに気づいていたことになる。そして、一弦琴で弦の長さと周波数の関係を示した。
「ピタゴラスが "簡単な整数比であらわされる2音がよく協和する" という原理から、ド : ソ = 2 : 3 という周波数比を繰り返し適用することでピタゴラス音律を作った。その後、より簡単な整数比を実現するように改良された純正律があらわれ、さらに転調しやすく改良された平均律があらわれた。」
12音階平均律とは、対数の世界で12等分するということ、すなわち、2の12乗根をとることである。
本書は、12音階平均律よりもっと美しくなりそうな53音階平均律を提示している。しかも、モーツァルトの父レオポルトが書いたバイオリンの教則本にも、これにピッタリ合う記述があるそうな!
4. 近似と精度
無理数を連分数で近似する場合、精度の見極めでは、程よい次数で連分数を打ち切ることになる。その次数は、偶数次において小さめの近似、奇数次において大きめの近似、この間を振動している。
「αの連分数近似として p/q という分数が出てきたら、その誤差、つまり |α - p/q| は、1/q2 以下である。... αが無理数であれば、|α - p/q| < 1/q2 を満たすような整数のペア {p, q} が無限組存在する。」
ただし、これは2次の場合。n次の有理数の場合では「リウビィユの定理」というものがあるという。
「実数αはn次の代数的、つまり有理数係数のn次方程式の解としてあらわされる数であるとする。このとき、αの近似分数 p/q で、誤差が 1/q(n + 1) 以下のものは有限個しかない。」
さて注目したいのは、幾何学的なアルゴリズムで「中間近似分数」というものを紹介してくれる。X-Y 平面上において、整数座標の格子状に釘を打ち付けた様子を考える。そして、原点と目的の点との間を糸で張り、原点側で最初にひっかかる釘(0, 1)と(1, 0)の間で糸を上下させる。糸がどの釘で折れ曲がるかの中間点を拾っていき、その中間点を連分数の要素とすれば、近似分数が得られるという発想だ。
例えば、5/7 の近似分数を求める場合、原点(0, 0)と座標(5,7)の間を糸で結ぶと、折れ曲がる釘が(0, 1), (1, 0), (1, 1), (3, 2)、通過する釘が(2, 1), (4, 3)となる様子が示される。これらの座標が、連分数の中間近似分数に対応する。しかも、糸が上下する様子がそのまま誤差として見える。誤差関数もまた連分数で記述できるというわけだ。
5. マハーラノービスの問題
ラマヌジャンがケンブリッジにいた頃、友人のインド人数学者マハーラノービスが雑誌の難問コーナーから、こんな問題を見つけてきたという。
「通りの家がずらっと並んでいて、端から順番に1番、2番、... と番地番号がつけられている。さて、ある家の左側に並んでいる番地番号を全て足した数と右側に並んでいる番地番号を全て足した数がちょうど同じになるという。この家の番地番号は何番で、通りには家が何軒あるか?ただし、通りの家の数は50軒以上、1500軒以下とする。」
ラマヌジャンは、即座に50軒未満の場合で、通りの数が8軒、家の番地番号は6番と答えたそうな。
1 + 2 + 3 + 4 + 5 = 15 = 7 + 8
他の解は、通りの数が49軒、番地番号が35番の場合。
1 + 2 + ... + 34 = 34 x 35 / 2 = 595
= (36 + 49) x (49 - 35) / 2 = 36 + 37 + ... + 49
これを幾何学的に表すと、底辺が軒数の49、高さが存在する番地番号の49、の直角二等辺三角形の面積で表すことができる。番地番号35は、その斜辺の過程のどこかにあるはず。すると、底辺と高さの比は √2 であり、その思考法では、連分数による √2 の近似法に置き換えられる。代数的には、通りの軒数をn、番地番号をm とすると、次の方程式を満たすような自然数の組(n, m)を求める問題となる。
1 + 2 + ... + (m - 1) = (m + 1) + (m + 2) + ... + n
1 + 2 + ... + n = (1 + 2 + ... + (m - 1)) + m + ((m + 1) + (m + 2) + ... + n)
この二つの方程式から
n(n + 1)/2 = m + 2m(m - 1)/2 = m + (m2 - m) = m2
そして、n(n + 1)/2 が平方数になるような n を求める問題に変えている。答えは、(n, m) = (288, 204)。
1 + 2 + ... + 203 = 203 x 204 / 2 = 20706
= (205 + 288) x (288 - 204) / 2 = 205 + 206 + ... + 288
尚、本書には具体的な解法が紹介される。ちと複雑だが、なかなか興味深い!
2014-07-27
"ガベージコレクションのアルゴリズムと実装" 中村成洋/相川光 著 竹内郁雄 監修
プログラムが深刻な問題を抱える時、動的メモリの管理に関するものが多い。メモリ系のバグが厄介なのは、バグが埋め込まれる箇所と、それが顕在化するタイミングが大きくズレていることにある。かつて、必要なデータ領域の確保と解放の問題は、プログラマの責任とされた。今でも、そうなんだろうけど...
整数型や文字型などプリミティブなデータ型を扱う分には、それほど目くじらを立てることもあるまい。だが、大量のデータ領域、あるいは、クラス型や構造体といった抽象化データを扱う場合には注意がいる。メモリ空間を相対アドレスで管理すれば、複雑なデータ構造にもアクセスしやすい。物理的には、参照という形で間接アドレッシングの構造を持つことになる。あの忌み嫌われるポインタってやつだ。こいつの危険性は、参照値をちょいと間違えたり改竄するだけで不正領域を指すことができることで、セキュリティ上の問題となる。あるいは、malloc/free, new/delete といった御呪いを疎かにするだけで、ヒープ領域には文字通りゴミが山積みされる。メモリ資源が豊富になればなるほどコードは複雑化し、バグの頻度が高まるは必定。不要になったゴミは長い間メモリ空間に居座り、メモリリークやらで他のプログラムと衝突したり、コールスタックに矛盾が紛れ込んでシステムを不安定にさせたり、最悪の場合メモリを喰い潰してシステムをダウンさせる。
そこで登場するのがゴミ収集係、そう、ガベージコレクションだ。人間社会においても、ゴミ清掃システムが破綻すると都市は崩壊する。地味な存在こそが、真の意味でシステムを支えている。本来、論理性だけに傾注したいプログラマとって、低水準な構造を意識させられることは思考の足かせとなる。動的空間を意識せずに済むというだけで、情報のゴミに翻弄される酔っ払いは幸せよ...
しかしながら、自動化という言葉は、心地よい響きがするだけに迷信となりやすい。厄介な機能を隠してくれるということは、その危険性までも隠蔽することになる。
近年、ポインタの概念を排除した多くの高水準言語を見かける。だが、むろんポインタがなくなったわけではなく、隠しているに過ぎない。トリッキーなキャストを要求するようなデータ定義が危険なことに変わりはない。ゴミ収集の仕掛けや癖を知っておくだけでも、危険なデータ構造を定義するリスクを避けることができよう。
ちなみに、おいらはプログラマではないが、メモリ管理やデータ構造の考え方はハードウェア設計でも参考になる。FIFO構造やスタック構造など物理構造の制限に因われなければ、思考も広がるだろう。おまけに、アルゴリズムを読むのが好きときた。コンパクトでエレガントに書かれる分野だけに、数学的で無味乾燥的なものと思われがちだが、そこには作者の思考物語が埋め込まれている。それが読み取れた時、感動を禁じ得ない...
本書に共感を覚えるのは、実装の解説をデータ型から始めてくれることである。おいらは、データ型やクラス型や構造体などの定義が、コンパクトな仕様書のようなものだと考えている。静的なデータ型を一通り定義するだけで、大方のプログラムイメージが出来上がっている。型の適切な定義は、そのプログラムが何をするものかについて、かなりの事を物語ってくれるはずだ。
実装編では、Python, DalvikVM(Android), Rubinius(Ruby), V8(JavaScript)におけるものが紹介され、言語システムを違った視点から眺められるのも興味深い。ただ、アルゴリズムではやや意外な印象を与える。それは、この技術分野が思ったより推論的で、確率論的であること。人間社会的とも言えようか。自分で明示的にやった方がマシかもしれない、と思わせるところもある。もう少しきちんと管理してくれると思ったのだが、保険の機能ぐらいに思った方がよさそうである。
ガベージコレクションは、大まかに「保守的GC」と「正確なGC」の二つに分類される。保守的GCとは、「ポインタと非ポインタとを識別できないGC」のことだという。正確なGCとは、言うまでもなく確実にポインタを識別すること。それがポインタなのかも正確に判断できないとなれば、データ領域を勝手に移動すると本来の参照関係が崩れることになる。よって、フラグメーテーションの問題がつきまとう。
しかしながら、ポインタの識別は構文解析と関わり、言語処理系の支援なしで完璧な判別は困難となる。処理も重そうだし、本筋のプログラムが遅くなったり停止するのでは本末転倒。保守的GCを選択する方が、実用的なようである。
さらに、アルゴリズムが言語処理系に対して独立して設計できるかどうかも、実用性の指標となろう。結局、現実味のある実装は、互いのアルゴリズムの欠点を補い合うような複合的な用い方になる。いまや実用的の代名詞となった、妥協、適当、微妙... ってのが、この世にマッチしているのかもしれん。どうせ世界は不完全だし。現代社会は、何事も面倒なことを覆い隠し、利便性や自動化に邁進していくが、自動化に頼り過ぎる感は否めない。本書は、これを問うているようにも映る。プログラミングが庶民化すると、低品質のソフトウェアが大量に出回る。少なくとも、システムプログラムとアプリケーションプログラムでは、プログラマの意識にも雲泥の差が生じるだろう。高水準という基準も曖昧になっていく。かつて、C言語も高水準言語と呼ばれた。そりゃ、アセンブラ言語に比べれば、見た目からして高級だ。アセンブラ言語だって機械語に比べれば、はるかに抽象度が高い。所詮、相対的な価値観の問題か。今日、高水準と呼ばれるプログラミング言語の一つの指標として、言語システムが動的メモリを自動で管理してくれるかどうか、という見方はできそうである...
1. ガベージコレクションの世界と三つの基本アルゴリズム
1995年、Javaの発表以来、ガベージコレクション技術の有り難さが広く認知されるようになった。しかし、その歴史は古く、1959年、Lispの設計で、D.Edwards が実装したという。
本書は、基本的なアルゴリズムに、「マークスイープGC」、「参照カウント」、「コピーGC」の三つを挙げ、他は派生型や組合せとしている。マークスイープGCは1960年、John McCarthy が発表... 参照カウントは1960年、George E. Collins が発表... コピーGCは1963年、Marvin L. Minsky が発表... と、この分野の基礎技術は半世紀前にほぼ確立しているようである。いずれにせよ、完璧なガベージコレクションの方法はない。マシン、言語、アプリケーションなどの設計思想に応じて、アルゴリズムの組合せや用い方も変わる。
全般的な印象として気になるのが、GCの起動タイミングが先送りなところである。具体的には、メモリアロケーションに失敗した時。おいらは、ゴミが発生したら即掃除しないと気が済まないタチだ。もちろん、先駆けてメモリ状態を健全に保とうとするアルゴリズムもあるが...
また、同じソフトウェア業界でありながら、用語のニュアンスもだいぶ違うようである。
例えば...
「オブジェクト」とは、オブジェクト指向で言うところの属性や振る舞いを持ったサービス群という意味合いでなく、データの塊を意味するという。ガベージコレクションは、この塊を基本単位とし、メモリ上での移動や破棄といった操作を行う。
「ミューテータ(mutator)」という用語も紹介してくれる。Dijkstra によって考案された用語だそうで、「変化させるもの」という意味。オブジェクト指向的なオブジェクトへのアクセスメソッドは、基本的に set/get 系で済むと思っているが、ガベージコレクションでは参照関係を重視するため、ゴミ収集ではミューテータのタイミングが鍵となりそうだ。つまり、参照関係は時間とともに変化するが、その監視の手がかりになるというわけである。
「チャンク(chunk)」という用語も聞き慣れない。「かたまり」という意味で、将来的にオブジェクトを利用するための空き領域のこと。ガベージコレクションは、死んだオブジェクトを回収して、チャンクとして次に備える。
... こうした用語がデータ構造にだけ着目している点に、いかにもゴミ収集の世界という印象を与える。要するに、問題は死んだオブジェクトをいかに判別するかということ。過去の実績や栄光などに構っちゃいない。そして、ガベージコレクションの役割は、死んだオブジェクトを本当の意味で葬り去ることにある。
2. マークスイープGC(Mark Sweep GC)
保守的GCの代表的な存在のようで、その名のとおり、マークフェーズとスイープフェーズからなる。マークフェーズは、生きているオブジェクトにマークをつけるステップ。スイープフェーズは、マークのついていないオブジェクトを回収するステップ。その機構は極めて単純で、ルートから階層的に参照関係を再帰的に辿ってマークすれば、すべてのオブジェクトがマークできるという発想。
オブジェクト探索には、その階層から「深さ優先探索」と、その広がりから「幅優先探索」とが考えられる。GCはすべてを探索する必要があるので、どちらを優先しても探索するステップ数はあまり変わらない。だが、メモリ消費量を比較すると、深さ優先探索の方が少なく抑えられる傾向にあるという。アロケーションのタイミングは、ミューテータからチャンクが要求されると、その適切なサイズのチャンクを返す。
チャンクには、「First-fit, Best-fit, Worst-fit」の三つの戦略があるという。First-fit は要求されたサイズを返す。Best-fit は要求サイズ以上で最小のチャンクを返す。Worst-fit は最大のチャンクを見つけ、要求されたサイズとその残りに分割する。戦略によっては、細かなチャンクが多くなってしまう問題がある。そこで、連続したチャンクをつないでおいて、フリーリストとして持っておく手もある。
また、マークスイープGCは、Copy-On-Write との相性が悪いという。Copy-On-Write とは、unix系の仮想記憶で使用されている高速化手法で、プロセスのコピー(fork)を行う時など、大半のメモリ領域でコピーしたふりをして、実際にはメモリを共有するといった仕掛けである。だが、書き込みが発生した場合、他のプロセスとの不整合が生じるため、共有メモリを勝手に書き換えるわけにはいかない。書き込む場合は私有領域にコピーしておき、その領域上でデータ操作を行えばいいのだけど。マークスイープGCは、生きている可能性のあるオブジェクトすべてにマークビットを立ててしまうため、本来発生しないコピーが頻発してメモリを圧迫するという。確かに、マークビットを立てるだけで、オブジェクトに書き換えが生じたと勘違いされては困る。この問題に対処する方法が、「ビットマップマーキング」だという。ガベージコレクション用のヘッダをビットマップテーブルとして別管理するわけか...
3. 参照カウント
すべてのオブジェクトに参照の数を記憶させるという考え方で、各オブジェクトは自分の人気度を知っていて、人気がなければ自然消滅させる。マークスイープGCでは、チャンクがなくなった時にミューテータがGCに空き領域を要求するが、参照カウントでは、ミューテータが明示的にGCを起動することはなく、ミューテータの処理とともにカウンタの増減を行う。カウンタの増減のタイミングは、ミューテータが新たなオブジェクトを生成する時やポインタの参照状態を更新した時で、カウンタ値がゼロになると破棄される。参照カウントは、メモリ管理をミューテータと並行して行うという特徴がある。しかしながら、カウンタ値のビット幅が大きくなり、処理が重たそう。
また、循環参照が回収できないという大きな欠点を抱えているという。カウンタのビット幅を減らす方法では、「Sticky参照カウント法」を紹介してくれる。その極端な例では、1bitしか割り当てない「1ビット参照カウント」という方法もあるという。すぐにオーバーフローするわけで、簡易的な判別ぐらいにしか使えないような...
カウンタの増減処理を軽減する方法では、「遅延参照カウント法」という改良版が紹介される。
さらに、循環参照が回収できるように、マークスイープGCと組み合わせた「部分マークスイープ法」を紹介してくれる。循環参照が回収できないのは、参照カウントの特有の問題とすれば、通常は参照カウントをやっておき、必要な時にマークスイープGCを呼び出すという戦略である。しかし、効率が悪いようだ。一般的に、循環参照をもつゴミは滅多に生じないのだとか。循環参照を持つかもしれないオブジェクト群に対してのみ、マークスイープGCを適用するとなると、循環参照であるかもしれないという推定が必要になる。再帰的にアロケーションを試すといった機構が必要か。これはこれで、オーバーヘッドが大きそうである。滅多に生じないのであれば、最初のキューが空かどうかだけでも、かなりの判別ができそうな気もする。
4. コピーGC(Copying GC)
生きているオブジェクトだけを集めて別の領域にコピーし、連続した領域を確保するという考え方。むかーし、メインフレームでコンデンスによる最適化といった処理を明示的にやっていたような... おっと、年齡がバレそう!ユーザが明示的にデフラグをやる某OSの思想もどうか?と思うが...
それはさおき、コピーGCはフラグメンテーションの抑止に非常に良く、メモリ状態を常に健全に保てるという特徴がある。全領域をコピーするので、保守的GCと相反する。参照関係にあるオブジェクト同士が隣り合わせにあるので、キャッシュメモリの恩恵を受けやすい。しかし、ヒープ領域を常に二等分して、片方をバックアップ用に開けておく必要があるため、メモリの使用効率が悪い。
また、再帰的関数の呼び出しでは、子オブジェクトが再帰的にコピーを行うため、オーバーヘッドが大きいという。再帰的コピーの対処では、固有の反復コピー関数で置き換える「CheneyのコピーGC」を紹介してくれる。キャッシュとの相性を犠牲にするが...
あるいは、全体を二等分するのではなく、細かく空間を分けて、マークスイープGCなどの他のアルゴリズムに割り当てる「複数空間コピー法」も紹介してくれる。フラグメンテーションの問題が再浮上するけど...
5. 世代別GC(Generational GC)
三つのアルゴリズムとは、ちと違う視点だが、考え方としては興味深い。注意したいのは、このアルゴリズムは単独なものではなく、他のGCと組み合わせることである。
ほとんどのオブジェクトは生成されてすぐゴミになり、長く生き残るのは稀、という研究報告があるそうな。そこで、オブジェクトに年齡の概念を導入する。GCを一回経て、生き残ったオブジェクトは、1歳となる。そして、オブジェクトを世代別に分類し、一定の年齡を超えると旧世代オブジェクトとし、新世代オブジェクトを重点的にGCの対象とすることで時間を短縮する。
とはいえ、旧世代から新世代への参照を考慮する必要がある。その対処では、記憶集合(Remembered set)を使って、新世代への参照を効率よく見つけることができるという。そして、「ライトバリア」という旧世代から新世代への参照を記録するための機構を紹介してくれる。ヒープ領域が圧迫された時の非常手段として、旧世代オブジェクトから排除するというのはありかもしれん。楢山節考やなぁ...
6. Python
Python のメモリ確保は、単純に malloc/free を使うだけでなく、その上に3階層の独自レイヤを重ねて、効率的なアロケーションを行う戦略をとっているという。
レイヤ3: PyList_New(), PyTuplet_New(), PyDict_New(),...
レイヤ2: PyObject_GC_New(), PyObject_Malloc(), ...
レイヤ1: new_arena()
レイヤ0: malloc()
しかも、オブジェクトの生成時に、割り当てるメモリのサイズによって、アロケーション方法を変えている。要求サイズが 256byte を超えると素直に malloc を呼び、それ以下だとレイヤ順に登っていく。オブジェクトのほとんどが、256byte 以下で、しかも、すぐに捨てられる傾向にある。例えば、forループ文では一時的な文字列や数値列を大量に使い捨てるので、malloc/free 構造を使うのはあまりにも酷。
その構造は、細かい方からブロック、プール、アリーナの3階層になっているという。アリーナオブジェクトはプールで分割され、プールサイズは 4Kbyte 固定。このサイズは、大抵のOSの仮想メモリのページサイズ 4K と合う。OSがプール単位でメモリ管理してくれることを期待してのことか。それで、OSとの相性が良くなるかは知らんが...
また、アルゴリズムは参照カウントをベースとし、「参照の所有権」という構造を紹介してくれる。所有権はオブジェクトに対するものではなく、参照に対してのもの。尚、オブジェクト自体には所有権はない。参照の所有権は、関数の戻り値と引数に大きな意味を持つという。関数側は、呼び出し側に戻り値と一緒に参照の所有権を渡す。参照の所有権を持つものが、同時に破棄する権利を持つという考え方か。他から参照ができるのは、参照の所有権を借りている状態とするわけだが、借り手が勝手に破棄するわけにはいかない。ただ、カウンタをデクリメントする権利はある。貸出時にインクリメントして、返却時にデクリメントするという仕掛けか。まるで図書館の仕組み。しかし、すべてのデータのやりとりにおいて、参照の所有権がつきまとうとなれば、言語処理系に仕様変更や機能追加をする度に、GCの構造に振り回されそう。
また、参照カウントの欠点である循環参照の問題は、マークスイープGCの改良版との組合せで対処しているという。循環参照は、すべてのオブジェクトで起こるのではなく、コンテナオブジェクトによって引き起こされるという。コンテナオブジェクトとは、他のオブジェクトへの参照を保持することが可能なオブジェクトのこと。尚、Pythonのオブジェクト構造には、リスト型、タプル型、辞書型といったコンテナオブジェクトが用意されている。
なんと!コンテナオブジェクトは三世代あって、世代別コンテナオブジェクト構造だという。言語設計者は、こんなデータ構造までも考慮しながら設計しなければならんのかぁ... 足を向けて寝られん!
7. DalvikVM
DalvikVM は、Androidプラットフォームに搭載される仮想マシン。Android のアーキテクチャは、Linuxカーネルやそのライブラリ(libc, SQlite, ...)で構成されるが、その上位階層に位置づけられる。尚、Dalvik(谷間の入江) という名は、開発者Dan Bornstein の祖先が住んだアイスランドのフィヨルドにある漁村に因んでいるそうな。
Androidを起動すると、最初に Zygote というプロセスが立ち上がるという。Zygote はすべての親プロセスとなる。アプリケーションを立ち上げる際は、Zygote から fork してプロセスを作る。Zygote は多くのライブラリを抱えるために起動は遅いが、その後の子プロセスは起動が高速に行える。また、子プロセスは親プロセスの共有メモリ領域を使用するため、メモリ消費量も軽減できるという。
ちなみに、Android には、bionic という独自のCライブラリが搭載されているという。bionic は、glibc malloc から派生した独自の dlmalloc を持っているとか。glibc が大きすぎるということか。BSD libc を改良したものらしい...
共有メモリ用のデバイスには、ashmem(Anonymous Shared Memory Subsystem) というものが組み込まれているという。こいつが、mmap の機構を持っているらしい。mmap とは unix系のシステムコールで、ファイルのランダムアクセスなどを可能にするライブラリ。通常のアロケーションには、brk というシステムコールを使うという。これは、Cのヒープ領域を拡張するシステムコールだとか。だが、Cのヒープ領域はプロセスによってサイズの上限が決まっていて、mmap は、brk より制限が少なく、大きなメモリサイズを取得できる。ただし、mmap はページサイズ 4KByte 単位でしか割り当てない。
dlmalloc のアロケーションは、小さなサイズには brk を、大きなサイズには mmap を使うという。mmap 機構からして、Copy-On-Write との相性が良さそうだが、DalvikVMでは、これを苦手とするマークスイープGCを採用しているという。もっとも、この問題に対処したビットマップマーキングのようだが...
ところで、仮想マシンの世界は、大まかにレジスタマシンとスタックマシンの二つに分類される。スタックマシンは、レジスタを使わずにスタックを使って計算し、結果をスタックに積み上げる。一方、レジスタマシンは、数値を固有のレジスタにロードして、計算結果をレジスタに格納する。CPUの設計経験を持つおいらには、後者の方がイメージしやすい。それも古代人の感覚かもしれん。実際、固有レジスタで機能を差別化するよりも、スタックだけで抽象化した方がすっきりしている。スタックマシンのメリットは、オブジェクトコードのコンパクト化、コンパイルの単純さなどが挙げられるが、なによりもプロセッサの状態数が少なくて済む。ただ、メモリ参照をスタックで管理すればアクセスがそこに集中するわけだし、GCにとっては辛そうな気もするけど...
多くの JVM(Java Virtual Machine )でスタックマシンが採用される。しかし、DalvikVM はレジスタマシンを採用しているという。それも、Android 特有の事情があるようだ。Android端末のプロセッサが、レジスタマシンアーキテクチャだからであろう。ハードウェア思想をそのまま受け継いで、最大限の高速化を狙っているのだろう。これを仮想マシンと言うのか?は知らん。実際、ARMに特化したアセンブラコードもたくさん置かれているらしい。Androidマシンには、ARMが採用され、Android-x86 も進行中という事情もある。
8. Rubinius
Rubyの処理系で有名なのは、C言語で記述される CRuby の方だが、本書はあえて Rubinius を扱っている。Rubiniusは、Evan Phoenix を中心に進められ、その象徴的なポリシーに「Ruby で Ruby を実装」というのがあるそうな。思想では、Rubinius の方がエレガントに映るが、実用性では、CRuby の方であろうか。Rubinius が興味深いのは、本書で扱われる数少ない「正確なGC」の事例だということ。尚、CRuby の方は「保守的GC」だという。
Rubinius は世代別GCを採用し、マイナーGCとメジャーGCの二段階で構成されるという。マイナーGCでは、コピーGC(CheneyのコピーGC)を、メジャーGCでは、マークスイープGCとマークコンパクトGC(ImmixGC)を。メモリ空間も、それぞれ三つの領域に割り当てられる。シーケンスは、閾値を超える大きなサイズの場合はマークスイープGCアロケータを呼び出し、閾値を越えない場合は、コピーGC空間用に割り当て可能な場合はコピーGCアロケータを呼び出し、それ以外はマークコンパクトGC用アロケータを呼び出すといった具合。コピーGCでは、ライトバリアが実装されているようだ。
やはり、Rubiniusも、CRuby用に書かれたC拡張ライブラリをサポートしているようだ。では、Cのコールスタックやレジスタをどうやって走査するのか?保守的GCであれば、オブジェクトへのポインタがC拡張ライブラリのコールスタックやレジスタに漏れたとしても、とりあえず生きているオブジェクトとみなす。しかし、正確なGCではそうはいかない。その対処として、C拡張ライブラリに渡すすべてのオブジェクトへのポインタをハンドラに格納し、ルートで扱うという。そして、参照カウントに似た形でハンドラの生死を管理するとか。こりゃ、いくらなんでも Ruby じゃ書けんやろ。どうやら、C++ で書いてギャップを埋めているようだ。あれ、ポリシーに反しないのか?
保守的GCのメリットは、ミューテータでGCを意識する必要がない。デメリットは、使用できるGCアルゴリズムが制限される。対して、正確なGCのメリットは、GCアルゴリズムが制限されない。デメリットは、ミューテータを意識する必要がある。保守的なGCを採用している CRuby は、驚くほど簡単にC拡張ライブラリを記述することができるという。対して、正確なGCを採用している Rubinius は、アルゴリズムの制限がないために、比較的簡単にGCを改良することができるという。GCの作りやすさを優先しているという見方もできそうか...
9. V8
Google Chrome の特徴は、Google社が独自に開発した高速な JavaScript エンジンを搭載していること。そう、V8 JavaScript Enjine ってやつだ。名前の由来は、V型8気筒エンジンからきているらしい。高速なパワフルエンジンの代名詞だとか。コードは、80%以上が C++でグルグルしそうだけど...
V8 は正確なGCが採用され、世代別GCが使用されるという。構成は、Rubinius のGCに似ていて、これも正確なGCの事例。マイナーGCでは、コピーGC(CheneyのコピーGC)を、メジャーGCでは、マークスイープGCとマークコンパクトGCを採用している。ハンドラでリストを持つという考え方も、Rubinius と同じか。もっとも、こちらは最初から C++ で書こうとしているので、なんでもありだけど...
そもそも、GCをどう位置づけるか?システムプログラムなのだから、わざわざスクリプト言語で書く必要があるのか?あるいは、言語システムはアプリケーションプログラムなのか?OSの境界も曖昧になっている。ユーザの立場では、ポインタから解放してくれることはありがたい。だからといって、ポインタの概念を知らなくて、本当にいいのか?将来はガベージコレクションも独り一人歩きを始めるのかもしれん...
ところで、むかーしから、ファイナライザってやつの意義がよく分かっていない。ソフト屋さんに、いろいろ説明してもらうのだけど、いまいちしっくりこない。ファイナライズとは、オブジェクトの解放処理にフックをかけて、何らかの処理をする機能である。何らかの処理というのが微妙で、メッセージを発行するぐらいしか思いつかない。デバッグの手がかりにはなりそうだが、パフォーマンスを落とすだけのような気もする。GCを装備していない言語システムでは、直接デストラクタをやればいいだろう。だが、自動化システムではファイナライザにオブジェクトの解放まで期待していいのか?
案の定、V8 にはファイナライザがないという。ファイナライザに関する問題は、GCの実装において厄介なものらしい。もしかして、いらねぇってかぁ?変に操作をやると怖いから、触らぬ神に祟りなし!
整数型や文字型などプリミティブなデータ型を扱う分には、それほど目くじらを立てることもあるまい。だが、大量のデータ領域、あるいは、クラス型や構造体といった抽象化データを扱う場合には注意がいる。メモリ空間を相対アドレスで管理すれば、複雑なデータ構造にもアクセスしやすい。物理的には、参照という形で間接アドレッシングの構造を持つことになる。あの忌み嫌われるポインタってやつだ。こいつの危険性は、参照値をちょいと間違えたり改竄するだけで不正領域を指すことができることで、セキュリティ上の問題となる。あるいは、malloc/free, new/delete といった御呪いを疎かにするだけで、ヒープ領域には文字通りゴミが山積みされる。メモリ資源が豊富になればなるほどコードは複雑化し、バグの頻度が高まるは必定。不要になったゴミは長い間メモリ空間に居座り、メモリリークやらで他のプログラムと衝突したり、コールスタックに矛盾が紛れ込んでシステムを不安定にさせたり、最悪の場合メモリを喰い潰してシステムをダウンさせる。
そこで登場するのがゴミ収集係、そう、ガベージコレクションだ。人間社会においても、ゴミ清掃システムが破綻すると都市は崩壊する。地味な存在こそが、真の意味でシステムを支えている。本来、論理性だけに傾注したいプログラマとって、低水準な構造を意識させられることは思考の足かせとなる。動的空間を意識せずに済むというだけで、情報のゴミに翻弄される酔っ払いは幸せよ...
しかしながら、自動化という言葉は、心地よい響きがするだけに迷信となりやすい。厄介な機能を隠してくれるということは、その危険性までも隠蔽することになる。
近年、ポインタの概念を排除した多くの高水準言語を見かける。だが、むろんポインタがなくなったわけではなく、隠しているに過ぎない。トリッキーなキャストを要求するようなデータ定義が危険なことに変わりはない。ゴミ収集の仕掛けや癖を知っておくだけでも、危険なデータ構造を定義するリスクを避けることができよう。
ちなみに、おいらはプログラマではないが、メモリ管理やデータ構造の考え方はハードウェア設計でも参考になる。FIFO構造やスタック構造など物理構造の制限に因われなければ、思考も広がるだろう。おまけに、アルゴリズムを読むのが好きときた。コンパクトでエレガントに書かれる分野だけに、数学的で無味乾燥的なものと思われがちだが、そこには作者の思考物語が埋め込まれている。それが読み取れた時、感動を禁じ得ない...
本書に共感を覚えるのは、実装の解説をデータ型から始めてくれることである。おいらは、データ型やクラス型や構造体などの定義が、コンパクトな仕様書のようなものだと考えている。静的なデータ型を一通り定義するだけで、大方のプログラムイメージが出来上がっている。型の適切な定義は、そのプログラムが何をするものかについて、かなりの事を物語ってくれるはずだ。
実装編では、Python, DalvikVM(Android), Rubinius(Ruby), V8(JavaScript)におけるものが紹介され、言語システムを違った視点から眺められるのも興味深い。ただ、アルゴリズムではやや意外な印象を与える。それは、この技術分野が思ったより推論的で、確率論的であること。人間社会的とも言えようか。自分で明示的にやった方がマシかもしれない、と思わせるところもある。もう少しきちんと管理してくれると思ったのだが、保険の機能ぐらいに思った方がよさそうである。
ガベージコレクションは、大まかに「保守的GC」と「正確なGC」の二つに分類される。保守的GCとは、「ポインタと非ポインタとを識別できないGC」のことだという。正確なGCとは、言うまでもなく確実にポインタを識別すること。それがポインタなのかも正確に判断できないとなれば、データ領域を勝手に移動すると本来の参照関係が崩れることになる。よって、フラグメーテーションの問題がつきまとう。
しかしながら、ポインタの識別は構文解析と関わり、言語処理系の支援なしで完璧な判別は困難となる。処理も重そうだし、本筋のプログラムが遅くなったり停止するのでは本末転倒。保守的GCを選択する方が、実用的なようである。
さらに、アルゴリズムが言語処理系に対して独立して設計できるかどうかも、実用性の指標となろう。結局、現実味のある実装は、互いのアルゴリズムの欠点を補い合うような複合的な用い方になる。いまや実用的の代名詞となった、妥協、適当、微妙... ってのが、この世にマッチしているのかもしれん。どうせ世界は不完全だし。現代社会は、何事も面倒なことを覆い隠し、利便性や自動化に邁進していくが、自動化に頼り過ぎる感は否めない。本書は、これを問うているようにも映る。プログラミングが庶民化すると、低品質のソフトウェアが大量に出回る。少なくとも、システムプログラムとアプリケーションプログラムでは、プログラマの意識にも雲泥の差が生じるだろう。高水準という基準も曖昧になっていく。かつて、C言語も高水準言語と呼ばれた。そりゃ、アセンブラ言語に比べれば、見た目からして高級だ。アセンブラ言語だって機械語に比べれば、はるかに抽象度が高い。所詮、相対的な価値観の問題か。今日、高水準と呼ばれるプログラミング言語の一つの指標として、言語システムが動的メモリを自動で管理してくれるかどうか、という見方はできそうである...
1. ガベージコレクションの世界と三つの基本アルゴリズム
1995年、Javaの発表以来、ガベージコレクション技術の有り難さが広く認知されるようになった。しかし、その歴史は古く、1959年、Lispの設計で、D.Edwards が実装したという。
本書は、基本的なアルゴリズムに、「マークスイープGC」、「参照カウント」、「コピーGC」の三つを挙げ、他は派生型や組合せとしている。マークスイープGCは1960年、John McCarthy が発表... 参照カウントは1960年、George E. Collins が発表... コピーGCは1963年、Marvin L. Minsky が発表... と、この分野の基礎技術は半世紀前にほぼ確立しているようである。いずれにせよ、完璧なガベージコレクションの方法はない。マシン、言語、アプリケーションなどの設計思想に応じて、アルゴリズムの組合せや用い方も変わる。
全般的な印象として気になるのが、GCの起動タイミングが先送りなところである。具体的には、メモリアロケーションに失敗した時。おいらは、ゴミが発生したら即掃除しないと気が済まないタチだ。もちろん、先駆けてメモリ状態を健全に保とうとするアルゴリズムもあるが...
また、同じソフトウェア業界でありながら、用語のニュアンスもだいぶ違うようである。
例えば...
「オブジェクト」とは、オブジェクト指向で言うところの属性や振る舞いを持ったサービス群という意味合いでなく、データの塊を意味するという。ガベージコレクションは、この塊を基本単位とし、メモリ上での移動や破棄といった操作を行う。
「ミューテータ(mutator)」という用語も紹介してくれる。Dijkstra によって考案された用語だそうで、「変化させるもの」という意味。オブジェクト指向的なオブジェクトへのアクセスメソッドは、基本的に set/get 系で済むと思っているが、ガベージコレクションでは参照関係を重視するため、ゴミ収集ではミューテータのタイミングが鍵となりそうだ。つまり、参照関係は時間とともに変化するが、その監視の手がかりになるというわけである。
「チャンク(chunk)」という用語も聞き慣れない。「かたまり」という意味で、将来的にオブジェクトを利用するための空き領域のこと。ガベージコレクションは、死んだオブジェクトを回収して、チャンクとして次に備える。
... こうした用語がデータ構造にだけ着目している点に、いかにもゴミ収集の世界という印象を与える。要するに、問題は死んだオブジェクトをいかに判別するかということ。過去の実績や栄光などに構っちゃいない。そして、ガベージコレクションの役割は、死んだオブジェクトを本当の意味で葬り去ることにある。
2. マークスイープGC(Mark Sweep GC)
保守的GCの代表的な存在のようで、その名のとおり、マークフェーズとスイープフェーズからなる。マークフェーズは、生きているオブジェクトにマークをつけるステップ。スイープフェーズは、マークのついていないオブジェクトを回収するステップ。その機構は極めて単純で、ルートから階層的に参照関係を再帰的に辿ってマークすれば、すべてのオブジェクトがマークできるという発想。
オブジェクト探索には、その階層から「深さ優先探索」と、その広がりから「幅優先探索」とが考えられる。GCはすべてを探索する必要があるので、どちらを優先しても探索するステップ数はあまり変わらない。だが、メモリ消費量を比較すると、深さ優先探索の方が少なく抑えられる傾向にあるという。アロケーションのタイミングは、ミューテータからチャンクが要求されると、その適切なサイズのチャンクを返す。
チャンクには、「First-fit, Best-fit, Worst-fit」の三つの戦略があるという。First-fit は要求されたサイズを返す。Best-fit は要求サイズ以上で最小のチャンクを返す。Worst-fit は最大のチャンクを見つけ、要求されたサイズとその残りに分割する。戦略によっては、細かなチャンクが多くなってしまう問題がある。そこで、連続したチャンクをつないでおいて、フリーリストとして持っておく手もある。
また、マークスイープGCは、Copy-On-Write との相性が悪いという。Copy-On-Write とは、unix系の仮想記憶で使用されている高速化手法で、プロセスのコピー(fork)を行う時など、大半のメモリ領域でコピーしたふりをして、実際にはメモリを共有するといった仕掛けである。だが、書き込みが発生した場合、他のプロセスとの不整合が生じるため、共有メモリを勝手に書き換えるわけにはいかない。書き込む場合は私有領域にコピーしておき、その領域上でデータ操作を行えばいいのだけど。マークスイープGCは、生きている可能性のあるオブジェクトすべてにマークビットを立ててしまうため、本来発生しないコピーが頻発してメモリを圧迫するという。確かに、マークビットを立てるだけで、オブジェクトに書き換えが生じたと勘違いされては困る。この問題に対処する方法が、「ビットマップマーキング」だという。ガベージコレクション用のヘッダをビットマップテーブルとして別管理するわけか...
3. 参照カウント
すべてのオブジェクトに参照の数を記憶させるという考え方で、各オブジェクトは自分の人気度を知っていて、人気がなければ自然消滅させる。マークスイープGCでは、チャンクがなくなった時にミューテータがGCに空き領域を要求するが、参照カウントでは、ミューテータが明示的にGCを起動することはなく、ミューテータの処理とともにカウンタの増減を行う。カウンタの増減のタイミングは、ミューテータが新たなオブジェクトを生成する時やポインタの参照状態を更新した時で、カウンタ値がゼロになると破棄される。参照カウントは、メモリ管理をミューテータと並行して行うという特徴がある。しかしながら、カウンタ値のビット幅が大きくなり、処理が重たそう。
また、循環参照が回収できないという大きな欠点を抱えているという。カウンタのビット幅を減らす方法では、「Sticky参照カウント法」を紹介してくれる。その極端な例では、1bitしか割り当てない「1ビット参照カウント」という方法もあるという。すぐにオーバーフローするわけで、簡易的な判別ぐらいにしか使えないような...
カウンタの増減処理を軽減する方法では、「遅延参照カウント法」という改良版が紹介される。
さらに、循環参照が回収できるように、マークスイープGCと組み合わせた「部分マークスイープ法」を紹介してくれる。循環参照が回収できないのは、参照カウントの特有の問題とすれば、通常は参照カウントをやっておき、必要な時にマークスイープGCを呼び出すという戦略である。しかし、効率が悪いようだ。一般的に、循環参照をもつゴミは滅多に生じないのだとか。循環参照を持つかもしれないオブジェクト群に対してのみ、マークスイープGCを適用するとなると、循環参照であるかもしれないという推定が必要になる。再帰的にアロケーションを試すといった機構が必要か。これはこれで、オーバーヘッドが大きそうである。滅多に生じないのであれば、最初のキューが空かどうかだけでも、かなりの判別ができそうな気もする。
4. コピーGC(Copying GC)
生きているオブジェクトだけを集めて別の領域にコピーし、連続した領域を確保するという考え方。むかーし、メインフレームでコンデンスによる最適化といった処理を明示的にやっていたような... おっと、年齡がバレそう!ユーザが明示的にデフラグをやる某OSの思想もどうか?と思うが...
それはさおき、コピーGCはフラグメンテーションの抑止に非常に良く、メモリ状態を常に健全に保てるという特徴がある。全領域をコピーするので、保守的GCと相反する。参照関係にあるオブジェクト同士が隣り合わせにあるので、キャッシュメモリの恩恵を受けやすい。しかし、ヒープ領域を常に二等分して、片方をバックアップ用に開けておく必要があるため、メモリの使用効率が悪い。
また、再帰的関数の呼び出しでは、子オブジェクトが再帰的にコピーを行うため、オーバーヘッドが大きいという。再帰的コピーの対処では、固有の反復コピー関数で置き換える「CheneyのコピーGC」を紹介してくれる。キャッシュとの相性を犠牲にするが...
あるいは、全体を二等分するのではなく、細かく空間を分けて、マークスイープGCなどの他のアルゴリズムに割り当てる「複数空間コピー法」も紹介してくれる。フラグメンテーションの問題が再浮上するけど...
5. 世代別GC(Generational GC)
三つのアルゴリズムとは、ちと違う視点だが、考え方としては興味深い。注意したいのは、このアルゴリズムは単独なものではなく、他のGCと組み合わせることである。
ほとんどのオブジェクトは生成されてすぐゴミになり、長く生き残るのは稀、という研究報告があるそうな。そこで、オブジェクトに年齡の概念を導入する。GCを一回経て、生き残ったオブジェクトは、1歳となる。そして、オブジェクトを世代別に分類し、一定の年齡を超えると旧世代オブジェクトとし、新世代オブジェクトを重点的にGCの対象とすることで時間を短縮する。
とはいえ、旧世代から新世代への参照を考慮する必要がある。その対処では、記憶集合(Remembered set)を使って、新世代への参照を効率よく見つけることができるという。そして、「ライトバリア」という旧世代から新世代への参照を記録するための機構を紹介してくれる。ヒープ領域が圧迫された時の非常手段として、旧世代オブジェクトから排除するというのはありかもしれん。楢山節考やなぁ...
6. Python
Python のメモリ確保は、単純に malloc/free を使うだけでなく、その上に3階層の独自レイヤを重ねて、効率的なアロケーションを行う戦略をとっているという。
レイヤ3: PyList_New(), PyTuplet_New(), PyDict_New(),...
レイヤ2: PyObject_GC_New(), PyObject_Malloc(), ...
レイヤ1: new_arena()
レイヤ0: malloc()
しかも、オブジェクトの生成時に、割り当てるメモリのサイズによって、アロケーション方法を変えている。要求サイズが 256byte を超えると素直に malloc を呼び、それ以下だとレイヤ順に登っていく。オブジェクトのほとんどが、256byte 以下で、しかも、すぐに捨てられる傾向にある。例えば、forループ文では一時的な文字列や数値列を大量に使い捨てるので、malloc/free 構造を使うのはあまりにも酷。
その構造は、細かい方からブロック、プール、アリーナの3階層になっているという。アリーナオブジェクトはプールで分割され、プールサイズは 4Kbyte 固定。このサイズは、大抵のOSの仮想メモリのページサイズ 4K と合う。OSがプール単位でメモリ管理してくれることを期待してのことか。それで、OSとの相性が良くなるかは知らんが...
また、アルゴリズムは参照カウントをベースとし、「参照の所有権」という構造を紹介してくれる。所有権はオブジェクトに対するものではなく、参照に対してのもの。尚、オブジェクト自体には所有権はない。参照の所有権は、関数の戻り値と引数に大きな意味を持つという。関数側は、呼び出し側に戻り値と一緒に参照の所有権を渡す。参照の所有権を持つものが、同時に破棄する権利を持つという考え方か。他から参照ができるのは、参照の所有権を借りている状態とするわけだが、借り手が勝手に破棄するわけにはいかない。ただ、カウンタをデクリメントする権利はある。貸出時にインクリメントして、返却時にデクリメントするという仕掛けか。まるで図書館の仕組み。しかし、すべてのデータのやりとりにおいて、参照の所有権がつきまとうとなれば、言語処理系に仕様変更や機能追加をする度に、GCの構造に振り回されそう。
また、参照カウントの欠点である循環参照の問題は、マークスイープGCの改良版との組合せで対処しているという。循環参照は、すべてのオブジェクトで起こるのではなく、コンテナオブジェクトによって引き起こされるという。コンテナオブジェクトとは、他のオブジェクトへの参照を保持することが可能なオブジェクトのこと。尚、Pythonのオブジェクト構造には、リスト型、タプル型、辞書型といったコンテナオブジェクトが用意されている。
なんと!コンテナオブジェクトは三世代あって、世代別コンテナオブジェクト構造だという。言語設計者は、こんなデータ構造までも考慮しながら設計しなければならんのかぁ... 足を向けて寝られん!
7. DalvikVM
DalvikVM は、Androidプラットフォームに搭載される仮想マシン。Android のアーキテクチャは、Linuxカーネルやそのライブラリ(libc, SQlite, ...)で構成されるが、その上位階層に位置づけられる。尚、Dalvik(谷間の入江) という名は、開発者Dan Bornstein の祖先が住んだアイスランドのフィヨルドにある漁村に因んでいるそうな。
Androidを起動すると、最初に Zygote というプロセスが立ち上がるという。Zygote はすべての親プロセスとなる。アプリケーションを立ち上げる際は、Zygote から fork してプロセスを作る。Zygote は多くのライブラリを抱えるために起動は遅いが、その後の子プロセスは起動が高速に行える。また、子プロセスは親プロセスの共有メモリ領域を使用するため、メモリ消費量も軽減できるという。
ちなみに、Android には、bionic という独自のCライブラリが搭載されているという。bionic は、glibc malloc から派生した独自の dlmalloc を持っているとか。glibc が大きすぎるということか。BSD libc を改良したものらしい...
共有メモリ用のデバイスには、ashmem(Anonymous Shared Memory Subsystem) というものが組み込まれているという。こいつが、mmap の機構を持っているらしい。mmap とは unix系のシステムコールで、ファイルのランダムアクセスなどを可能にするライブラリ。通常のアロケーションには、brk というシステムコールを使うという。これは、Cのヒープ領域を拡張するシステムコールだとか。だが、Cのヒープ領域はプロセスによってサイズの上限が決まっていて、mmap は、brk より制限が少なく、大きなメモリサイズを取得できる。ただし、mmap はページサイズ 4KByte 単位でしか割り当てない。
dlmalloc のアロケーションは、小さなサイズには brk を、大きなサイズには mmap を使うという。mmap 機構からして、Copy-On-Write との相性が良さそうだが、DalvikVMでは、これを苦手とするマークスイープGCを採用しているという。もっとも、この問題に対処したビットマップマーキングのようだが...
ところで、仮想マシンの世界は、大まかにレジスタマシンとスタックマシンの二つに分類される。スタックマシンは、レジスタを使わずにスタックを使って計算し、結果をスタックに積み上げる。一方、レジスタマシンは、数値を固有のレジスタにロードして、計算結果をレジスタに格納する。CPUの設計経験を持つおいらには、後者の方がイメージしやすい。それも古代人の感覚かもしれん。実際、固有レジスタで機能を差別化するよりも、スタックだけで抽象化した方がすっきりしている。スタックマシンのメリットは、オブジェクトコードのコンパクト化、コンパイルの単純さなどが挙げられるが、なによりもプロセッサの状態数が少なくて済む。ただ、メモリ参照をスタックで管理すればアクセスがそこに集中するわけだし、GCにとっては辛そうな気もするけど...
多くの JVM(Java Virtual Machine )でスタックマシンが採用される。しかし、DalvikVM はレジスタマシンを採用しているという。それも、Android 特有の事情があるようだ。Android端末のプロセッサが、レジスタマシンアーキテクチャだからであろう。ハードウェア思想をそのまま受け継いで、最大限の高速化を狙っているのだろう。これを仮想マシンと言うのか?は知らん。実際、ARMに特化したアセンブラコードもたくさん置かれているらしい。Androidマシンには、ARMが採用され、Android-x86 も進行中という事情もある。
8. Rubinius
Rubyの処理系で有名なのは、C言語で記述される CRuby の方だが、本書はあえて Rubinius を扱っている。Rubiniusは、Evan Phoenix を中心に進められ、その象徴的なポリシーに「Ruby で Ruby を実装」というのがあるそうな。思想では、Rubinius の方がエレガントに映るが、実用性では、CRuby の方であろうか。Rubinius が興味深いのは、本書で扱われる数少ない「正確なGC」の事例だということ。尚、CRuby の方は「保守的GC」だという。
Rubinius は世代別GCを採用し、マイナーGCとメジャーGCの二段階で構成されるという。マイナーGCでは、コピーGC(CheneyのコピーGC)を、メジャーGCでは、マークスイープGCとマークコンパクトGC(ImmixGC)を。メモリ空間も、それぞれ三つの領域に割り当てられる。シーケンスは、閾値を超える大きなサイズの場合はマークスイープGCアロケータを呼び出し、閾値を越えない場合は、コピーGC空間用に割り当て可能な場合はコピーGCアロケータを呼び出し、それ以外はマークコンパクトGC用アロケータを呼び出すといった具合。コピーGCでは、ライトバリアが実装されているようだ。
やはり、Rubiniusも、CRuby用に書かれたC拡張ライブラリをサポートしているようだ。では、Cのコールスタックやレジスタをどうやって走査するのか?保守的GCであれば、オブジェクトへのポインタがC拡張ライブラリのコールスタックやレジスタに漏れたとしても、とりあえず生きているオブジェクトとみなす。しかし、正確なGCではそうはいかない。その対処として、C拡張ライブラリに渡すすべてのオブジェクトへのポインタをハンドラに格納し、ルートで扱うという。そして、参照カウントに似た形でハンドラの生死を管理するとか。こりゃ、いくらなんでも Ruby じゃ書けんやろ。どうやら、C++ で書いてギャップを埋めているようだ。あれ、ポリシーに反しないのか?
保守的GCのメリットは、ミューテータでGCを意識する必要がない。デメリットは、使用できるGCアルゴリズムが制限される。対して、正確なGCのメリットは、GCアルゴリズムが制限されない。デメリットは、ミューテータを意識する必要がある。保守的なGCを採用している CRuby は、驚くほど簡単にC拡張ライブラリを記述することができるという。対して、正確なGCを採用している Rubinius は、アルゴリズムの制限がないために、比較的簡単にGCを改良することができるという。GCの作りやすさを優先しているという見方もできそうか...
9. V8
Google Chrome の特徴は、Google社が独自に開発した高速な JavaScript エンジンを搭載していること。そう、V8 JavaScript Enjine ってやつだ。名前の由来は、V型8気筒エンジンからきているらしい。高速なパワフルエンジンの代名詞だとか。コードは、80%以上が C++でグルグルしそうだけど...
V8 は正確なGCが採用され、世代別GCが使用されるという。構成は、Rubinius のGCに似ていて、これも正確なGCの事例。マイナーGCでは、コピーGC(CheneyのコピーGC)を、メジャーGCでは、マークスイープGCとマークコンパクトGCを採用している。ハンドラでリストを持つという考え方も、Rubinius と同じか。もっとも、こちらは最初から C++ で書こうとしているので、なんでもありだけど...
そもそも、GCをどう位置づけるか?システムプログラムなのだから、わざわざスクリプト言語で書く必要があるのか?あるいは、言語システムはアプリケーションプログラムなのか?OSの境界も曖昧になっている。ユーザの立場では、ポインタから解放してくれることはありがたい。だからといって、ポインタの概念を知らなくて、本当にいいのか?将来はガベージコレクションも独り一人歩きを始めるのかもしれん...
ところで、むかーしから、ファイナライザってやつの意義がよく分かっていない。ソフト屋さんに、いろいろ説明してもらうのだけど、いまいちしっくりこない。ファイナライズとは、オブジェクトの解放処理にフックをかけて、何らかの処理をする機能である。何らかの処理というのが微妙で、メッセージを発行するぐらいしか思いつかない。デバッグの手がかりにはなりそうだが、パフォーマンスを落とすだけのような気もする。GCを装備していない言語システムでは、直接デストラクタをやればいいだろう。だが、自動化システムではファイナライザにオブジェクトの解放まで期待していいのか?
案の定、V8 にはファイナライザがないという。ファイナライザに関する問題は、GCの実装において厄介なものらしい。もしかして、いらねぇってかぁ?変に操作をやると怖いから、触らぬ神に祟りなし!
2014-07-20
"Emacs Lisp テクニックバイブル" るびきち 著
本書は、Lisp を手軽に学ぶために手にしたのだが、仕事仲間に話題を振ると、エディタ談義で盛り上がってしまった。プログラミング言語とエディタには相関関係があるという説もあるが、無理に法則性を見出すこともあるまい。開発環境は開発者の思考の場であり、テキストエディタは思考プロセスを書きとめる上で最も単純で根幹的な道具となる。それだけに使い手の思い入れは強く、プログラミング言語同様、宗教的ですらある。むかーし、出張先で困らないように、最低でも vi ぐらいは使えないといけないよ!と指摘されたことがある。もうそんな時代でもあるまいが、どんな環境でも対応できるような身体にはしておきたい。
本格的にエディタの選択に迫られたのは、20年前になろうか。Emacs に近寄り難いと感じたのは、当時のデフォルトのキーバインドが酷かったこと。vi の方がましだと思ったぐらい。現在でも、Emacs のキーバインドにうろたえる人は少なくあるまい。ネット社会ともなれば、カスタマイズした設定ファイルを公開してくれる方々がいて、非常に助かる。shell環境もそうだが、この手の設定環境は伝承される傾向があり、情報不足に陥ることはなさそうだ。
とはいえ、デフォルトで使いづらいというだけで、ヤル気が失せる。編集作業において、キーワードの補完や色分けといった機能は必須だ。コーディング中に、変数名の綴りを間違うだけで大きなストレスとなる。ちなみに、Emacs では、テキストの色分け機能がデフォルトで無効になっているという。(require 'generic-x)ってやれば済む話だが。著者は、これだけで Emacs ユーザの損失だと嘆いている。そうだろう!そうだろう!てなわけで、おいらは秀丸エディタ派となった。なんにせよ、テキストエディタってやつは、料理人でいうところの包丁一本... の存在だ!
しかしながら、プラットフォームに依存しない作業環境という観点から、Emacs も捨てがたい。たまには、Emacs + Mew を使うし、TRAMP というリモートアクセス用のパッケージにも興味がある。Windows版や Mac版もあるにはあるが、一昔前はバージョンや OS の違いで互換性が保たれないという印象があった。現在ではそうでもないらしい。
Emacs のマクロ機能は、秀丸エディタのそれとは比べ物にならないのも確か。一つのエディタの中に作業環境を押し込むのもどうか?という疑問もあるが、Emacs はエディタの概念をも超越している。実際、エディタの外に、gcc, Ruby, HTML & JavaScript などの環境を並行して構築しているが、プラットフォームを Emacs で吸収するという考え方もあるだろう。それを実現させるものが、バッファの概念だ。初めて触れた時、そのエレガントな思想に感動したものである。ファイルから独立したバッファの抽象度は高く、作業領域やアプリケーション領域に割り当てることができる。
ざっと眺めるだけでも... コマンドや関数の補完では、Completions バッファが自動で開いて候補が表示される。Help を開けば、そこに表示用バッファが生成される。ファイルを探す時(find-file)、カーソルでディレクトリ階層を辿ることができる。shell との相性がよく、端末として使える。本書は、eshellってやつを紹介してくれるが、病みつきになるらしい。なによりも驚くべきは、一時的な作業領域の scratch バッファが、lisp式を評価する機構を具えていることだ。あるいは、Lisp用対話型インタプリタも用意されている。本書では、これらよりもっといいやり方を教えてくれるけど...
それにしても、秀丸エディタのタブモードは捨てられん!と思いきや、Emacs にもあった。tabbar.elってやつが...
さて、Emacs Lisp の方はというと、ちと印象が違う。多少の方言は覚悟しても、Common Lisp の簡易版ぐらいに思っていたのだが、本書は決定的な違いがあることを教えてくれる。その違いとは、グローバル変数やクロージャの思想、そして、Common Lisp がレキシカルスコープであるのに対し、Emacs Lisp はダイナミックスコープだということ。
例えば... 関数もどきの let ってやつは、Common Lisp ではレキシカルスコープだが、Emacs Lisp ではダイナミックスコープになるんだとか... おいおい!!!
Common Lisp の機能を提供するパッケージ(cl.el)ってやつもあるが、禁止事項があって制限が設けられているという。著者は、そんな無駄なことを... と愚痴を語ってくれる。ソフトウェアを使う上で、達人の愚痴ほど参考になるものはあるまい。Emacs Lisp の進化過程では、Common Lisp の機能から派生したものが多い。昔は、when すらなかったとか。徐々に Common Lisp に近づいていくとすれば、制限することになんの意味があるのか、と疑問を持つのも当然であろう。実際、cl.el は標準装備され、(require 'cl)ってやるだけで使える。Lispユーザは当たり前のように使っているそうな。いくら制限を設けても、民主主義によって淘汰されていくだろう。
また、Emacs lisp はシングルスレッドだが、emacs 自体はマルチスレッドで、擬似マルチスレッドプログラミングのための deferred.el というライブラリも紹介してくれる。
1. Emacs Lisp のためのパッケージ... auto-install.el
auto-install.el は、URLを指定するだけでネット上の Emacs Lisp プログラムをインストールできるようになるという。尚、EmacsWiki(http://www.emacswiki.org/)には、様々なパッケージが集められている。
.emacs.el
他にも、Lisp 使いに便利そうな5つのパッケージを紹介してくれる。
ダウンロードは...
2. Lisp式の評価方法
対話的に評価できる方法が二つあるという。一つは、scratch バッファを使う方法。二つは、ielm(Interactive Emacs Lisp Mode)を使う方法。
scratch バッファでは、eval-print-last-sexp コマンドで直下に評価結果が出力される。eval-last-sexp でも評価できるが、出力場所がコマンドライン上で少し遠い。尚、eval-print-last-sexp には C-j が、eval-last-sexp には C-x C-e がキーバインドされている。
ielm は対話型インタプリタで、Rubyで言うところの irb(Interactive Ruby)か。M-x ielm とやれば起動する。
この二つだけでも感動しているというのに、本書はもっといいやり方を教えてくれる。上記の方法は、Emacs を終了すると結果が消える。そこで、open-junk-file.el パッケージを用いれば、ジャンクファイル上で評価して自動保存できる。ジャンクファイルとは、日時を元にしたファイル名をもつファイルのことで、M-x open-junk-file ってやれば起動する。惚れっぽい酔っ払いは、ジャンクにイチコロよ!
3. Common Lispパッケージ... cl.el
関数の名前空間は、Common Lisp と Emacs Lisp に違いがあって、衝突の可能性がある。なので、cl.el の禁止事項は、eval-when-compile でバイトコンパイル時にロードしてマクロを使う分には許可するが、Common Lisp の関数は使うな!ということらしい。つまり、(require 'cl) が禁止ということか?
本書は、(eval-when-compile (require 'cl)) ってやれば、Common Lisp のマクロを合法的に使えるとしている。ランタイムに cl.el のロードが禁止となれば関数は使えないが、コンパイル時に展開されるマクロならOKってか?ん~... 解釈の問題のような気もするが...
今となっては、Common Lisp に総入れ替えするわけにもいかないだろう。古い資産が誤動作しそうだし。Common Lisp と Emacs Lisp で、レキシカルスコープとダイナミックスコープの違いがあるのも、関数の変数をめぐって大きな問題となりそうだ。ならば、(require 'cl)を許可して、Common Lisp でオーバライドさせることを明示すれば良さそうな気もするが...
それはともかく、本書で紹介されるマクロは、なかなか便利そうである。リスト構造を分解して変数に代入する時、car, nth が冗長的なので、destructure-bind を使うとすっきりする。汎変数を使うと、代入の概念を拡張できる。setq は、その拡張版の setf が使える。汎変数には、car, nth といったリスト要素だけでなく、buffer-substring, point といったバッファ関連もあるようだ。
let/let* のレキシカルスコープ版は、lexical-let/lexical-let* があるという。ん~、これは微妙だなぁ!他には構造体が使えたり...
本書は、loop マクロをかなり丁寧に解説してくれる。こいつは、Common Lisp が提供するモンスターマクロだという。リストやベクタの要素の合計/最大値/最小値を与えたり、各要素に関数を適用したり、条件を満たす要素を抽出して演算を施したり... などの演算節が豊富で、統計情報を処理するのに強力なツールとなる。連想リストやハッシュテーブルのキーを求めたり、フィボナッチ数列を求めたりするのも、エレガントに書けるという。
また、非局所脱出メカニズムには二つあるという。Emacs Lisp 本来の catch/throw と Common Lisp の block/return-from。Common Lisp には block の概念があり、明示しなくても暗黙に block が形成される。この block がレキシカルスコープを実現している。block からは、return-from で脱出できる。一方、catch はダイナミックスコープの場合で、脱出時には、throw を呼び出す。cl.el のおかげで、Emacs Lisp でも block/return-from の仕掛けが使えるというわけか。
4. eshell のすゝめ
eshell は、Emacs Lisp で書かれているために、プラットフォームに依存しないという。zsh ライクで、使い勝手もよさそう。普通のシェルはC言語などで書かれているため、シェルスクリプトの範囲でしか拡張できないが、eshell はコマンド解釈の部分ですら乗っ取ることが可能で、コマンドラインを丸ごと zsh や Ruby に渡して実行することができるという。おぉ~...
本格的にエディタの選択に迫られたのは、20年前になろうか。Emacs に近寄り難いと感じたのは、当時のデフォルトのキーバインドが酷かったこと。vi の方がましだと思ったぐらい。現在でも、Emacs のキーバインドにうろたえる人は少なくあるまい。ネット社会ともなれば、カスタマイズした設定ファイルを公開してくれる方々がいて、非常に助かる。shell環境もそうだが、この手の設定環境は伝承される傾向があり、情報不足に陥ることはなさそうだ。
とはいえ、デフォルトで使いづらいというだけで、ヤル気が失せる。編集作業において、キーワードの補完や色分けといった機能は必須だ。コーディング中に、変数名の綴りを間違うだけで大きなストレスとなる。ちなみに、Emacs では、テキストの色分け機能がデフォルトで無効になっているという。(require 'generic-x)ってやれば済む話だが。著者は、これだけで Emacs ユーザの損失だと嘆いている。そうだろう!そうだろう!てなわけで、おいらは秀丸エディタ派となった。なんにせよ、テキストエディタってやつは、料理人でいうところの包丁一本... の存在だ!
しかしながら、プラットフォームに依存しない作業環境という観点から、Emacs も捨てがたい。たまには、Emacs + Mew を使うし、TRAMP というリモートアクセス用のパッケージにも興味がある。Windows版や Mac版もあるにはあるが、一昔前はバージョンや OS の違いで互換性が保たれないという印象があった。現在ではそうでもないらしい。
Emacs のマクロ機能は、秀丸エディタのそれとは比べ物にならないのも確か。一つのエディタの中に作業環境を押し込むのもどうか?という疑問もあるが、Emacs はエディタの概念をも超越している。実際、エディタの外に、gcc, Ruby, HTML & JavaScript などの環境を並行して構築しているが、プラットフォームを Emacs で吸収するという考え方もあるだろう。それを実現させるものが、バッファの概念だ。初めて触れた時、そのエレガントな思想に感動したものである。ファイルから独立したバッファの抽象度は高く、作業領域やアプリケーション領域に割り当てることができる。
ざっと眺めるだけでも... コマンドや関数の補完では、Completions バッファが自動で開いて候補が表示される。Help を開けば、そこに表示用バッファが生成される。ファイルを探す時(find-file)、カーソルでディレクトリ階層を辿ることができる。shell との相性がよく、端末として使える。本書は、eshellってやつを紹介してくれるが、病みつきになるらしい。なによりも驚くべきは、一時的な作業領域の scratch バッファが、lisp式を評価する機構を具えていることだ。あるいは、Lisp用対話型インタプリタも用意されている。本書では、これらよりもっといいやり方を教えてくれるけど...
それにしても、秀丸エディタのタブモードは捨てられん!と思いきや、Emacs にもあった。tabbar.elってやつが...
さて、Emacs Lisp の方はというと、ちと印象が違う。多少の方言は覚悟しても、Common Lisp の簡易版ぐらいに思っていたのだが、本書は決定的な違いがあることを教えてくれる。その違いとは、グローバル変数やクロージャの思想、そして、Common Lisp がレキシカルスコープであるのに対し、Emacs Lisp はダイナミックスコープだということ。
例えば... 関数もどきの let ってやつは、Common Lisp ではレキシカルスコープだが、Emacs Lisp ではダイナミックスコープになるんだとか... おいおい!!!
Common Lisp の機能を提供するパッケージ(cl.el)ってやつもあるが、禁止事項があって制限が設けられているという。著者は、そんな無駄なことを... と愚痴を語ってくれる。ソフトウェアを使う上で、達人の愚痴ほど参考になるものはあるまい。Emacs Lisp の進化過程では、Common Lisp の機能から派生したものが多い。昔は、when すらなかったとか。徐々に Common Lisp に近づいていくとすれば、制限することになんの意味があるのか、と疑問を持つのも当然であろう。実際、cl.el は標準装備され、(require 'cl)ってやるだけで使える。Lispユーザは当たり前のように使っているそうな。いくら制限を設けても、民主主義によって淘汰されていくだろう。
また、Emacs lisp はシングルスレッドだが、emacs 自体はマルチスレッドで、擬似マルチスレッドプログラミングのための deferred.el というライブラリも紹介してくれる。
1. Emacs Lisp のためのパッケージ... auto-install.el
auto-install.el は、URLを指定するだけでネット上の Emacs Lisp プログラムをインストールできるようになるという。尚、EmacsWiki(http://www.emacswiki.org/)には、様々なパッケージが集められている。
$ mkdir -p ~/.emacs.d/auto-install
$ cd ~/.emacs.d/auto-install/
$ wget http://www.emacswiki.org/emacs/download/auto-install.el
$ emacs --batch -Q -f batch-byte-compile auto-install.el
.emacs.el
(add-to-list 'load-path "~/.emacs.d/auto-install/")
(require 'auto-install)
(auto-install-update-emacswiki-package-name t)
(auto-install-compatibility-setup)
(setq ediff-window-setup-function 'ediff-setup-windows-plain)
他にも、Lisp 使いに便利そうな5つのパッケージを紹介してくれる。
open-junk-file.el (試行錯誤用ファイルを開く) lispxmp.el (式の評価結果を注釈する) paredit.el (括弧の対応を保持して編集する) auto-async-byte-compile.el (保存時に自動バイトコンパイル) package.el (ELPA/Marmaladeインストーラ emacs24で標準)
ダウンロードは...
M-x install-elisp-from-emacswiki open-junk-file.el
M-x install-elisp-from-emacswiki lispxmp.el
M-x install-elisp http://mumble.net/~campbell/emacs/paredit.el
M-x install-elisp-from-emacswiki auto-async-byte-compile.el
ついでに、tabbar.el も...
M-x install-elisp-from-emacswiki tabbar.el
それぞれダウンロード後にファイルがポップアップするので、C-c C-c とすればインストール完了。2. Lisp式の評価方法
対話的に評価できる方法が二つあるという。一つは、scratch バッファを使う方法。二つは、ielm(Interactive Emacs Lisp Mode)を使う方法。
scratch バッファでは、eval-print-last-sexp コマンドで直下に評価結果が出力される。eval-last-sexp でも評価できるが、出力場所がコマンドライン上で少し遠い。尚、eval-print-last-sexp には C-j が、eval-last-sexp には C-x C-e がキーバインドされている。
ielm は対話型インタプリタで、Rubyで言うところの irb(Interactive Ruby)か。M-x ielm とやれば起動する。
この二つだけでも感動しているというのに、本書はもっといいやり方を教えてくれる。上記の方法は、Emacs を終了すると結果が消える。そこで、open-junk-file.el パッケージを用いれば、ジャンクファイル上で評価して自動保存できる。ジャンクファイルとは、日時を元にしたファイル名をもつファイルのことで、M-x open-junk-file ってやれば起動する。惚れっぽい酔っ払いは、ジャンクにイチコロよ!
3. Common Lispパッケージ... cl.el
関数の名前空間は、Common Lisp と Emacs Lisp に違いがあって、衝突の可能性がある。なので、cl.el の禁止事項は、eval-when-compile でバイトコンパイル時にロードしてマクロを使う分には許可するが、Common Lisp の関数は使うな!ということらしい。つまり、(require 'cl) が禁止ということか?
本書は、(eval-when-compile (require 'cl)) ってやれば、Common Lisp のマクロを合法的に使えるとしている。ランタイムに cl.el のロードが禁止となれば関数は使えないが、コンパイル時に展開されるマクロならOKってか?ん~... 解釈の問題のような気もするが...
今となっては、Common Lisp に総入れ替えするわけにもいかないだろう。古い資産が誤動作しそうだし。Common Lisp と Emacs Lisp で、レキシカルスコープとダイナミックスコープの違いがあるのも、関数の変数をめぐって大きな問題となりそうだ。ならば、(require 'cl)を許可して、Common Lisp でオーバライドさせることを明示すれば良さそうな気もするが...
それはともかく、本書で紹介されるマクロは、なかなか便利そうである。リスト構造を分解して変数に代入する時、car, nth が冗長的なので、destructure-bind を使うとすっきりする。汎変数を使うと、代入の概念を拡張できる。setq は、その拡張版の setf が使える。汎変数には、car, nth といったリスト要素だけでなく、buffer-substring, point といったバッファ関連もあるようだ。
let/let* のレキシカルスコープ版は、lexical-let/lexical-let* があるという。ん~、これは微妙だなぁ!他には構造体が使えたり...
本書は、loop マクロをかなり丁寧に解説してくれる。こいつは、Common Lisp が提供するモンスターマクロだという。リストやベクタの要素の合計/最大値/最小値を与えたり、各要素に関数を適用したり、条件を満たす要素を抽出して演算を施したり... などの演算節が豊富で、統計情報を処理するのに強力なツールとなる。連想リストやハッシュテーブルのキーを求めたり、フィボナッチ数列を求めたりするのも、エレガントに書けるという。
また、非局所脱出メカニズムには二つあるという。Emacs Lisp 本来の catch/throw と Common Lisp の block/return-from。Common Lisp には block の概念があり、明示しなくても暗黙に block が形成される。この block がレキシカルスコープを実現している。block からは、return-from で脱出できる。一方、catch はダイナミックスコープの場合で、脱出時には、throw を呼び出す。cl.el のおかげで、Emacs Lisp でも block/return-from の仕掛けが使えるというわけか。
4. eshell のすゝめ
eshell は、Emacs Lisp で書かれているために、プラットフォームに依存しないという。zsh ライクで、使い勝手もよさそう。普通のシェルはC言語などで書かれているため、シェルスクリプトの範囲でしか拡張できないが、eshell はコマンド解釈の部分ですら乗っ取ることが可能で、コマンドラインを丸ごと zsh や Ruby に渡して実行することができるという。おぉ~...
2014-07-13
"実践 Common Lisp" Peter Seibel 著
本書を購入したのは、三年ぐらい前になろうか。時々横目で追い... 辞書代りにし... これを読破するには気が重い。ところが、改めて目を通してみると、意外とストーリー性があって、おもろいんでないかい!
それは、音楽ファイル(MP3)からタグ情報(ID3)を抽出し、曲情報をweb上で管理するという物語で、最終的に、曲の検索、プレイリストの追加、ストリーミングといった機能を備えるMP3ブラウザを作成することにある。
ここに含まれる技術要素は... 単語の頻度を調べるために、スパムフィルタでよく見かけるベイジアンフィルタを用いて学習する仕掛け。バイナリファイルのためのパーサの作成。リスト型言語らしいデータベースの構築。WebアプリケーションのためのWebサーバ(AllegroServe)の導入。HTMLライブラリの生成。ストリーミング再生のための、Shoutcastプロトコルの実装など...
実践と言うには、ちと話題がづれていそうだが、試してみると、なかなか役に立ちそうではないかい。もちろん、Common Lisp の処理系や、CLOS(Common Lisp Object System)といった話題も豊富!満腹すぎて吐きそうなほどに...
Lispは、FORTRANの時代を思い出させる言語で、その歴史は1950年代に遡る。だが、改良を重ね重ね、いまだ輝きを失っていない。オブジェクト指向の機能をもたらす CLOS は、もはや Common Lisp と分けて論じることができないほど馴染んでやがる。
今日のコンピューティングは、メモリ容量やCPU性能、あるいは、表示システムの高精細化や入力システムの操作性向上など、リソースは格段と進化している。プログラミングにおいても、ハードウェアをほとんど意識しなくて済み、本来の目的に傾注できる高水準言語が続々と登場する。おそらく万能な言語は存在しないだろうし、ドメイン固有言語という発想はますます広がるだろう。
そんな時代にあってもなお、Lisp が生き残ってこられたのは、言語自体に柔軟性があるのも確かであろうが、チューリング等価の記法という意味では、ソフトウェアはあまり進化していないのかもしれない。いずれにせよ、チューリングマシンが考案されて一世紀にも満たず、コンピューティングの歴史はいまだ過渡期にある。実際、新しい技術が品質やユーザビリティを落とすケースも珍しくないし、登場時期が早すぎたために廃れていくアイデアも少なくない。この手の書に触れる時は、新しいとか、古いとか、そうした意識は捨ててかかった方がよさそうである。引退間際の古代人には、なんでも真新しく映るけど...
Lisp信者は、こんなことを言う。Lispを学べば、もっとましなプログラマになれると。言語に対する思いは宗教的なところがあり、その座右の銘は禅問答に似たものがある。Lispの場合はこれだ。
「プログラム可能なプログラミング言語」
彼らは、マクロ機能の強力さをこわだかに話す。まるで万能言語であるかのように。だが、手続き型言語に慣れ親しんできた者にとっては、まるで宇宙人の文化だ。S式とかいうヘンテコな宣教師が、カッコカッコ... コッカコッカ... と呪文を唱えれば、カッコの奥から let とかいう控えめな教職者が lambda とかいう名もない浮浪者に見返り(返り値)をねだってやがる。実に、鬱陶しい奴らだ!
しかしながら、異質の言語に触れることにも意義がある。当たり前と思い込んでいる事でも、疑問を持つ機会を与えてくれる。最近、気に入っている感覚は、リスト型データ構造である。Lispが記号処理のために設計され、list processing を得意とすることは、その名が示している。
「リストは不均質で階層的なあらゆるデータを表すための格好のデータ構造だ。」
仕事では数学のアルゴリズムを検討することが多く、関数で多次元空間を記述する場合、返り値には多値を用いたい。例えば、C言語などの return変数は基本的に一つで、多値を返したければポインタ参照の形をとる。これが副作用の原因となりやすい。わざと副作用を利用することもあるので、一概に悪いとは言えないのだが。一方、リスト型データはもともと多値が想定されているので、そんな気遣いはいらない。尚、ここで言う「多値」とは、群論で言うところの集合体を意味し、論理学のそれとは意味が違うので注意されたし...
「関数プログラミングの真髄は、与えられた引数のみに依存して演算を行う副作用を持たない関数のみでプログラムを構成されることにある。」
本書は、リスト構造が柔軟であるがために、その弊害で、ユーザがリストに特化しすぎる傾向があると指摘している。そして、もっと効率的な方法として、コレクションの概念を用いたベクタやハッシュテーブルの事例を紹介してくれる。また、リスト型が複素数に対応してくれるのもありがたい。尚、今日では多くの言語で複素数型がサポートされている。C99ライブラリのように...
1. コレクションの概念
「リストを理解する手がかりは、そのほとんどがより基本的なデータ型のインスタンスであるオブジェクトの上に構築された幻想だと理解することにある。その単純なオブジェクトはコンスセルと呼ばれる値のペアであり、関数 CONS を呼び出すことによって作り出される。」
リスト型データ構造を効率的に用いる方法として、コレクションが紹介されるが、明確な違いがよく分からん!コレクションを操作する方法として、シーケンスというサブタイプがあるが、その多くはリストでも使えそうだし。ただ、シーケンスは非常に強力なために、リスト操作とは抽象度の違いを感じるのも確かで、コレクションという用語を新たに生み出すだけのことはありそうか。
例えば、ベクタでは...
固定サイズに vector関数、固定サイズと可変サイズの両方に make-array関数が用意される。要素の追加と削除には、vector-push, vector-pop があり、シーケンスのレベルでベクタとリストが区別されるかに見える。反復関数には、count, find, position, remove, substitute などがあり、これらの関数の末尾に、-if を付けて条件式として使える。count-if, find-if... といった具合に。
シーケンス全体の操作では、copy-seq, reverse、あるいは、連結に、concatenate がある。ソートには、sort, stable-sort。尚、stable- 述語で順番が入れ替わらないことを保証する。部分シーケンス操作には、subseq。尚、範囲は開始と終了インデックスで指定。他には、marge, search, mismatch など。
また、シーケンス述語に、every, some, notany, notevery がある。
複数のシーケンスに対して関数を施したい時は、map, map-into といったマッピング関数が使える。
また、一つのシーケンスに対しては、reduce が便利。
合計を求めるには...
(reduce #'+ #(1 2 3 4 5 6 7 8 9 10)) => 55
最大値を見つけるには...
(setf numbers '(10 12 14 16))
(reduce #'max numbers) => 16
キーワード引数には、:key, :from-end, :start, :end がある。
固有の引数には :initial-value があり、シーケンスの初期値が設定できる。
ハッシュテーブルでは...
生成に、make-hash-table。要素にアクセスするには、gethash。gethashに複数の返り値がある場合は、 multiple-value-bind マクロが用意される。
反復処理は、maphash でこんな感じ...
(maphash #'(lambda (k v) (format t "~a => ~a~%" k v)) *hash*)
2. 例外処理とコンディションシステム
Lispの偉大な機能の一つにコンディションシステムがあるという。Java や Python や C++ における例外処理と似た目的で提供されるが、もっと柔軟でエラー処理にとどまらないという。プログラムの実行中に起こる出来事を記述できるので、例外よりも汎用性が高いということらしい。例外処理においては、エラーの捕捉とその通知が鍵となるが、Lispでは更に再起動という機能が付加される。
ところで、エラー処理とは、なんであろうか?プログラムは関数の階層によって組み立てられる。低位の関数の上に高位の関数が構築されれば、実行中の実体はコールスタックという形で現れる。低位のプロセスは、高位のプロセスのコールスタック上にあるということだ。
したがって、エラーを捕捉する格好の場所は、関数の境界ということになろう。実際、低位と高位の依存関係において問題が発生しやすい。例えば、呼び先のファイルが存在しないとか、メモリの空き容量が足りないとか、ネットワークが落ちているといった原因で。関数単体から見て、想定外の条件への対処とも言えよう。一方で、関数内で起こるエラーはそれこそバグであり、ここで扱う問題ではない。
例外機構を備えていないシステムでは、エラー通知は関数の呼び出し元に送ることになろうか。そして、復帰のための処理をするか、失敗を放置するかは、呼び出し元が決定することになる。単純にスキップするだけで何事も起こらなければいいが、現実はそう甘くない。
しかし、例外機構が具わっていれば、コンディションを監視することによって、何らかの対処をシステムレベルで可能にする。復帰処理において、スタックを巻き戻して関数の再起動を試みたり、保険処理のようなものも定義できそうだ。ただ、あくまでも想定外の条件に対処するわけで、却って仇となることもあろう。
Common Lispでは、エラーを回復するコードと、どうやって回復するかを決めるコードが分離されているという。戦略的には、どうやって回復するかは高位の関数に委ね、回復のためのコードを低位の関数に記述できるという仕掛けか。しかも、コンディションは一般オブジェクトと同等な扱いで定義できるようである。再起動によって効果をもたらすには、明確にコードを呼びださなければなるまい。復帰条件も異なろうが、複数の再起動が定義できるようである。コンディションハンドラは、警告をエラーに昇格させることも、その逆もできそうだ。
通知の基本関数は、signal 。なんとなく馴染みのある名前だ。これだけでプログラムのコンディションというよりは、システムコールレベルを想定していることが分かる。コンディションを理解する鍵は、コンディションを通知しただけでは制御フローに影響しないことを理解することだという。
「エラー処理には、プログラミングの教科書であっさりとしか説明されないという残念な宿命がある。エラー処理が適切かどうかは、解説用のコードと製品レベルの品質コードの最も大きな違いだといえる。後者を書くコツは、特定のプログラミング言語の構文の詳細ではなく、ソフトウェアについて特別な厳しい考え方を身につけることにある。」
ただ、あまり柔軟すぎると例外処理と通常処理の境界が曖昧になりそうだ。最もコードのセンスが問われるところでもあろうか。いずれにせよ、最悪の場合、リセットすべきか?再起動すべきか?あるいは、他の処理をすべきか?それはシステムによっても違ってくるし、ソフトウェアだけの問題ではない。
ちなみに、某原発事故では、あろうことか!電源を供給する電力会社が、電源を失うことを想定していなかったと平然と語られた。多くのシステム屋さんにとって、戒めの言葉に聞こえたことだろう...
3. loopマクロ
「皮肉なことだが、マクロを正確に理解する最大の障壁は、おそらくマクロがあまりにうまく言語に統合されてしまっていることにある。」
Lispを使っていると、まずもって不思議な感覚に見舞われるのは、マクロと関数の違いが曖昧にさせられることである。引数も取れば、値も返すし、ちょっと風変わりな関数にしか見えない。だが、実装は全く違う。マクロは単純に展開されるだけに、ローカル変数の束縛で悩ましい。だが、変数名が重複しないように、with-gensyms が用意される。
関数は言語の構文に従うが、マクロはそんな制約を受けないと言えばそうだが。あるいは、マクロはある種の翻訳機とも言えるわけだが...
「言語を"コアに標準ライブラリを追加したもの"と定義する利点のひとつに、理解や実装が容易になることがある。しかし本当のメリットは、言語が容易に拡張できる表現力にある。なにせ、言語だと思っているものの大半はただのライブラリなのだ。」
この感覚を味わうには、loopマクロがうってつけである。ループ構文には、do, dolist, dotimes とったものがある。ただ、これらの表現力は大げさ過ぎる。Lispで書かれていながら、using などの副節でカッコが省略されるところは、実にLispらしくない。
「なぜ LOOP の作者がこの副節で括弧なしスタイルに怖気づいたのか、私に訊かないでほしい。」
loopマクロの主な機能部品は、ざっとこんな感じ...
おまけに、前処理(initially)と後処理(finally)の節を用いて、ループの前後に任意の処理が指定できる。このあたりの実装は、unix上で動く awk の思想を感じる。
4. format関数
「Common Lisp の FORMAT関数は、LOOPマクロと並んで人々を感情的にさせる機能だ。信者もいればアンチもいる。」
format関数の複雑な制御文字は、電話のノイズに似ているという。確かに、printf風でありながらまったく違うし、正規表現とも違う。短く書けることが最善とするならば、あらゆる文書は暗号文となろう。いや、呪文か!
ただ、暗号ってやつは、解き明かせば恐れるに足らん。まず、すべての指示子は、~(チルダ)で始まる。指示子によっては、前置パラメータをとる場合がある。前置パラメータは、チルダのすぐ後に書き、複数ある場合はコンマで区切る。最も汎用な指示子は、~a で、人間の読める形に出力する。これだけ押さえれば、大概のことは解読できそうである。
改行を出力するには、~%。新しい行を出力するには、~&。尚、~% は常に改行するのに対して、~&は行頭でないときのみ改行する。
(format t "~a~%" list)
(format t "~5$" pi) => 3.14159 ($ は小数点表示、デフォルトは2桁)
(format t "~d" 1000000) => 1000000 (d は10進数表示、他に、~x, ~o, ~b がある)
(format t "~@d" 1000000) => +1000000 (符号付き)
(format t "~:d" 1000000) => 1,000,000 (3桁ごとに区切る)
(format t "$~:d" 1000000) => $1,000,000 (通貨単位ドル)
条件による整形には...
~[, ~] で囲んで、条件分岐を指示する。
(format t "~[cero~;uno~;dos~]" 1) => uno (~; で区切ってインデックスで指定)
~{, ~} で囲んで、反復を指示する。
(format t "~{~a, ~}" (list 1 2 3)) => 1, 2, 3,
最も驚かされるのは英文制御が凝っていることだ。使うかどうかは別にして...
~r は、英語の指示子。
(format t "~r" 1234) => one thousand, two hundred and thirty-four
(format t "~@r" 1234) => MCCXXXIV (@ はローマ数字)
(format t "~:@r" 1234) => MCCXXXIIII (:@ は古いローマ数字)
単数形と複数形の制御に、~p を用いると、複数形の時、sを付加する。
(format t "~r file~:p" 1) => one file
(format t "~r file~:p" 10) => ten files
さらに、@ は単数形の時 y、複数形の時 ies を付加する。
(format t "~r famil~:@p" 1) => one family
(format t "~r famil~:@p" 10) => ten families
大文字と小文字制御では、~(, ~) で囲んで、その間の制御文字列を小文字で出力する。
@ は文字列の最初の文字が大文字。: はすべての単語の頭が大文字。両方つけると、すべて大文字。
(format t "~(~a~)" "THE QUICK BROWN FOX") => the quick brown fox
(format t "~@(~a~)" "THE QUICK BROWN FOX") => The quick brown fox
(format t "~:(~a~)" "THE QUICK BROWN FOX") => The Quick Brown Fox
(format t "~:@(~a~)" "THE QUICK BROWN FOX") => THE QUICK BROWN FOX
5. Lisp in a BOX
REPL(read-eval-print loop)とは、読み取り(read)、評価(evaluate)、印字(print)の終りのないサイクル、すなわち、対話式機構のこと。この環境を手っ取り早く提供してくれるものに、「Lisp in a BOX」というものがあるそうな。それは、Emacsと Common Lisp開発環境 SLIME をパッケージ化したものだという。elispにはかなり方言があるようで、やはり SLIME がよさそうである。Emacs風のIDEといったところか...
6. AllegroServe
最近のブラウザは余計な機能が多すぎる。核となる機能は、Webサーバからページをリクエストし、それをレンダリングすること、これだけでもかなり遊べる。
仕事では、ドキュメント関連を、XMLで書け!って要求されることがある。閲覧するだけなら pdf でもよかろうが、検索機能や入力フォームなどが欲しいというわけだ。そのくせ向こうからは、word や excel の文書が提供されるけど。この手の自動生成ツールは、スペックが大げさで、しかもろくなコードを吐かない。結局、機能を限定したXML生成ライブラリを書く羽目に...
そこで、コードのテスト用に、簡易的なサーバが立ち上げられるとありがたい。本書は、そんな時にうってつけのWebサーバを紹介してくれる。AllegroServe と PortableAllegroServe だ。Rubyで言うところの、WEBrick のようなものか。ちなみに、Hunchentoot ってのもよさそう。
パッケージを導入するには...
Allegro Common LIsp ならば、AllegroServe に対して、require する。
(require :aserve)
他のLispシステムでは、PortableAllegroServe に対して、require の代りに loadする。
(load "./portableaserve/INSTALL.lisp")
localhostサーバを定義するには...(例えば、ポート2001の時)
(net.aserve:start :port 2001)
ファイルやディレクトリを公開するには...
(publish-file :path "/hello.html" :file "/tmp/html/hello.html")
(publish-directory :prefix "/" :destination "/tmp/html/")
後はブラウザで、http://localhost:2001/hello.html にアクセスすればいい。
それは、音楽ファイル(MP3)からタグ情報(ID3)を抽出し、曲情報をweb上で管理するという物語で、最終的に、曲の検索、プレイリストの追加、ストリーミングといった機能を備えるMP3ブラウザを作成することにある。
ここに含まれる技術要素は... 単語の頻度を調べるために、スパムフィルタでよく見かけるベイジアンフィルタを用いて学習する仕掛け。バイナリファイルのためのパーサの作成。リスト型言語らしいデータベースの構築。WebアプリケーションのためのWebサーバ(AllegroServe)の導入。HTMLライブラリの生成。ストリーミング再生のための、Shoutcastプロトコルの実装など...
実践と言うには、ちと話題がづれていそうだが、試してみると、なかなか役に立ちそうではないかい。もちろん、Common Lisp の処理系や、CLOS(Common Lisp Object System)といった話題も豊富!満腹すぎて吐きそうなほどに...
Lispは、FORTRANの時代を思い出させる言語で、その歴史は1950年代に遡る。だが、改良を重ね重ね、いまだ輝きを失っていない。オブジェクト指向の機能をもたらす CLOS は、もはや Common Lisp と分けて論じることができないほど馴染んでやがる。
今日のコンピューティングは、メモリ容量やCPU性能、あるいは、表示システムの高精細化や入力システムの操作性向上など、リソースは格段と進化している。プログラミングにおいても、ハードウェアをほとんど意識しなくて済み、本来の目的に傾注できる高水準言語が続々と登場する。おそらく万能な言語は存在しないだろうし、ドメイン固有言語という発想はますます広がるだろう。
そんな時代にあってもなお、Lisp が生き残ってこられたのは、言語自体に柔軟性があるのも確かであろうが、チューリング等価の記法という意味では、ソフトウェアはあまり進化していないのかもしれない。いずれにせよ、チューリングマシンが考案されて一世紀にも満たず、コンピューティングの歴史はいまだ過渡期にある。実際、新しい技術が品質やユーザビリティを落とすケースも珍しくないし、登場時期が早すぎたために廃れていくアイデアも少なくない。この手の書に触れる時は、新しいとか、古いとか、そうした意識は捨ててかかった方がよさそうである。引退間際の古代人には、なんでも真新しく映るけど...
Lisp信者は、こんなことを言う。Lispを学べば、もっとましなプログラマになれると。言語に対する思いは宗教的なところがあり、その座右の銘は禅問答に似たものがある。Lispの場合はこれだ。
「プログラム可能なプログラミング言語」
彼らは、マクロ機能の強力さをこわだかに話す。まるで万能言語であるかのように。だが、手続き型言語に慣れ親しんできた者にとっては、まるで宇宙人の文化だ。S式とかいうヘンテコな宣教師が、カッコカッコ... コッカコッカ... と呪文を唱えれば、カッコの奥から let とかいう控えめな教職者が lambda とかいう名もない浮浪者に見返り(返り値)をねだってやがる。実に、鬱陶しい奴らだ!
しかしながら、異質の言語に触れることにも意義がある。当たり前と思い込んでいる事でも、疑問を持つ機会を与えてくれる。最近、気に入っている感覚は、リスト型データ構造である。Lispが記号処理のために設計され、list processing を得意とすることは、その名が示している。
「リストは不均質で階層的なあらゆるデータを表すための格好のデータ構造だ。」
仕事では数学のアルゴリズムを検討することが多く、関数で多次元空間を記述する場合、返り値には多値を用いたい。例えば、C言語などの return変数は基本的に一つで、多値を返したければポインタ参照の形をとる。これが副作用の原因となりやすい。わざと副作用を利用することもあるので、一概に悪いとは言えないのだが。一方、リスト型データはもともと多値が想定されているので、そんな気遣いはいらない。尚、ここで言う「多値」とは、群論で言うところの集合体を意味し、論理学のそれとは意味が違うので注意されたし...
「関数プログラミングの真髄は、与えられた引数のみに依存して演算を行う副作用を持たない関数のみでプログラムを構成されることにある。」
本書は、リスト構造が柔軟であるがために、その弊害で、ユーザがリストに特化しすぎる傾向があると指摘している。そして、もっと効率的な方法として、コレクションの概念を用いたベクタやハッシュテーブルの事例を紹介してくれる。また、リスト型が複素数に対応してくれるのもありがたい。尚、今日では多くの言語で複素数型がサポートされている。C99ライブラリのように...
1. コレクションの概念
「リストを理解する手がかりは、そのほとんどがより基本的なデータ型のインスタンスであるオブジェクトの上に構築された幻想だと理解することにある。その単純なオブジェクトはコンスセルと呼ばれる値のペアであり、関数 CONS を呼び出すことによって作り出される。」
リスト型データ構造を効率的に用いる方法として、コレクションが紹介されるが、明確な違いがよく分からん!コレクションを操作する方法として、シーケンスというサブタイプがあるが、その多くはリストでも使えそうだし。ただ、シーケンスは非常に強力なために、リスト操作とは抽象度の違いを感じるのも確かで、コレクションという用語を新たに生み出すだけのことはありそうか。
例えば、ベクタでは...
固定サイズに vector関数、固定サイズと可変サイズの両方に make-array関数が用意される。要素の追加と削除には、vector-push, vector-pop があり、シーケンスのレベルでベクタとリストが区別されるかに見える。反復関数には、count, find, position, remove, substitute などがあり、これらの関数の末尾に、-if を付けて条件式として使える。count-if, find-if... といった具合に。
シーケンス全体の操作では、copy-seq, reverse、あるいは、連結に、concatenate がある。ソートには、sort, stable-sort。尚、stable- 述語で順番が入れ替わらないことを保証する。部分シーケンス操作には、subseq。尚、範囲は開始と終了インデックスで指定。他には、marge, search, mismatch など。
また、シーケンス述語に、every, some, notany, notevery がある。
every : すべての述語が満たされれば t、それ以外 nil。 some : 1つでも満たすものがあれば t、すべて満たさないとき nil。 notany : 1つでも満たされれば nil、1つも満たさない場合 t。 notevery : 1つでも満たされれば t、1つも満たされない場合 nil。
複数のシーケンスに対して関数を施したい時は、map, map-into といったマッピング関数が使える。
また、一つのシーケンスに対しては、reduce が便利。
合計を求めるには...
(reduce #'+ #(1 2 3 4 5 6 7 8 9 10)) => 55
最大値を見つけるには...
(setf numbers '(10 12 14 16))
(reduce #'max numbers) => 16
キーワード引数には、:key, :from-end, :start, :end がある。
固有の引数には :initial-value があり、シーケンスの初期値が設定できる。
ハッシュテーブルでは...
生成に、make-hash-table。要素にアクセスするには、gethash。gethashに複数の返り値がある場合は、 multiple-value-bind マクロが用意される。
反復処理は、maphash でこんな感じ...
(maphash #'(lambda (k v) (format t "~a => ~a~%" k v)) *hash*)
2. 例外処理とコンディションシステム
Lispの偉大な機能の一つにコンディションシステムがあるという。Java や Python や C++ における例外処理と似た目的で提供されるが、もっと柔軟でエラー処理にとどまらないという。プログラムの実行中に起こる出来事を記述できるので、例外よりも汎用性が高いということらしい。例外処理においては、エラーの捕捉とその通知が鍵となるが、Lispでは更に再起動という機能が付加される。
ところで、エラー処理とは、なんであろうか?プログラムは関数の階層によって組み立てられる。低位の関数の上に高位の関数が構築されれば、実行中の実体はコールスタックという形で現れる。低位のプロセスは、高位のプロセスのコールスタック上にあるということだ。
したがって、エラーを捕捉する格好の場所は、関数の境界ということになろう。実際、低位と高位の依存関係において問題が発生しやすい。例えば、呼び先のファイルが存在しないとか、メモリの空き容量が足りないとか、ネットワークが落ちているといった原因で。関数単体から見て、想定外の条件への対処とも言えよう。一方で、関数内で起こるエラーはそれこそバグであり、ここで扱う問題ではない。
例外機構を備えていないシステムでは、エラー通知は関数の呼び出し元に送ることになろうか。そして、復帰のための処理をするか、失敗を放置するかは、呼び出し元が決定することになる。単純にスキップするだけで何事も起こらなければいいが、現実はそう甘くない。
しかし、例外機構が具わっていれば、コンディションを監視することによって、何らかの対処をシステムレベルで可能にする。復帰処理において、スタックを巻き戻して関数の再起動を試みたり、保険処理のようなものも定義できそうだ。ただ、あくまでも想定外の条件に対処するわけで、却って仇となることもあろう。
Common Lispでは、エラーを回復するコードと、どうやって回復するかを決めるコードが分離されているという。戦略的には、どうやって回復するかは高位の関数に委ね、回復のためのコードを低位の関数に記述できるという仕掛けか。しかも、コンディションは一般オブジェクトと同等な扱いで定義できるようである。再起動によって効果をもたらすには、明確にコードを呼びださなければなるまい。復帰条件も異なろうが、複数の再起動が定義できるようである。コンディションハンドラは、警告をエラーに昇格させることも、その逆もできそうだ。
通知の基本関数は、signal 。なんとなく馴染みのある名前だ。これだけでプログラムのコンディションというよりは、システムコールレベルを想定していることが分かる。コンディションを理解する鍵は、コンディションを通知しただけでは制御フローに影響しないことを理解することだという。
「エラー処理には、プログラミングの教科書であっさりとしか説明されないという残念な宿命がある。エラー処理が適切かどうかは、解説用のコードと製品レベルの品質コードの最も大きな違いだといえる。後者を書くコツは、特定のプログラミング言語の構文の詳細ではなく、ソフトウェアについて特別な厳しい考え方を身につけることにある。」
ただ、あまり柔軟すぎると例外処理と通常処理の境界が曖昧になりそうだ。最もコードのセンスが問われるところでもあろうか。いずれにせよ、最悪の場合、リセットすべきか?再起動すべきか?あるいは、他の処理をすべきか?それはシステムによっても違ってくるし、ソフトウェアだけの問題ではない。
ちなみに、某原発事故では、あろうことか!電源を供給する電力会社が、電源を失うことを想定していなかったと平然と語られた。多くのシステム屋さんにとって、戒めの言葉に聞こえたことだろう...
3. loopマクロ
「皮肉なことだが、マクロを正確に理解する最大の障壁は、おそらくマクロがあまりにうまく言語に統合されてしまっていることにある。」
Lispを使っていると、まずもって不思議な感覚に見舞われるのは、マクロと関数の違いが曖昧にさせられることである。引数も取れば、値も返すし、ちょっと風変わりな関数にしか見えない。だが、実装は全く違う。マクロは単純に展開されるだけに、ローカル変数の束縛で悩ましい。だが、変数名が重複しないように、with-gensyms が用意される。
関数は言語の構文に従うが、マクロはそんな制約を受けないと言えばそうだが。あるいは、マクロはある種の翻訳機とも言えるわけだが...
「言語を"コアに標準ライブラリを追加したもの"と定義する利点のひとつに、理解や実装が容易になることがある。しかし本当のメリットは、言語が容易に拡張できる表現力にある。なにせ、言語だと思っているものの大半はただのライブラリなのだ。」
この感覚を味わうには、loopマクロがうってつけである。ループ構文には、do, dolist, dotimes とったものがある。ただ、これらの表現力は大げさ過ぎる。Lispで書かれていながら、using などの副節でカッコが省略されるところは、実にLispらしくない。
「なぜ LOOP の作者がこの副節で括弧なしスタイルに怖気づいたのか、私に訊かないでほしい。」
loopマクロの主な機能部品は、ざっとこんな感じ...
- ローカル変数の生成とループ変数の自動更新。
- 値の収集(collect)、計数(count)、合計(sum)、最小化(minimaize)、最大化(maxmize)。
- 任意のLisp式の実行。
- 条件付き終了。
おまけに、前処理(initially)と後処理(finally)の節を用いて、ループの前後に任意の処理が指定できる。このあたりの実装は、unix上で動く awk の思想を感じる。
4. format関数
「Common Lisp の FORMAT関数は、LOOPマクロと並んで人々を感情的にさせる機能だ。信者もいればアンチもいる。」
format関数の複雑な制御文字は、電話のノイズに似ているという。確かに、printf風でありながらまったく違うし、正規表現とも違う。短く書けることが最善とするならば、あらゆる文書は暗号文となろう。いや、呪文か!
ただ、暗号ってやつは、解き明かせば恐れるに足らん。まず、すべての指示子は、~(チルダ)で始まる。指示子によっては、前置パラメータをとる場合がある。前置パラメータは、チルダのすぐ後に書き、複数ある場合はコンマで区切る。最も汎用な指示子は、~a で、人間の読める形に出力する。これだけ押さえれば、大概のことは解読できそうである。
改行を出力するには、~%。新しい行を出力するには、~&。尚、~% は常に改行するのに対して、~&は行頭でないときのみ改行する。
(format t "~a~%" list)
(format t "~5$" pi) => 3.14159 ($ は小数点表示、デフォルトは2桁)
(format t "~d" 1000000) => 1000000 (d は10進数表示、他に、~x, ~o, ~b がある)
(format t "~@d" 1000000) => +1000000 (符号付き)
(format t "~:d" 1000000) => 1,000,000 (3桁ごとに区切る)
(format t "$~:d" 1000000) => $1,000,000 (通貨単位ドル)
条件による整形には...
~[, ~] で囲んで、条件分岐を指示する。
(format t "~[cero~;uno~;dos~]" 1) => uno (~; で区切ってインデックスで指定)
~{, ~} で囲んで、反復を指示する。
(format t "~{~a, ~}" (list 1 2 3)) => 1, 2, 3,
最も驚かされるのは英文制御が凝っていることだ。使うかどうかは別にして...
~r は、英語の指示子。
(format t "~r" 1234) => one thousand, two hundred and thirty-four
(format t "~@r" 1234) => MCCXXXIV (@ はローマ数字)
(format t "~:@r" 1234) => MCCXXXIIII (:@ は古いローマ数字)
単数形と複数形の制御に、~p を用いると、複数形の時、sを付加する。
(format t "~r file~:p" 1) => one file
(format t "~r file~:p" 10) => ten files
さらに、@ は単数形の時 y、複数形の時 ies を付加する。
(format t "~r famil~:@p" 1) => one family
(format t "~r famil~:@p" 10) => ten families
大文字と小文字制御では、~(, ~) で囲んで、その間の制御文字列を小文字で出力する。
@ は文字列の最初の文字が大文字。: はすべての単語の頭が大文字。両方つけると、すべて大文字。
(format t "~(~a~)" "THE QUICK BROWN FOX") => the quick brown fox
(format t "~@(~a~)" "THE QUICK BROWN FOX") => The quick brown fox
(format t "~:(~a~)" "THE QUICK BROWN FOX") => The Quick Brown Fox
(format t "~:@(~a~)" "THE QUICK BROWN FOX") => THE QUICK BROWN FOX
5. Lisp in a BOX
REPL(read-eval-print loop)とは、読み取り(read)、評価(evaluate)、印字(print)の終りのないサイクル、すなわち、対話式機構のこと。この環境を手っ取り早く提供してくれるものに、「Lisp in a BOX」というものがあるそうな。それは、Emacsと Common Lisp開発環境 SLIME をパッケージ化したものだという。elispにはかなり方言があるようで、やはり SLIME がよさそうである。Emacs風のIDEといったところか...
6. AllegroServe
最近のブラウザは余計な機能が多すぎる。核となる機能は、Webサーバからページをリクエストし、それをレンダリングすること、これだけでもかなり遊べる。
仕事では、ドキュメント関連を、XMLで書け!って要求されることがある。閲覧するだけなら pdf でもよかろうが、検索機能や入力フォームなどが欲しいというわけだ。そのくせ向こうからは、word や excel の文書が提供されるけど。この手の自動生成ツールは、スペックが大げさで、しかもろくなコードを吐かない。結局、機能を限定したXML生成ライブラリを書く羽目に...
そこで、コードのテスト用に、簡易的なサーバが立ち上げられるとありがたい。本書は、そんな時にうってつけのWebサーバを紹介してくれる。AllegroServe と PortableAllegroServe だ。Rubyで言うところの、WEBrick のようなものか。ちなみに、Hunchentoot ってのもよさそう。
パッケージを導入するには...
Allegro Common LIsp ならば、AllegroServe に対して、require する。
(require :aserve)
他のLispシステムでは、PortableAllegroServe に対して、require の代りに loadする。
(load "./portableaserve/INSTALL.lisp")
localhostサーバを定義するには...(例えば、ポート2001の時)
(net.aserve:start :port 2001)
ファイルやディレクトリを公開するには...
(publish-file :path "/hello.html" :file "/tmp/html/hello.html")
(publish-directory :prefix "/" :destination "/tmp/html/")
後はブラウザで、http://localhost:2001/hello.html にアクセスすればいい。
登録:
投稿 (Atom)



