SSブログ
思想と科学 ブログトップ

Windows 上の VirtualBox で実パーティション上の Linux を起動する [思想と科学]

新しい PC を買ってしまったせいで色々とセットアップをしている。引越し前だというのに。テスト前になると無性に掃除がしたくなるあの感覚と同じだな。
VirtualBox を使ってちょっと面白いセットアップをしてみたので、備忘録もかねてやり方を残しておく。そういえばこの手の技術(?)ネタって初めてかもね。実はエンジニアだったんですねワタクシ。

PC は Windows/Linux(Ubuntu) のデュアルブートにしているのだが、Windows で立ち上げている時にちょこっと Linux を使いたい場合がある。たとえば wget でバッチ的にファイルを落としたい場合なんかはシェルスクリプトを使いたい。あとはちょっとカーネルコンパイルしたい時とか(笑)。そんなときは仮想環境を使いたいわけだが、普通に Windows 上に仮想ディスクを作って Linux システムをインストールすると、既に Linux システム が入っているパーティションと Windows のディスク上の二箇所に似たようなシステムが存在することになってディスクの無駄遣いだ。ちょっと気の利いたスクリプトを書いて悦に入り、後日使おうと思ったらこっちのシステムにはコピーしてなかった、などという自分のアホさ加減を思い知らされる事態もできるだけ避けたい。
この課題をクリアするためには、Linux システム の入っている実パーティションを仮想マシンが rootfs としてマウントできればよい。VirtualBox にはその機能がある。すばらしい。

なお、Linux システムをネイティブで立ち上げて KVM で Windows を動かせば良いのでは?という意見も当然あるが、今回は二つの理由でそのアプローチを取らない。
理由1: Windows 上で使っている DTM ソフト(最近は DAW って言うのかな?)が結構マシンパワーを食うので、ネイティブ環境で実行したい。
理由2: 理由1により、Windows が入ったパーティションは残す必要がある。システムの二重化を防ぐためにはこのパーティションを仮想化環境から使うことになるが、Windows はハードウェアプラットフォームの違いに敏感なので、ネイティブ環境と仮想化環境で同じシステム(ディスクの内容)で実行できるか確信が持てない(そもそもアクティベーションし直しになるような)。Linux システムはその辺寛容で、多少ハードウェア構成が違っても適宜ドライバをロードして難なく走る。
(その昔、全然構成が違うマシンに HD を差し替えてブートしたら少々文句を言いつつも立ち上がってきて驚いたことがある)

VirtualBox で実パーティションを使う方法はマニュアルや、Web にもいろんなところに書かれているので要点だけ書いておく。

今回使用するディスクのパーティション構成は以下の通り。実ディスクは Grub2 を MBR に入れてブート選択を行っている。Grub の選択メニューを見ると、Linux システムは当然パーティション 6 から立ち上げるのだが、Windows はパーティション 2 から立ち上げて、パーティション 3 を C: として使うようだ。このパーティション 3 の Windows 上で VirtualBox を実行して、パーティション 6 の Linux システムを仮想マシンとして起動するのが今回の目的。
  • 1 (/dev/sda1): Recovery partition
  • 2 (/dev/sda2): Windows system reserved
  • 3 (/dev/sda3): Windows system (C:)
  • 4 (/dev/sda4): (Extended partition)
  • 5 (/dev/sda5): Windows data (D:)
  • 6 (/dev/sda6): Linux rootfs
  • 7 (/dev/sda7): Linux swap

VirtualBox から実パーティションを使う場合は、実ディスクのパーティション情報などを収めた仮想ディスク(ホスト上のファイル)を作成し、この仮想ディスクを仮想マシンのストレージとして割り当てる。仮想マシンで Linux システムを起動するためには仮想ディスクの MBR に Grub を入れる必要がある。そのためまずネイティブの Linux を立ち上げて、MBR をファイルとして保存する。
# dd if=/dev/sda of=sda.mbr bs=512 count=1


このファイルを Windows に持ってきてから、VirtualBox のコマンドで仮想ディスクを作成する。DOS 窓は管理者権限で実行すること。そうしないとディスクの作成に失敗する。
C:\Program Files\Oracle\VirtualBox>VBoxManage.exe internalcommands createrawvmdk
 -filename d:\virtualbox\raw_sda_ubuntu.vmdk -rawdisk \\.\PhysicalDrive0 -partit
ions 6,7 -mbr sda.mbr


これで実ディスクを反映した仮想ディスク raw_sda_ubuntu.vmdk が作成される。なお、仮想化環境からは Linux システム以外の実パーティションを触ってほしくない(というか、触られると壊れる)ので、パーティション 6 と 7 のみアクセス可能となるよう -partitions オプションを指定した。

さて、あとは仮想マシンを作成して raw_sda_ubuntu.vmdk をストレージとして割り当てれば、sda6 を rootfs として、つまりネイティブ起動時と全く同じ環境で Linux システムが立ち上がる。
めでたしめでたし。

・・・といいたいところだが、ここで問題、というか気に入らない点がひとつ。
当然ながら、Grub の設定ファイル(/boot/grub/grub.cfg)もネイティブ環境と仮想化環境で共有している。そのため Windows も Grub メニューに出てくるのだが、仮想化環境では必要ない。(Windows パーティションは中身を見せないように仮想ディスクを作ったので無意味)

ここからが今回の工夫どころ。この点を解決するため、/boot 用の仮想ディスクを作って VirtualBox ではここからブートするようにする。手順は以下。

  • VirtualBox の仮想メディアマネージャで仮想ハードディスクを作る。/boot なので 200MB もあれば足りるだろう。ここでは vb_boot.vdi として作成する。
  • 仮想マシンに vb_boot.vdi をストレージとして割り当てた後起動する。
  • vb_boot.vdi は /dev/sdb とかで見えているはず。(そのあたりは dmesg で確認) fdisk でパーティションの作成と mkfs.ext4 などでファイルシステムの作成(フォーマット)を行う。以降、こいつを「仮想環境用 /boot」と呼ぶ。
  • 仮想環境用 /boot ををマウントする。以下は ext4 でフォーマットした /dev/sdb1 を /boot_vb にマウントする例。
    # mount -t ext4 /dev/sdb1 /boot_vb
    
  • /boot の内容を仮想環境用 /boot にコピーする。
    # cd /boot
    # cp -a * /boot_vb
    
  • /etc/default/grub をお好みで書き換える。目的のためには GRUB_DISABLE_OS_PROBER=true なのだが、実は仮想化環境の Linux システムからは Windows システムが見えないように仮想ディスクを作成しているので、この書き換えはしなくても grub.cfg に Windows 用のエントリは作られない。今回はリカバリ用のエントリを消すため GRUB_DISABLE_LINUX_RECOVERY=true を指定したのと、Memory Test がうざいので /etc/grub.d/20_memtest86+ の実行属性を落としてエントリが作成されないようにした。
  • この後の二つの作業のため、仮想環境用 /boot を /boot にマウントし直す。/boot_vb にマウントしたままでも二重にマウントできるが、気持ち悪ければアンマウントしてからマウントする。
    # umount /boot_vb
    # mount -t ext4 /dev/sdb1 /boot
    
  • /dev/sda の MBR に Grub をインストールする。
    # grub-install /dev/sda
    
    これで /dev/sda の MBR にいる Grub は(仮想環境用 /boot):grub/grub.cfg を読み込むようになる。
  • /boot/grub/grub.cfg(今は仮想環境用 /boot の grub.cfg)を以下のコマンドで書き換える。
    # update-grub
    

これで OK。実マシンを起動する場合は Grub のメニューエントリに Windows, Linux の両方が表示されて選択可能だが、仮想マシンを起動した場合は Ubuntu しか出てこない。

だがしかーし!この方法にも以下の問題がある。
  • 仮想化環境でカーネルをアップデートすると、ネイティブ環境で立ち上げたときの Grub エントリからも Windos 用のエントリが消えてしまう。 仮想化環境では Windows 用パーティションが見えないので、/etc/grub.d/30_os-prober が Windows を見つけられないのだね。Linux システムを立ち上げることはできるので、ネイティブ環境で立ち上げて update-grub すれば直るけど・・・
  • 一方、ネイティブ環境でカーネルをアップデートした場合は、仮想環境用 /boot にそれが反映されない。ネイティブ環境では仮想ディスクなんて見えるわけないから当然だが。

これらは今のところしゃーないか、という感じ。カーネルをアップデートしたら、アップデート時と反対の環境への /boot のコピーと update-grub を忘れずに実行するってのが現状できることかな。
せめてもということで、仮想化環境で update-grub する手間を省力化するスクリプトを作っておいた。dmidecode で仮想化環境かどうか調べて、仮想化環境なら仮想環境用 /boot をマウント、実ディスク /boot と仮想環境用 /boot を同期、/etc/default/grub を書き換えて grub.cfg を生成、全部終わったら /etc/default/grub を元に戻すというもの。
/etc/kernel/postinst.d から実行して、ネイティブ環境と仮想化環境の grub.cfg を同時にうまいこと書き換えられるといいんだけど・・・今後の課題とします。

scrshot.jpg
んでお約束のスクリーンショット。VirtualBox はシームレスモードにしてあるので、Windows と Ubuntu のウィンドゥが混在している・・・だけならまだしも、Windows のタスクバーと GNOME のメニューバーが二列に並んでエラいことになってるなオイ。
右側の WikiPedia を出してる Chrome が Windows 上で、左側のターミナルと Ubuntu のページを出してる FireFox が Ubuntu 上で実行されている。ネットワークは NAT モードでつながるし、ホストの指定したディレクトリをゲストでマウントして共有できる、クリップボードが共有されているなど、なかなか便利。(便利機能はゲストに Guest Additions をインストールする必要あり)

続いてこちらもお決まりのベンチマーク結果。世界標準のベンチマークソフト「Linux カーネルコンパイル」で時間を計ってみた。ネイティブ環境と仮想化環境でかなり条件が違うので、参考程度に。

測定環境
  • CPU
    • Core i7 M620 (2.67GHz)
    • ネイティブ環境 ...2 cores, 4 threads
    • 仮想化環境 ... 2 cores, 2 threads
  • メモリ
    • ネイティブ環境 ... 8GB
    • 仮想化環境 ... 2GB
  • 仮想化設定
    • VT-x 有効
    • ネステッドページング 有効
  • ソフトウェア
    • ホスト ... Windows7 64bit
    • ゲスト ... Ubuntu 10.04 (kernel 2.6.32-24)
  • コンパイル対象: linux-2.6.35.5


時間かかるので、make allnoconfig; time make した結果を載せます(笑)。
「キャッシュ捨てる」と書いたのは make 前に echo 3 > /proc/sys/vm/drop_caches でページキャッシュを捨てた場合、「キャッシュ捨てない」は一旦コンパイルが終わった後に make mrproper; make allnoconfig してすぐまた make した場合です

測定結果
  • 仮想化環境
    • make: キャッシュ捨てる
      • real 2m14.481s
      • user 1m33.500s
      • sys 0m18.800s
    • make -j2: キャッシュ捨てる
      • real 1m32.091s
      • user 1m55.390s
      • sys 0m16.560s
    • make -j2: キャッシュ捨てない
      • real 1m11.100s
      • user 1m56.450s
      • sys 0m16.560s


  • ネイティブ環境
    • make: キャッシュ捨てる
      • real 2m8.108s
      • user 1m32.300s
      • sys 0m11.550s
    • make -j2: キャッシュ捨てる
      • real 1m21.167s
      • user 1m55.970s
      • sys 0m13.400s
    • make -j2: キャッシュ捨てない
      • real 1m1.354s
      • user 1m48.990s
      • sys 0m13.010s
    • make -j4: キャッシュ捨てる
      • real 1m3.407s
      • user 2m29.830s
      • sys 0m15.710s


流石にネイティブ環境よりは遅いけれど、高々 10% 程度のパフォーマンスヒットとはなかなかやるじゃないか。優秀優秀。
にしてもこの PC 速いな・・・技術の進歩ってやつでしょうか。

トヨタにエールを・・・あれ? [思想と科学]

頑張れトヨタ。
と昨日書いたわけだが・・・

TV で公聴会の様子を一部見た。トヨタ日本法人の社長さんと北米トヨタの社長さん(いずれも日本人)が証人(?)として招聘され、下院議員の質問に答えていた。

このトヨタの社長さんがね・・・なんつーか、話しベタ。最初にこの問題に対してトヨタは真摯に受け止めて最大限の対応をしてますよ、っていう演説を英語でぶったんだけど、ほぼずっと用意した原稿を見つめて下向いたままほとんど棒読み。何のためにここに来たか、なぜ英語でわざわざ話してるのかって、そりゃ私たちは真剣です!ってアピールしたいからでしょ?なのにこりゃいけませんぜ。通訳を介すことにはなるけど、これだったら日本語でもみんなに語りかけた方がいいんじゃないの?と思ってしまいました。テロップで「最終学歴は Massachusetts のなんとか大学 MBA」とか出されちゃってたからちょっとカッコ悪いかもしれないけど。あと、質問に対する答えも長いわりにはなんだかあいまいというか、それ以上に時折危ういことも。質問してる議員さんもイラついたのか、「私は議員なので細かいことを言われても困る。Yes か No かで答えて欲しい」なんて詰め寄る一幕も。質疑は通訳を通していたので、議員さんもどかしかったのかもしれないけど。それにつられたのかどうのか、トヨタの社長さんから「私も技術者出身ではないのであまり詳細は分かりませんが・・・」なんて発言もあって、うわーそれいっちゃまずいでしょ最高責任者だから呼ばれてるんだよアンタ?って冷や冷やしちゃいました。あと、議員さんの発言が終わらないうちに話しだしたりとかもしてたな。
反面、北米トヨタの社長さんはとても立派。英語がうまいってのが大きいのかもしれないけど、冒頭の演説では原稿に目を落としはするもののフレーズごとにきっちり前を向いて話していたし、質問に対しても相手の言う事をしっかり聞いてからしっかり返す、というキャッチボールがちゃんと出来ていた。ちなみに北米トヨタの社長さんは通訳を介さずに議員さんと直でやりあっていた。

んー、原稿読むにしてもちゃんと話しかけたい人に向かって話すとか、質問は最後まで聞くとか、少なくとも相手に何かを伝えたいのであればこれってメチャ基本的なことだと思うんだけど。前にどっかで「日本人は相手の話が終わる前に話し出すから議論にならん」みたいな西洋人の意見を聞いたことがあるんだけど、まさに実例を見たって感じ。これって日本の文化なのかね?英語がうまいとかヘタとかそういう問題ではないよな。けど相手の言う事を遮るのは日本でも失礼だと思うんだけど。どうでしょ?
日本人が議論ベタっていうのは、そういう基本的な議論の「ルール」を知らないってのが大きいのかもしれないな、と TV を見てて思いました。ルールってほど大げさなもんじゃないけど、その大げさじゃない基本事項すら知らないようじゃ議論にならんわな、と。どうでしょ?
トヨタの社長さんは創業者の孫らしいけど、蝶よ花よでここまで来たせいで議論なんかしたことない、とかまさかそんなことはないよな?大丈夫だよな?

しかしまあ・・・社員はそんなこと関係なしに頑張ってることでしょう。だからもう一度。

頑張れトヨタ!
(の社員さん。社長さんも)

トヨタにエールを送る [思想と科学]

アメリカは今トヨタ祭り。TV のニュースではバンクーバーオリンピックよりも扱いが大きく、今日は日本からやって来た日本法人の社長と北米トヨタの社長が出席して下院の公聴会が開かれていた。
ことの発端はアクセルペダルが戻らなくなってクルマが加速し続け、その結果乗っていた三人の家族全員が亡くなるという事故が大きく取り上げられたことだった。この事故の原因とされているフロアマットとアクセルペダルの構造上の問題に関してはリコール措置が取られているが、その後類似その他の事例について報告が相次ぎ、トヨタ車全体の安全性について疑問が投げかけられるという事態に発展している。その他の事例というのは、クルマがドライバーの意思に反して急加速するとか、プリウスを始めとするハイブリッド車でブレーキがすっぽ抜ける(ブレーキが一瞬効かなくなる)という現象だ。急加速するのは事実とすればもちろん問題で検証が待たれるが、ここではブレーキすっぽ抜け現象について考えてみたい。個人的にはトヨタは、というかトヨタのクルマはあまり好きではないのだが、この件については一技術者として思うところがある。

さて、ブレーキすっぽ抜けとはどんな現象なのか。いくつか聞いた限りでは、ブレーキペダルを踏んでいるにも関わらず一瞬ブレーキが効かなくなって空走することがあり、それがもとで停止位置の目測が狂い前のクルマに追突しそうになった、あるいは本当に追突してしまった、ということらしい。原因を考えてみよう。
ハイブリッド車は二系統のブレーキを備えている。ブレーキの踏み始めでは第一の系統として「回生ブレーキ」が働く。回生ブレーキは従来のように摩擦力でタイヤを制動するのではなく、タイヤを発電機に繋ぐことによって発生する抵抗で制動を行う。これによりクルマの運動エネルギーが電力として回収できる。次に加速が必要なときにこの電力でモーターを回せば、エンジンの負荷が減って燃費が向上するというわけだ。トヨタのハイブリッドシステムではモーターだけで、つまりエンジンを停止した状態で走ることもできる。その場合は一切ガソリンを消費しないことから、回生ブレーキによる燃費向上効果は明らかだ。
とは言え、ハイブリッド車は従来のブレーキも備えている。これが二番目の系統だ。発電機ではタイヤがある程度回転していないと制動力を得られないので、車速が落ちてくると制動力の発生源は回生ブレーキから従来のブレーキにバトンタッチされる。ただしドライバーとしては一定のブレーキ踏力で一定の減速加速度が得られることを期待するので、ブレーキの踏み始めから停止までの間、回生ブレーキと従来型ブレーキの切り替えが分からないように、つまり減速加速度がスムーズにつながるように制御しなければならない。実際にどのような制御をしているかは分からないが、まあ普通に考えると回生ブレーキを徐々に緩め、その分従来型ブレーキを徐々に強くして両者の合計減速加速度が一定値になるよう電子的に制御しているのではないかと思う。
さてさて、ここでややこしい問題がある。最近のクルマには ABS がついている。ABS は回生ブレーキ、従来型ブレーキの両方を制御するのだろうか?それをやると大変複雑になってしまう上に回生ブレーキの反応速度が ABS の制動オンオフに追従できるほど速いとも思えない(ABS のオンオフ周期については、ABS を作動させたことのある人なら結構高速なことを知っていると思う。俺のクルマだと目見当で 20~50Hz くらいだと思う)。従って、ABS が作動するような状況では回生ブレーキを切り離し、従来型ブレーキだけで制動するように出来ているのではないだろうか。そもそも ABS が作動する状況というのは危険回避が最優先される非常事態なわけで、エネルギーの回収よりも確実な制動が優先される局面だ。
この予想が正しいとすれば、ブレーキすっぽ抜け現象の原因は容易に想像がつく。回生ブレーキの作動中に ABS が作動して急に通常ブレーキに切り替わる、そのタイムラグが「すっぽ抜け」の正体だろう。雨の日のマンホールや横断歩道の白線なんかは結構滑りやすい。ブレーキングの途中でマンホールを踏めば、一輪だけ微妙にロックして ABS が作動するだろう。その瞬間、一瞬ブレーキがすっぽ抜けるというわけだ。

長々とブレーキについて書いてきたのは、ハイブリッド車のブレーキは従来ほど単純なものではなく、そこに制御が介在していることを理解してもらいたいからだ。ブレーキというのは安全の要であり、高度な信頼性が求められる。言ってみればクルマの命綱だ。安全を保証しなくてはならない自動車メーカーにとっては、なるべく保守的な設計としたい部分だろう。しかしトヨタはハイブリッドシステムにおいて果敢にもそこに手を入れ、少なくとも彼らの試験条件においては信頼に足る設計を行い、10年以上前に世界で初めてハイブリッド車の市販にこぎつけた。それを実現したのは、燃費を飛躍的に向上させた画期的なクルマを作りたいという思いだ。もちろんそこには商売上の戦略や思惑があるにせよ、技術者の思いは上に書いたことそのものであると信じる。

トヨタのクルマづくりは保守的と言われる。それがまさに俺がトヨタ車をあまり好まない要因なのだが、ハイブリッド車の開発はこの面で全くトヨタらしくない。もちろん安全性を犠牲にしても良いとは全く思わないが、実使用状態で試験では考えもしなかった状況が起こるというのはよくある話だ。100%の試験などあり得ない。保守的な考え方では、なんだかよく分からないからやめておこう、となるはずだが、ハイブリッド車の開発に関しては、よく分からないにせよなんとしてもモノにしようと挑戦を続けている。この果敢な挑戦は、俺としては何よりも高く評価したいと思う
今回、不幸にも設計のアラ(と思われる現象)が露呈してしまったが、トヨタの技術者にはぜひこれを克服してほしい。

頑張れトヨタ。

進化論と知的設計(Intelligent Design)論 [思想と科学]

友人の kusano1967 氏が blog に面白いことを書いていたのでトラックバック。
内容はトラックバック先をきちんと読んで欲しいのだが、乱暴に概略をまとめると大体以下のようになる。
学校では、生物は進化論に従って進化すると習う。しかし、偶然都合の良い変化が起こるとはとても考えられない。生物を生かそうとする「誰か」を仮定して、「誰か」が遺伝子をバージョンアップさせている、と考えたらどうだろう。そう考えると色々辻褄が合うぞ・・・と思ったら、既に ID 論(Intelligent Design 論)とか言うのが同じことを言っていた。しかし ID 論には宗教的背景があり、独自に着想したのに彼らと同じに見られるとは運が悪い。やれやれ。いずれにせよ、どちらが正しいのかは決定的な証拠が出るまでは分からないのだが。

kusano1967 氏はまた、プログラマとソフトウェアを「誰か」と生物に対比させて、「誰か」の存在に説得力を持たせている。
生物進化をソフトウェアの修正に例える。修正を加える場合、コードを偶然にまかせて書き換えるなど絶対にしない。なぜなら適当に書き換えて良い結果が得られる可能性など現実的にゼロだからだ。だから良い結果を得るためにはプログラマが意思を持ってコードを更新し、ソフトウェアを「進化」させる必要がある。

なかなか面白いので考察してみたいと思う。考察といっても、超越的な「誰か」もしくは「何か」の存在を論理的に結論付けることは原理的に不可能なので(可能であればそれは超越存在ではない)、ここでは「何か」が存在すると仮定した上で、その設計者としての仕事ぶりを考えてみたい。
念のため記しておくが、kusano1967 氏はやけにスピリチュアルな絵を私に売り付けたり、「とってもためになる話があるから聞きに行こう」とかいう誘いに乗って行ってみたら囲まれて書類にサインするまで帰してもらえなかったり・・・とかそういう人ではない。単に「こう考えると色々辻褄が合う」と言っているに過ぎない。私がここで書くことも、kusano1967 氏の危険思想を正してあげようとか、論破して溜飲を下げようとかそういう意図に基づくものではない。ただ、私は進化論者であって ID 論者ではない。その立場は明確にしておこう。

まず最初の大前提として、時として生物は精巧にして複雑な器官・仕組みを備えており、偶然から生まれたとはとても思えないような精緻なものも数多いということは誰しも賛成するところだと思う。
よって、「何か」の第一の仕事ぶりとして以下を挙げよう。



(a) 「何か」は時として素晴らしい設計を行う。


生物の種は、分類されている現生種だけでも数百万あると言われる。絶滅種も含めればさらにその数倍以上と考えられる。このことから、仕事ぶりの第二は以下である。



(b) 「何か」は極めて多くの設計・実装を行った。


さて、ID 論の主張では「キリンの首」問題がよく出てくる。キリンの首が長いことについて、ID 論では二つの主張が行われる。まず一つ目は以下のような主張である。
<1>
首の短いキリンの祖先は化石として発見されているが、現代のキリンとの中間に位置する、中途半端な首の長さのキリンの祖先は発見されていない。偶然による突然変異でいきなり首が長くなるなど考えられないので、「何か」があるとき首を伸ばしたのだ。

<1>から「何か」について以下が言える。



(c) 「何か」は時として外観上の大きな設計変更を行う。


ただ、キリンといえども頚椎の数はその他の哺乳類と同じく7つである。長くするなら頚椎の数を増やした方が自由度が増して良いと思うのだが、基本設計はあまり変えない方針のようだ。



(d) 「何か」の設計変更方針は、基本構造を変えない「逐次改善」である。


これは、動物が哺乳類、爬虫類、鳥類等々、特徴を共有する分類群をなすことからも頷ける。なにしろ地球上全ての生物は遺伝情報をアミノ酸として保持し、その光学異性体は例外なく同一方向で、体の主要器官は炭素系の化合物によって構成されている。従って、化学的な基本設計については人間の知るところ数十億年に渡り変更されていない。だから、以下のように言い切っていいと思われる。



(e) 「何か」は決して根本的な設計変更をしない。


なお、キリンに見られるように形態変化途中の証拠がないことを「ミッシングリンク」といい、しばしばこれこそが ID 論の証拠であるとされる。しかし私の知る限り、門や網レベルの生物分類においてその起源が他と隔絶しているものはない。よく取り沙汰されるのは人類の起源におけるミッシングリンク(つまり種のレベル)だが、ここ数十年で発見が相次いでおり以前に比べると大分ミッシングリンクが埋まった(アルディピテクスなど)。鳥類などは長らくその起源にミッシングリンクが存在したが、近年中国で直接の起源と見られる化石が発掘されたと聞く(それで始祖鳥は鳥の祖先候補から脱落した。残念。あのフォルム好きなんだが)。子供の頃に行った「ピテカントロプス展」は、見つかっている最古の人類祖先という触れ込みだった覚えがあるが隔世の感ありである。
しかしどんなに発見が相次いでも、ミッシングリンクが完全に埋まることはない。現生種Aとその祖先の化石Bの間に位置する化石Cが見つかったとしても、AとC、CとBの間は依然としてミッシングリンクである。「ミッシングリンク」という言葉を使う場合は、これを理解しておく必要がある。
生物の進化系統については、上野の国立科学博物館に「系統広場」という素晴らしい展示がある。ぜひご覧あれ。

余談が長くなった。本題に戻ろう。
キリンの首について、二つ目の主張は以下のようなものである。
<2>
単純に首が長くなるだけではキリンは生きられない。脳に血液を送るためには高い血圧が必要で、さらに首を上げ下げしたときに脳血圧の急激な変動を抑えるための機構(逆止弁、ワンダーネット)が必要となる。キリンはその両方を備えている。首の長さの変化とこれらが偶然同時に起こるなどあり得ない。「何か」がそう設計したのだ。

これについて考えてみよう。キリンの仲間にはオカピというのがいる。オカピは馬のような鹿のような動物で、さして首が長いわけでもないがワンダーネットは備えている。<2>は異なる機能が同時に実現されたと主張しているが、オカピの首が長くない以上、首の長さとそれを補償する機能は同時に実現されたものではないと言える。したがってここから言えることは以下である。



(f) 「何か」は無駄な機能を設計・実装することがある。



もう一つ、ID 論が進化論に投げかける、以下の興味深い疑問について考えてみよう。
<3>
進化論では種の形態が変異と淘汰によってより生存に適したものに変化するとしている。ならばなぜ生きた化石と呼ばれる生物群が存在するのか。何億年も同じ形態というのはおかしいのではないか。

進化論に対する根本的な誤解が含まれているが(進化論は「生物は必ず変化する」などとは言っていない)、それはそれとして生きた化石と呼ばれる生物がいることは確かだ。「生きた化石」はその名前が示すように希少な例である。一方、現代では見られない様々な生物~つまり過去に滅んだ生物~が化石などで見つかる。従って、ほとんどの種が滅んできたことは間違いない。つまり「何か」の設計は、ひとまず正常に動作するもののそのうち不具合を生じる場合がほとんど、ということになる。



(g) 「何か」が設計したほとんどのものは、最終的に不具合を生じる。


ただ失敗するだけなら仕方ないとも言えるが、修正方法の分かっている不具合を長年に渡り放置することもある。
「何か」の精巧な設計の例として、よく眼球が取り上げられる。眼球というのは非常に精密かつ複数の部品が合わさって全体をなしているので、「何か」が設計しなければ実現不可能だ、というわけだ。主張としては<2>と同種のものである。
受光器官と言う意味では単純な受光細胞(ミミズなどが持っている)、昆虫の目、哺乳類の目、と複雑さには段階があり、決して人間の目が他に比べて不自然に高機能というわけではないのだが、それはここでは置いておこう。興味深いのは、人間の目と構造が近いとされているイカの眼球だ。構造は近いのだが、イカには盲点がない。どういうことかというと、視細胞の網膜への取り付け方が人間(というか脊椎動物全般)とイカとでは逆なのだ。人間の視細胞は視神経が眼球の内側に伸びる方向に配置されているが、イカの視神経は外側に伸びている。そのためイカの眼球には視神経の引き出し口が必要ないのだ。盲点などは明らかな設計ミスと思われるが、脊椎動物全てが同様の目を持っていることから見て、「何か」に設計変更の意思はないと思われる。イカでは正しい設計をしたにも関わらず、である。



(h) 「何か」はたとえ修正方法が分かっていても、設計ミスを直さない。


ミスとまでは言えないが問題のある設計についても、良い設計の横展開はしない方針のようだ。例えばクジラなどの水棲哺乳類には魚で設計・実装が確立したエラを与えれば良いと思うのだが与えない。代わりに鼻を頭頂につけるというなんとも珍妙な変更を行っている。人間は永久歯が抜けてしまうと歯抜けになってしまうが、サメの歯はいくらでも生え変わる。人間の歯も生え変わるようにすれば良いのに。



(i) 「何か」は良い設計の横展開をしない。


ただ、考え方を引用することはあるようだ。相似器官がこれに当たる。しかしこれも漸次改善の手法で行うので、横展開による根本的な設計改善ではない。

ID 論者の主張としては他にも「進化論では人間がサルから進化したと言っているが、サルから人間が生まれたことはない。だから進化論は間違いだ」とか「進化するというのなら弱い種が存在するのはおかしい」とかいうのもあり、まだまだ面白い考察ができそうだが大分長くなったのでここらにしておこう。
進化論の立場からの意見を参考までに記すと、前者は進化論の「人間とサルが共通の祖先を持つ」という主張を「サルが人間になる」と誤解していることに起因した主張(要するに、進化論は「サルから人間が進化した」などとは言っていない)、後者は進化と「進歩」の混同(進化論において進化という場合はいわゆる「退化」も含む。また進化は確率的であり必ず起こるものではない)と、進化論が「弱いものは滅ぶ」と主張していると誤解していることに起因しており、そもそも進化論をよく理解していないがための主張だ、ということだけは述べておこう。

さて、「何か」の仕事っぷりをまとめてみよう。順番は少々入れ替えた。これらはどれも、観測から導き出した事実である。(a) と (b) には「素晴らしい」「極めて」と主観的要素が一部入っているが、ポジティブ評価なのでよしとしてもらいたい。


(b) 「何か」は極めて多くの設計・実装を行った。
(a) 「何か」は時として素晴らしい設計を行う。
(e) 「何か」は決して根本的な設計変更をしない。
(d) 「何か」の設計変更方針は、基本構造を変えない「逐次改善」である。
(c) 「何か」は時として外観上の大きな設計変更を行う。
(h) 「何か」はたとえ修正方法が分かっていても、設計ミスを直さない。
(i) 「何か」は良い設計の横展開をしない。
(f) 「何か」は無駄な機能を設計・実装することがある。
(g) 「何か」が設計したほとんどのものは、最終的に不具合を生じる。


うーん、どうだろう。「何か」がソフトウェアエンジニアだったとすると、以下のような感じだろうか。
  • コーディング量がとても多く、多数のソフトを設計、実装、リリースしている。
  • これまで、非常によくできたソフトを生み出している。
  • 一度設計・実装したコードは、動いたが最後根本的に書き換えることは決してしない。修正は小規模な追加・削除で行う。
  • 時として外観上の大幅変更を行うことはある。ただその場合も、アルゴリズムやアーキテクチャの変更は行わない。
  • 製品系列を超えた移植は行わない。ある製品系列のソフトに不具合が発覚し、別系列の製品ではその問題が生じない実装がされていたとしても、移植による不具合の修正は行わない。
  • 使わない機能を一生懸命設計・実装し、それを含んだままリリースすることがある。
  • 作ったソフトはしばらく問題なく動くが、長い目で見るとほとんどが問題を生じて動かなくなる。

なるほど・・・彼、または彼女は有能なエンジニアだろうか?もし私が彼または彼女の同僚だったら、こう言ってしまいそうだ。



「お前考えて仕事してないだろ?」



最後に、ID 論者、特に宗教的な観点から ID 論を支持する方々に問いかけたい。
(なので、この質問は kusano1967 氏とは全く関係がない)

上で述べたように、「何か」は生命の設計に関してまるきり無能、いや有能なのかもしれないがフザけているとしか思えない。あなた方が「何か」を神だというのであれば、ID 論は神への冒涜ではないのか?それでも ID 論を主張し続けるつもりか?

ご意見、間違いの指摘、その他なんでもありましたらコメント欄にどうぞ。

思想と科学 ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。