2009年12月6日日曜日

Sleep Cycle: レム睡眠時に起こしてくれるiPhoneアプリ

「毎朝快適に起きたい」というのは全人類の夢ですが、それを叶えてくれる(かもしれない)のが、Sleep CycleというiPhoneアプリです。これは「寝返りを検出し、睡眠パターンを調べて、レム睡眠になったタイミングで音を鳴らし、快適に起こしてくれる目覚まし時計」だそうです。

とりあえず商品説明を聞いた瞬間に、
  1. iPhoneで寝返りが検出できるのか?
  2. 寝返りのパターンからレム睡眠がわかるのか?
  3. レム睡眠時に起きると快適なのか?
という疑問が浮かんだので、調べてみました。

iPhoneで寝返りが検出できるのか?
→できる(false positiveもあり?)
Sleep Cycleにはテスト機能があります。テストモードにしたiPhoneをベッドに設置し、ベッドで実際に寝返り(だと思っている動作)をしたところ、Sleep Cycleは寝返りを検出しました。ただし、寝返りではなく、少し頭を動かした時に反応したようです。実際に自分がどのように寝返りを打っているのか分からないので、この精度が問題になるかどうかは不明です。

寝返りのパターンからレム睡眠がわかるのか?
→できそう
「寝返りはレム睡眠前後に多い」と書かれているサイトは、いくつか見つかります(こことかこことか)。おそらく脳波と寝返りの関係を調べた実験があるのでしょうが、その実験自体の情報は見つかりません。

レム睡眠時に起きると快適なのか?
→今日は快適
昨晩Sleep Cycleをセットして寝たのですが、今日は快適に起きることができました。Sleep Cycleにプリセットされた目覚まし音は、一般的な目覚まし音(ピピピ・・・というビープ音)と違って、とても柔らかい音楽ですが、サクッと目が覚めました。

そもそも「快適に起きたかどうか」は主観的な感覚なので、自分で実験してみるしかないです。もう少し使ってみれば効果の程がわかるでしょう。ちなみに、Sleep Cycleは$0.99。本当に快適に起きられるなら、安すぎる。

なお、同様の目覚まし時計として、SLEEPTRACKERというものがあります。こちらは以前から知っていたんですが、15,000円超という値段がネックで試してません。寝るときに腕時計を付けるというのも、若干嫌な感じが・・・。

POWER processorのgroup dispatchとは

前回のPOWER7に燗する記事を書いていて気になったので、"group dispatch"について調べました、というか、Inside the IBM PowerPC 970 ? Part I: Design Philosophy and Front Endを読みました。2002年に書かれたPower 970とPentium4との比較記事なので、かなり古いですが、POWERアーキテクチャの基本は変わってないはず。

まず、Pentium4の概要から。Pentium4は、1つのインストラクションを複数のmicro-operation (uOP) に変換し、実行ユニットはuOPをOut-of-orderで実行します。

Power 970の場合も、インストラクションをinternal operation (IOP) に変換するところまではPentium4と同じです。ところが、この後IOPは「グループ」と呼ばれる単位にまとめられます。グループは、最大5つ(POWER7では最大6つ)のIOPから成り、Out-of-orderは(各IOP単位ではなく)グループ単位で制御されます。こうすることで、Out-of-orderに必要なモジュール(reservation stationとかreorder bufferとか)を小さくして、トランジスタを削減できます。

ただし、この「グループ」の構成にはいろいろ制約があるようです。
  • スロット0からスロット4に入るIOPはプログラム順でなくてはならない
  • 分岐IOPはスロット4にしか入れられない。また、スロット4には分岐IOPしか入れられない
  • 1つの命令を構成する複数のIOPは、複数のグループに分割できない
これを満たせない場合は、スロットにはNOPが入ります。したがって実行効率が低下します。(この問題はVLIW/EPICが抱える問題と同じですね)

同じOut-of-orderでも、Pentium4はuOP単位で処理しているので効率が良さそうです。「グループ」のメリットはトランジスタの削減なんでしょうが、トランジスタを減らせても実効性能も落ちてしまったら意味ないと思うんですが・・・。IBMがあえてそういう設計にしたからには、NOPはあまり挟まれない(グループのスロットはたいてい埋まる)ということなんでしょうね。

2009年12月5日土曜日

IBMのPOWER7は筋肉2倍・トランジスタ半分

POWER7について調べたので、主にIBM's 8-core POWER7: twice the muscle, half the transistorsの内容を元にまとめます。
  • プロセスルールは45nm
  • トランジスタ数12億
  • ダイサイズは567mm^2
  • 4, 6, 8coreの三種類がある
  • 4-way SMT
  • 32 socket対応(サーバ1台に32プロセッサを搭載可能)
  • 4 channelのDDR3コントローラを2つ搭載(100GB/s)
  • L3 cacheはeDRAMで32MB(SRAMで実装した場合と比較してトランジスタ数は半分)
    • 32MB-cacheのPOWER7は12億トランジスタ
    • 30MB-cacheの"Tukwila" Itaniumは20億トランジスタ
    • 24MB-cacheの8-core Nehalem EXは22億トランジスタ
  • 実行ユニットは・・・
    • Out-of-order
    • 整数演算ユニット x 2
    • load/storeユニット x 2
    • 倍精度浮動小数点数演算ユニット x 4
    • 分岐ユニット x 1
    • condition register unit (?) x 1
    • ベクタ演算ユニット x 1
    • 10進浮動小数点数演算ユニット x 1
      • 金融など精度重視の分野で使われる
  • "group dispatch"のサイズが5から6に増えた (?)

一般に、メモリの実装方法には以下の2つがあります。
  • SRAM (Static RAM): フリップフロップ回路で構成される。アクセスが速い。トランジスタ数が多い。キャッシュに使われる。
  • DRAM (Dynamic RAM): キャパシタ(コンデンサ)で構成される。アクセスが遅い。トランジスタ数が少ない。普通のメモリ(メモリモジュールとして売られてるやつ)に使われる。
eDRAM (Embedded DRAM) とは、DRAMをダイ上に実装する技術で、これによってDRAMをキャッシュとして使うことが可能になります。上記の通りDRAMで実装されたキャッシュは「ちょっと遅いけど大容量にできる」という特徴を持つため、L3 cacheに最適ですね。「ちょっと遅い」の「ちょっと」ってどれくらいだよ、というのが気になりますが。
それと、SOIチップ上でeDRAMを実現する特許をIBMが持っていたはず。

WikipediaのeDRAMのページをみたら、eDRAMを使ったプロセッサはPlayStation2, PSP, GameCube, Wii, Xbox, POWER7だそうで、PS2, PSPを除いて全部IBMですね。そして、POWER7はeDRAMを使った初の汎用プロセッサということになります。

改めてまとめてみると、POWER7はとても魅力的です。2 coreのでいいから20万円ぐらいのワークステーション出ないかな。

2009年11月22日日曜日

Scalaが何か気持ち悪い

Scalaという、Java VM上で動く関数型 & オブジェクト指向言語を使ってみました。
関数型(関数は状態を持たず、結果は引数のみに依存する)なのにオブジェクト指向(オブジェクトは状態を持つ)とはこれ如何にという気がしてなりません。

"Scala By Example" の Chapter 4まで読んで、末尾再帰版の factorial を実装してみました。
def fact(n: Int) = {
  def factIter(n: Int, prod: Int): Int =
    if (n <= 1) prod else factIter(n - 1, n * prod)
  factIter(n, 1)
}
これをロードして動作を確認します。
$ scala
Welcome to Scala version 2.7.7.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_15).
Type in expressions to have them evaluated.
Type :help for more information.

scala> :load /tmp/factorial.scala
Loading /tmp/factorial.scala...
fact: (Int)Int

scala> fact(6)
res0: Int = 720

scala> fact(10)
res1: Int = 3628800

scala> fact(20)
res2: Int = -2102132736
うーん・・・。
  • 型推論なし: factIter(...): Int の ": Int" は省略できません。推論しろよー。
  • 型のbit長を意識しないと: Scala の Int は Java の int にマップされてるので singed 32bit integer となる。fact(20) がおかしい。
うーん、これ関数型言語か?。「高階関数が使えるオブジェクト指向型言語」だったらまだ分かるけど。「高階関数が使える言語」と「関数型言語」とは違うだろー。と思ったがWikipediaによれば
関数型言語は、広い意味ではファーストクラスの関数オブジェクトを持つ言語である。
そうなのか・・・、だったらまぁ関数型言語かなー。うーん、気持ち悪いなー。
(あと、scalaインタプリタのコマンドラインで、Ctrl+DがDelにならないのがつらい)

追記 2012-02-04
タイトルを「Scala(スケイラ)が何か気持ち悪い」から「Scalaが何か気持ち悪い」に変更。なんで「スケイラ」と発音すると勘違いしたのか、今となっては不明。

2009年11月21日土曜日

Software Designの2つの方法

"Programming in Haskell"のPrefaceで引用されていた一節を再引用。Tony Hoareという人のTuring Award受賞時のコメント。
There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.
拙訳:
ソフトウェア設計には二つのやり方がある。一つは、極めてシンプルに設計して、バグがないことを明らかするやり方。もう一つは、非常に複雑に設計して、明らかにわかるようなバグをなくすやり方。前者の方がはるかに難しい。
日本語でうまく表せない(訳の問題?)ですが、"obviously no deficiencies" と "no obvious deficiencies" という、単語の並び順で意味を逆転させるところが絶妙。

で、これが "Programming in Haskell" に載っているので「Haskellのような関数型言語でのソフトウェア開発と、C/C++のような命令型言語での開発との比較なんだろう。Tony HoareというのはHaskell関連の人に違いない」と思っていたら全然違いました。

Tony Hoareは、
  • プログラミング言語デザインの研究者
  • Quicksortアルゴリズムを発明した人(知らなかった・・・)
  • ALGOL60を設計 & 実装
    • その際、Nullポインタを導入した事を「数十億ドルに値する失敗」と後悔している)
  • 今は Microsoft Researchのシニアリサーチャー
でした。

つまり冒頭の一節は、ソフトウェア設計一般の話なんですね。とはいえ、少なくとも "Programming in Haskell"の著者は、Haskellを使うことで"obviously no deficiencies"な設計にしやすい、と考えていると言えるでしょう。その理由はprefaceには書いていませんが、「静的な強い型付け言語」というHaskellの特徴と無縁ではないはずです。

静的な強い型付け言語 (HaskellとMLと・・・あと何?) を使った人は分かりますが、(特に初心者は)コンパイルを通すまでに異常に時間がかかります。簡単なプログラムのコンパイルでも、何度も「型がおかしい」とコンパイラに怒られます。型エラーに対応するために、コードを見直し、その過程で型エラーではないロジカルなバグを見つけることもあるでしょう。

「注意深くコードを書く」のは「言うは易し。行うは難し。」の典型例です。プログラミングとはプログラマの思考の明文化なので、「注意深く」というのはつまり「自分に批判的に」ということであり、人間が苦手とする態度です。そこで、プログラマの思考(コード)を批判してくれる人・ものが重要になってきます。

コードの品質を高めると言われている手法
  • -Wall or -Werror
  • 静的な強い型付け言語
  • Test Driven Development
  • ペアプログラミング
  • コードレビュー
は、「コードを批判する」という点において同じ働きをすると言えます。逆に言うと、高品質なコードを書くには、コードを批判する(批判される)環境が必要と言えるでしょう。

(つまらない結論に行き着いてしまった。「"obviously no deficiencies" と "no obvious deficiencies" がおもしろいな」っという小さな感動が発端なので、そこでやめとけばよかった。無理して書いても良いことない、という教訓です。)

DKMS: Dynamic Kernle Module Support

Xenインストールの過程で出てきた謎「Ubuntu kernel (2.6.31-14-generic) だとNVIDIAプロプライエタリドライバが使われるのに、Xenified kernel 2.6.31.5だと使われない」を調べました。

まず、このドライバであるカーネルモジュールを探してみました。/lib/modules/2.6.31-14-generic の下だろうと見当をつけて適当に検索。私は "tree | less" が好きです。
"/lib/modules/2.6.31-14-generic/updates/dkms/nividia.ko" を発見。

"dkms" が謎なので、Wikipediaで調べる。「kernel suorce treeに含まれないドライバをサポートする仕組み」とある。ふーん知らないことがいっぱいあるなぁ。というか、こういう細かい仕組みが増えつづけててキャッチアップできない。

何かログが残ってるだろ、と思って/var/log以下を見てみると、dkms_autoinstallerというログファイルがあり、中には、
nvidia (185.18.36): Installing module.
  Kernel headers for 2.6.31.5 are not installed.  Cannot install this module.
  Try installing linux-headers-2.6.31.5 or equivalent.
というエラーメッセージが。
多分dkmsは、/usr/srcの下をチェックするのだろうが、2.6.31.5は/home/kawamoto/work/linux-2.6-xenでビルドしただけなので、/usr/src/linux-headers-2.6.31.5なるものはない。逆に、/usr/src/linux-headers-2.6.31.5にヘッダをおいて、dkmsというのを使えばインストールできそうである。
# make headers_install INSTALL_HDR_PATH=/usr/src/linux-headers-2.6.31.5
とヘッダをインストールしてから、dkmsコマンドでビルド & インストールしてみた。
# dkms build -m nvidia -k 2.6.31.5 -v 185.18.36

Kernel preparation unnecessary for this kernel.  Skipping...
applying patch rt_preempt_31.patch...patching file nv-linux.h

applying patch fall_back_on_mtrr_if_no_pat.patch...patching file nv.c
Hunk #1 succeeded at 891 (offset -49 lines).

applying patch nvidia-rt-compat.patch...patching file os-interface.c


Building module:
cleaning build area....
su nobody -c "make KERNELRELEASE=2.6.31.5 module KERNDIR=/lib/modules/2.6.31.5 IGNORE_XEN_PRESENCE=1 IGNORE_CC_MISMATCH=1 SYSSRC=/lib/modules/2.6.31.5/build".......
cleaning build area....

DKMS: build Completed.
# dkms install -m nvidia -k 2.6.31.5 -v 185.18.36

nvidia.ko:
Running module version sanity check.
 - Original module
   - No original module exists within this kernel
 - Installation
   - Installing to /lib/modules/2.6.31.5/updates/dkms/

depmod.............

DKMS: install Completed.
これで、2.6.31.5 + NVIDIAプロプライエタリドライバで動きました。
$ uname -r
2.6.31.5
$ lsmod | grep nvidia
nvidia              10316680  36

教訓:
いくつかのモジュールにおいては(少なくとも dkms では)、カーネルに対応したヘッダが、/usr/src/linux-headers-`uname -r`に存在している事が前提となっているので、パッケージを使わない場合も置いておくこと。

2009-11-29 追記:
NVIDIAプロプライエタリドライバは、Xenに対応してないことが分かりました・・・。残念。

2009年11月20日金曜日

Installation of Xen 3.4.2 with Ubuntu as Dom0 - part 3

連載3回目。

状況を整理すると、Xenは今のところ関係なく、
  • Ubunt 9.10の標準カーネル (2.6.31-14-generic) →起動する
  • ここから取ってきてビルドしたカーネル (2.6.31.5) →起動しない(画面がブラックアウト)
となっています。dmesgを比較してみました。

起動するとき (2.6.31-14-generic使用時) の dmesg:
・・・
[    2.221645] EXT3-fs: mounted filesystem with writeback data mode.
[    3.306151] Adding 3116600k swap on /dev/sda2.  Priority:-1 extents:1 across:3116600k
[    3.474647] EXT3 FS on sda5, internal journal
[    4.261982] udev: starting version 147
[    5.003297] intel_rng: FWH not detected
[    5.074191] lp: driver loaded but no devices found
[    5.084328] parport_pc 00:09: reported by Plug and Play ACPI
[    5.084369] parport0: PC-style at 0x378, irq 7 [PCSPP,TRISTATE]
[    5.106769] ppdev: user-space parallel port driver
[    5.160180] lp0: using parport0 (interrupt-driven).
[    5.308416] nvidia: module license 'NVIDIA' taints kernel.
[    5.308421] Disabling lock debugging due to kernel taint
[    5.342847] ip_tables: (C) 2000-2006 Netfilter Core Team
[    5.562367] nvidia 0000:01:00.0: PCI INT A -> GSI 16 (level, low) -> IRQ 16
[    5.562374] nvidia 0000:01:00.0: setting latency timer to 64
[    5.562479] NVRM: loading NVIDIA UNIX x86_64 Kernel Module  185.18.36  Fri Aug 14 17:35:21 PDT 2009
[    5.959084] HDA Intel 0000:00:1b.0: PCI INT A -> GSI 16 (level, low) -> IRQ 16
[    5.959103] HDA Intel 0000:00:1b.0: setting latency timer to 64
[    6.126981] hda_codec: Unknown model for ALC662 rev1, trying auto-probe from BIOS...
[    6.128232] input: HDA Digital PCBeep as /devices/pci0000:00/0000:00:1b.0/input/input5

起動しないとき (2.6.31.5使用時) の dmesg:
・・・
[    4.470514] EXT3 FS on sda5, internal journal
[    5.293847] udev: starting version 147
[    5.905302] ip_tables: (C) 2000-2006 Netfilter Core Team
[    6.199653] lp: driver loaded but no devices found
[    6.213961] parport_pc 00:09: reported by Plug and Play ACPI
[    6.214001] parport0: PC-style at 0x378, irq 7 [PCSPP,TRISTATE]
[    6.246184] ppdev: user-space parallel port driver
[    6.290182] lp0: using parport0 (interrupt-driven).
[    6.391463] intel_rng: FWH not detected
[    7.071009] HDA Intel 0000:00:1b.0: PCI INT A -> GSI 16 (level, low) -> IRQ 16
[    7.071029] HDA Intel 0000:00:1b.0: setting latency timer to 64
[    7.294849] hda_codec: Unknown model for ALC662 rev1, trying auto-probe from BIOS...
[    7.296100] input: HDA Digital PCBeep as /devices/pci0000:00/0000:00:1b.0/input/input4
[    9.013072] r8169: eth0: link up
[    9.013077] r8169: eth0: link up


えーっと、ログ出力される順序が異なるので比較し辛いですが、心の目でじっと観ていると、起動しない方は "nvidia:" で始まるログがないことが分かります。ビデオカードのドライバですね。


そういえば、ビデオカードのドライバはNVIDIAが提供しているプロプライエタリなドライバを、Ubuntuメニューの「システム→システム管理→ハードウェア・ドライバ」から入れてるんだった。ということは、OSが起動してないのではなくて、画面が表示できてないだけか。同じようなもんだけど。

/etc/X11/xorg.confに、'Driver "nvidia"'とバッチリ書いてました。ということは・・・、
  1. 2.6.31.5で起動
  2. NVIDIAプロプライエタリドライバは(どういうわけか)ロードされない
  3. X起動 → nvidiaドライバを使おうとする → 死亡
  4. 画面表示されない
ということかと思われます。この仮説を検証するために、2.6.31-14-genericで起動して、NVIDIAプロプライエタリドライバを無効にしてから、2.6.31.5で起動すると・・・、動いた!動きました。

これで、2.6.31.5がスタンドアローンのOS(というのが適切な表現なのか・・・)としても、XenのDom0としても動きました。

ただし、現状は「Xenを使ってるけど、OSは一つ (Dom0) しか起動してなくて、しかもビデオドライバの性能がちょっと悪くなってる」という悲しい状態なので・・・
  • DomUとして何か動かす
  • Dom0をvanilla kernelじゃなくて、Ubuntuのカーネルにしたい(何となく)
  • NVIDIAプロプライエタリドライバを使う(追記2009-11-22: 使えた
がやりたいです。ToDoいっぱいあるなぁ・・・。

2009年11月18日水曜日

Installation of Xen 3.4.2 with Ubuntu as Dom0 - part 2

前回の続き。

"error getting signalfd"でいろいろ調べると、
  • udevdは最近(いつから?)signalfdというシステムコールを使うようになった。
  • "man signalfd" には、"signalfd() is available on Linux since kernel 2.6.22."とある。
  • Xenが公式サポートしているkernelは2.6.18なので、signalfdがない
ということのようです。つまり、udevのような起動に関係するモジュールは新しい(Ubuntu 9.10だから)のに、kernelが古いのが原因です。

ということは対策としては、
  1. 2.6.22以上のXenified kernel(Xen対応kernel)を使う。
  2. udevdを、signalfdを使っていないバージョンに下げる。
の2つが考えられますが、2だと芋づる式にいろんなモジュールが動かなくなる恐れがあるので、1にしました。Ubuntu 9.10のkernel (2.6.31-14) はnon-Xenifiedなので、"Xen paravirt_ops for upstream Linux kernel" に載っていた "latest Xenified kernel" を使うことにします。
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/jeremy/xen.git linux-2.6-xen
$ cd linux-2.6-xen
$ cp /boot/config-2.6.31-14-generic .config # 現在のconfigファイルを元にする
$ make menuconfig # 後述
$ make bzImage && make modules
# make modules_install
# cp arch/x86/boot/bzImage /boot/vmlinuz-2.6.31.5
# cp .config /boot/config-2.6.31.5
# depmod 2.6.31.5
# mkinitramfs -o /boot/initrd.img-2.6.31.5 2.6.31.5
とビルド & インストールします。"Xen paravirt_ops for upstream Linux kernel" によれば、下記のconfig optionが必要とのことなので、"make menuconfig" 後に確認しましょう。
  • CONFIG_XEN=y
  • CONFIG_XEN_MAX_DOMAIN_MEMORY=32
  • CONFIG_XEN_SAVE_RESTORE=y
  • CONFIG_XEN_DOM0=y
  • CONFIG_XEN_PRIVILEGED_GUEST=y
  • CONFIG_XEN_PCI=y
  • CONFIG_PCI_XEN=y
  • CONFIG_XEN_BLKDEV_FRONTEND=m
  • CONFIG_NETXEN_NIC=m
  • CONFIG_XEN_NETDEV_FRONTEND=m
  • CONFIG_XEN_KBDDEV_FRONTEND=m
  • CONFIG_HVC_XEN=y
  • CONFIG_XEN_FBDEV_FRONTEND=m
  • CONFIG_XEN_BALLOON=y
  • CONFIG_XEN_SCRUB_PAGES=y
  • CONFIG_XEN_DEV_EVTCHN=y
  • CONFIG_XEN_BACKEND=y
  • CONFIG_XEN_BLKDEV_BACKEND=y
  • CONFIG_XEN_NETDEV_BACKEND=y
  • CONFIG_XENFS=y
  • CONFIG_XEN_COMPAT_XENFS=y
  • CONFIG_XEN_XENBUS_FRONTEND=m
さて、このkernelを使えば起動するかと思いきや、今度は突然画面が消えてしまう現象が発生。画面に何も表示されないので、当然エラーメッセージも何もありません。
Xenを使わずに、普通にLinuxとして起動しても同様です。

うーん、困ったなー。ということで次回に続く。

2009年11月15日日曜日

Installation of Xen 3.4.2 with Ubuntu as Dom0

そうだXenをインストールしよう。

ということで、仮想化の流行に追随(今更・・・)し、Xenを使ってみることにしました。「Ubuntuだからパッケージが揃ってるだろう」と思っていたら、Ubuntu 9.10には今のところパッケージは無く、ソースから入れることに。

Xen 3.4.2のtar ballをダウンロードし、READMEを読みます。ずいぶんいろいろprerequisitesが必要なようですが、「make world → 失敗 → 足りないものをインストール → make world → ...」戦略でやってみます。

結局、
  • gawk
  • gettext
  • bin86
  • bcc
  • python2.6-dev
  • texinfo
が必要でした。これでビルドは成功。
続いてinitrdを作成します。これもREADMEの通り・・・ですが、出力ファイル名(initrd.img-...)を既存のinitrdに合わせます。Debian系(だけ?)はmkinitrdではなくてmkinitramfsを使うので注意しましょう。
# depmod 2.6.18.8-xen
# mkinitramfs -o initrd.img-2.6.18.8-xen 2.6.18.8-xen
ここまででインストールは終了。

さて、次はXenカーネルを起動するために、GRUBの設定をいじります。そしてここに小さな罠が。Ubuntu 9.10からGRUB2になったらしく、フォーマットが分からない・・・。
GRUB2ドキュメントなどを調べつつ、/etc/grud.d/40_customに
menuentry "Xen 3.4" {
        recordfail=1
        if [ -n ${have_grubenv} ]; then save_env recordfail; fi
        set quiet=1
        insmod ext2
        set root=(hd0,5)
        search --no-floppy --fs-uuid --set af7c21bf-XXX
        multiboot /boot/xen-3.4.gz dom0_mem=512000
        module /boot/vmlinuz-2.6.18.8-xen root=UUID=af7c21bf-XXX ro console=tty0 rootdelay=90
        module /boot/initrd.img-2.6.18.8-xen
}
と書いてから、
# grub-mkconfig > /boot/grub/grub.cfg
でOKと判明。grub-mkconfigスクリプトは、/boot以下にあるカーネルをチェックして勝手にgrub.cfgに追加するみたいで、Dom0用のカーネル (vmlinuz-2.6.18.8-xen) も登録されてしまいましたが気にしない。

で、再起動し、GRUBメニューでXenを選べばOK・・・のはず・・・、
  1. udevdの起動で、"error getting signalfd" というエラーが出る
  2. ルートファイルシステムが見つからない、マウントできない
  3. initramfsのシェル(多分)に落ちる
となってしまいます。残念。
とりあえずここまで。続きはまた。

2009年11月9日月曜日

Sumo Wrestlersはやればできる子 & 空気読む子

「角界(相撲業界)には八百長が蔓延しているのでは?」という話は、たびたび出てくるワイドショーネタであるが、「ヤバい経済学」に興味深い話しが出ていたので抜粋します。あ、ちなみにKindleで英語版を読んでいるので、単語が変です。相撲用語がわからないので、ご了承ください。

まず(私も知らなかったのですが)相撲の基本から。
  • 上位66位の力士は幕内と十両と呼ばれ、相撲のエリートである。
  • ランキングによる待遇の差が大きい。40位だと年収1,700万円ぐらい。70位だと年収150万円。しかも、低位の力士は高位の力士のご飯を作ったり、体を洗ったりしなくちゃいけない。
  • ランキングは、年に6回のトーナメント(巡業?)の成績で決まる。
  • 一人の力士は、一回のトーナメントで15試合戦う。8勝以上だとランキングが上がる。7勝以下だとランキングが下がる。負けまくると幕内じゃなくなる。
  • 従って、8勝できるかどうかが極めて重要になる。
ということから、7勝7敗で千秋楽を迎えた力士Aが、すでに8勝以上の力士Bに対し、「わざと負けてもらえませんかね~? お礼はたっぷり弾みますぜ、旦那」という取引を持ちかけることは十分考えられます。なぜなら、8勝以上の力士にとっての1勝よりも、7勝7敗の力士にとっての1勝の方が価値が高いからです。
(なお、10勝以上していると、殊勲賞・技能賞・敢闘賞がもらえる可能性が高くなるので、10勝以上の力士に八百長を持ちかけても断られる可能性が高い。きちんと八百長をするには、相手を見極めなくてはいけない。)

千秋楽において、7勝7敗の力士Aと8勝6敗の力士Bが戦うことになったとします。A, Bが戦った過去のデータから、力士Aが勝つ確率は48.7%だそうです。では実際に千秋楽で戦った結果はというと、何と79.6%で力士Aが勝っているそうな。

うーん、すごい。過去の対戦から推測される勝率の2倍の確率で勝つとは。某サッカー漫画において、シュナイダーのファイヤーショットを練習では50%しかセーブできなかったのに、本番の試合になると50%以上でセーブできる天才キーパー若林源蔵を彷彿とさせます。力士も若林君もやればできる子なんですね。

さて、これだと「背水の陣を敷いた力士は強いぜ」で片付けることも可能ですが、面白いのはここからです。
最初に書いたとおり、「角界の八百長疑惑」はたびたびワイドショーで取り上げられます。では、八百長疑惑がマスコミを賑わせた直後のトーナメントにおいては、「やればできる子」はどうなるんでしょう。

普通に考えると、「やればできる子」はいつも通り千秋楽では界王拳2倍で頑張るので79.6%で勝てるはずです。ところが、データによると、八百長疑惑が報じられた直後のトーナメントの千秋楽では、7勝7敗の力士は8勝6敗の力士に約50%でしか勝っていないのです。やればできる子たちは、一体どうしたんだ!?

知り合いに角界関係者がいないので推測しかできませんが、恐らくこういうことだと思います。つまり、やればできる子の力士Aは、「みんなが『力士は八百長してる』って言ってるよー。今まで48.7%でしか勝ってなかった僕がこの試合に勝っちゃったら、八百長説が更に盛り上がっちゃうかも・・・。どうしよう。今日勝たないと8敗になって降格しちゃうかもしれないのに。困ったなー」と、敏感に空気を読んで悩んでしまい、界王拳が使えなくなってしまうのです。

つまり、マスコミが「八百長疑惑」を騒ぎ立てることが、力士たちのフェアな戦いを阻害しているのです。何てこった。

マスコミの皆さんへ:
力士たちは「空気読む子」なので、八百長疑惑を騒ぎ立てないように注意してください。お願いします。


2009年11月8日日曜日

iPhoneとVIEW Suicaカードと年金問題と

iPhoneが至高の携帯電話であることは論を待たないわけだが、ICチップ未搭載という点が欠点として挙げられる。要するに、別途Suica (PASMO) カードを持つのがめんどくさいというという話である。
・・・と文句を言っても仕方ないので、年会費無料の「ビュー・スイカ」リボカードの入会手続きをした。

クレジットカードの入会手続きなので、氏名・住所・電話番号・勤務先など様々な情報を入力し、「申し込み」ボタンをクリックした。すると、PDFへのリンクとともに「このPDFを印刷して、本人確認書類とともに郵送せよ」という指示をいただいたので、速やかに印刷し、封筒を作り(印刷した紙を挟みで切り抜いて封筒を作るのだ)、免許証のコピーを用意したところで気がついた。

「ウェブで入力した情報とリンクさせるキーが見当たらない・・・」

この後Viewカードセンター(という名前かどうか知らないけど)では、ウェブで入力した個人情報の主(この場合は私)と、本人確認書類を送る人(これも私)とを対応付ける、という作業を行うはずである。(エンジニアとして)普通に考えると、ウェブで入力された情報にIDを振っておき、(PDFを印刷して作った)封筒のどこかにそのIDを印字しておけば、その2つが同一であることを持って同じ人物だと判断する、というオペレーションになるはずである。しかし、そのIDらしき文字列が見当たらない・・・。

とすると考えられるのは、住所・氏名・電話番号を組み合わせた「恐らくユニークだと思われる情報」をキーとして、ウェブで入力された個人情報と本人確認書類とを対応付ける、というオペレーションであるのだが・・・。

この方式がうまくいかないことは年金問題で明らかになったはずである。

誤字・脱字があったらそれでNGだ(「本人確認書類が届かなかったので入会手続きできませんでした」という返事が返ってくるのだろう)し、そもそも「住所・氏名・電話番号を組み合わせた『恐らくユニークだと思われる情報』」を使うなんて、恐ろしく非効率だ。
ユニークなIDを振っておけばほとんど自動で処理できる(封筒に印字されたIDの入力作業は人力だが)はずなのに、住所・氏名・電話番号を組み合わせて検索するという、人間にしかできない高度な知的作業を強いている。

年金システム(ITシステムではなく、国民年金制度の意)が作られた数十年前には、データベースという概念がなかった(だろう)から、「ユニークIDを振る」ことに思い至らなくても仕方がない気がする。しかし、その数十年前のシステムと同じことを21世紀に繰り返すのは犯罪に近い。「賢者は歴史に学び、愚者は経験に学ぶ」良い(悪い?)事例である。

JR東日本のシステムなのだから、NTTデータとか日立とかIBMなどの大手が開発に参画しているはずなのに、これはどういうことだろう?
  1. 大手のエンジニアはアホである
  2. 子会社に仕事を振れるように、オペレーションを敢えて複雑にしている
  3. 単に私の見落としで、実は封筒のどこかにユニークIDが記されている
答を知っている人、ぜひ教えてください!

2009年11月7日土曜日

Install Moblin v2.1 on HP Mini 2140

Linux Foundationの人にMoblin v2.1が入ったPCを自慢されたので、負けじと自分のHP 2140にMoblin v2.1をインストールしてみました。GRUB、WiFi、CapsLock - Ctrlの3点にハマったので、記録を残します。

Moblinインストール
moblinのインストール自体は簡単です。
  1. http://www.moblin.org/ からLive Image (imgファイル)をダウンロード
  2. Live ImageをUSBドライブにバイトコピー
  3. USBドライブから起動する
  4. 後は普通のLinuxと同じ
間違えやすいのは、Live ImageをUSBドライブにふつうにコピーしてしまうことぐらいでしょうか? ddやらimage-write (というものがあるらしい)やらを使いましょう。

GRUBの設定
Moblinしか使わないならGRUBの特別な設定は不要ですが、私はUbuntu 9.10と共存させたかったので、GRUBの設定を変更する必要がありました。
普通のLinux distroと異なり、Moblinはinitrdを使わずに最初からストレージのファイルシステムをマウントするようです。なので、grub.conf (debian系ではmenu.lst)はこんな感じになります。
title Moblin
root (hd0,1)
kernel /boot/vmlinux-2.6.XX ro root=/dev/sda2 quiet vga=current
initrd指定がないことに注意してください。(この例ではHDDを4つのパーティションに分割していて、Moblinの/は2つ目のパーティションです)
ここでハマったのは、"vga=current"というkernelオプションです。詳しく調べていませんが、Moblin v2.1に入っているGRUBと、Ubuntu 9.10に入っているGRUBとはバージョンが異なるようで、Ubuntu側からgrub-installすると、"vga=current"という文字列のパースでエラーになるようです。Moblin側からgrub-installすればきちんと動きました。(しかし、この文字列はLinux kernelに渡されるだけで、GRUBはパースしないと思っていたが・・・)

WiFi
HP 2140のWiFiはBroadcomのBCM4322というコントローラですが、Moblinに入っているkernel moduleは古くて未対応です。なので、最新ソースを取ってきてkernel moduleを作り直す必要があります。
  1. インストールされている古いkernel moduleを削除 "yum erase wl-kmod"
  2. kernel module作成に必要なパッケージをインストール "yum install kernel-netbook-devel"
  3. Broadcomのサイトからドライバをダウンロードしてビルド
ここここを参考に・・・というか、この通りにやれば問題ありません。(ただし、Broadcomが提供しているドライバが2.6.31に対応したのでパッチは不要です。)

CapsLockをCtrlに
統計によればLinuxインストール作業の92.3%はCapsLock - Ctrlのスワップ(または置換)に費やされると言われています(嘘)。今回もやはり・・・。
結論から言うと、メニューの「アプリケーション > キーボード > レイアウト > レイアウトのオプション > Ctrl key position」で "Make CapsLock an additional Ctrl" で置換できました。ただし、これだと何故かCapsLock押下時にCapsLockのLEDがOn/Offするんですよねー。なので、「置換できてない」と勘違いして1時間ほどハマっていました。
LED点灯の件は未だに解決できず。だれか教えて・・・。

2009年11月1日日曜日

Kindleの通信費は無料だと思われる


Kindle使用して3日目のレビュー」に書いた通信費に関してもう少し調べたところ、「やっぱり無料だろう」という結論に至りました。

Kindle Customer Service Recent Q&As (October)に、
Q: When do international download fees apply?
A: U.S. Customers traveling abroad that download books wirelessly from the Kindle Store or from Archived Items will be charged a fee of $1.99 for these international book downloads (this fee only applies to U.S. customers using Kindle U.S. and International Wireless devices when outside the U.S.).
U.S. customers can continue to receive all of their newspaper, magazine, and blog subscriptions via Whispernet while traveling abroad, for a weekly fee of $4.99, or $1.99 per issue.
To avoid any fees, customers can always download books, periodicals, and personal documents to their computer and transfer to their Kindle via USB. To download and transfer Kindle content, visit www.amazon.com/manageyourkindle.
For non-U.S. customers, there are no additional charges for receiving books or periodicals wirelessly outside their home country.

とあります。これは確実に無料でしょう。

ということで、試しに "The Economist"を購読してみます。一ヶ月後のクレジットカード明細が楽しみだ。

Kindle使用して3日目のレビュー


Kindle買いました!
Amazon U.S. で発売されて以来ずっと欲しくて、一時は利用規約に違反してでも手に入れよう (*) と考えたこともあるのですが、3, 4万円もするものを購入して、利用規約違反で使用できなくなるリスクが怖く躊躇していましたが、ようやく正式に入手することができました。
まだ 3 日しか使ってませんが、さっそくレビュー。


(*)
最近まで、Kindleは U.S. 在住者しか買えない & 使えないという規約でしたが、入手する方法はいろいろあったのです。

良いところ
  • 軽い:本体 300g + カバー 100g (多分) の 400g ぐらいだと思いますが、持ち歩きには問題ない重さです。ベッドで仰向けになって読むのにはちょっと重いぐらい。
  • 電子インク:電子インク製品は初めて使いましたが、液晶とは全然違います。印刷物を読んでるのと同じ感覚で、目が疲れません。
  • サイズ:今読んでるのは、「影響力の武器」と「ヤバい経済学」(の英語版)ですが、表示部分のサイズが小さいと感じたことはありません。大きいに越したことは無いですが、重さとのバランスを考えると、ちょうど良いサイズです。
悪いところ
  • 通信費:かなり混乱しています。後述。
  • フォント:本によってフォントが異なるのでしょうか? 上記の2冊のフォントは問題ないのですが、"Stochastic Calculus for Finance II"のフォントは見づらいです。Serifの細いところが細すぎて欠けています。数式が入っている本だとフォントが異なるのかもしれません。数式好きな貴方は要注意です。

通信費についてはかなり混乱しています。Kindle の "Click here to see important information specific to your country"というリンクをクリックして表示されるウィンドウには、明確に
Free 3G wireless lets you download books right from your Kindle. No monthly fees, service plans, or hunting for Wi-Fi hotspots. For non-U.S. customers, there are also no additional charges for wireless delivery in or outside your home country.
と書いてあります。ここだけ読むと無料だと思うんですが・・。

Kindleに入っている"Important Reminder About International Delivery Fees"というドキュメントには、「一冊につき$1.99かかるぜ」「新聞とかを購読してると週に$4.99かかるぜ」と書いてあります。

じゃあ有料なのかというと、さらにややこしいことに、これとよく似たテキストが"International Service Fees for U.S. Customers"に掲載されていて、こちらは (タイトル通り) U.S. Customerにしか適用されないような雰囲気を醸し出しています。

一体どっちなんだ!? 教えて、偉い人! (追記 2009-11-1:やっぱり無料だと思われます。)


フォントが悪い本のサンプル画像。画面中央の"could be" の 'd' や 'b' が切れているのがわかるでしょうか。

2009年10月29日木曜日

三重苦の勉強会・・・。でもこれからも参加するよ!

圏論がわからない、Haskellがわからない、英語がわからない・・・。
TLUGのメーリングリストに面白そうな勉強会のメールが流れてたので、(ちょっと遠かったけど)新宿まで移動して勉強会に飛び入り参加してきたところ、冒頭の三重苦に悩まされました。
というのは大げさですが、「圏論の基本的な話をして、関連するパズルを解くプログラムをHaskellで書いてみた話を(英語で)します」というのに、圏論もHaskellも英語も自信がないと、やはり理解度は落ちますね。

「パズル」はここに載ってますが、数学的厳密性を無視して日本語にするとこんな感じ。
サイズnの有限集合Aが与えられたとき、任意のa∈Aに対して f(a) = f(f(a)) を満たす関数 f は何種類存在するか?
これを数学的に解くのではなくて、関数 f を列挙するプログラムを Haskell で書いてみる、という数学者に怒られそうな、コンピュータサイエンス的な勉強会でした。

パターンマッチのルールも忘れていましたが、久しぶりに関数型言語に触れて楽しかったです。functional languageには、imperative languageでは味わえない記述の楽しさがありますね。まさに数式を書いている感覚です。さらっと書けると気持ちいいですよね。まぁ、さらっと書いても私のPCには実行環境がないんですけどね。

「圏論がわからない、Haskellがわからない、英語がわからない。」と書きましたが、逆に (?) 考えれば、圏論とHaskellと英語とを学べる勉強会ということなので、継続的に参加しようと思います。ちょっと高いけど "Conceptual Mathematics" を買いましょう。(Kindle edition出してよー)

(ところで、今日の話は圏論というより群論だと思ったのですが、群論⊂圏論なんでしたっけ? もう少し勉強が進めば違いがわかるかな。)

Travis and Curt, thank you for exciting presentation and providing a venue!

2009年10月28日水曜日

Mozilla Developer Networkのアンケートにご協力ください

某MLで、Mozilla Developer Networkのアンケート協力依頼が流れてました。
こういうのにはボランティア精神を発揮して、積極的に協力するようにしているのですが、私はWeb Developerではないので・・・。

Web Developerの方は、ぜひご協力ください。
アンケートはこちら:
http://hacks.mozilla.org/2009/10/mozilla-developer-network/

2009年10月27日火曜日

NUMB3RSの方程式が実際に使える数式である件に関する一考察

一般的に、数学は嫌われていると言っても過言ではないと思う。「数学が大好きです」という人は滅多にいない。従って、数学を扱ったドラマは人気が出ないだろうと推測できるわけだが、それを覆したドラマがある。NUMB3RSである。


TSUTAYAで、「海外ドラマのシーズン1は全て100円」キャンペーンをやっていたので、以前から見たいと思っていたNUMB3RSを借りてきた。NUMB3RSは、一点を除いて、いわゆる普通の刑事ドラマで、FBIが難事件を解決するというストーリーである。NUMB3RSが特徴的なのは、事件解決のポイントが天才数学者の閃きにかかっている点である。


CSIが現場の科学的捜査(鑑識)に焦点を当てたように、NUMB3RSではさまざまなデータ(現場の地理的分布や犯罪の特徴など)から方程式を作りだし、それによって次の犯罪を予測したり、犯人の住所を推定したりする。


というストーリーなので、当然画面には超複雑な数式が何度も出てくる。始めてみたときは当然「数式は、リアリティを出すための小道具だろう」と思ったのだが、Wikipediaを調べて驚いた。
番組内で提示されている数学は現実のものである。黒板上の方程式は正しいもので、各回の番組内の状況に実際に適用できる。
全米数学者協会のこのコラムによれば、実際にCalTechの数学者がコンサルタントとして制作に協力しているそうだ。(ちなみにNUMB3RSの数学者が所属している大学はCalSciという架空の大学である)


これはすごいなーと思うと同時に、なぜここまでリアリズムを追求するのかが気になった。提示される数式が正しいかどうかなどほとんどの視聴者は気にしないし、気にしたところでわかる人はほとんどいない、と断言できる。また、この「実際に適用できる正しい数式である」という情報は、公式サイト(英語 / 日本語) には書いていない。私はWikipediaで初めて知った次第である。従って、マーケティングにも役だっていない。


数学者にコンサルティングを依頼することは、時間的にも金銭的にもコストがかかるはずで、何らかのベネフィットがなければ依頼しないだろう。製作者が「実際の数式だけが持つ本物のリアリティが、たとえ視聴者は理解できなくても、ドラマのクオリティを上げるだろう」と考えたのだろうか。だとしたら、それは制作者としてのprofessionalismを感じるようで、なんとなく嬉しくなる。


ちなみに同コラムによれば、シーズン1の始めの方の、連続レイプ事件と連続銀行強盗とは、実際にあった事件をベースにしていて、どちらも実際に数学者が操作に協力し、実際に数式が使われたそうな。うーん、アメリカの犯罪捜査って進んでるなー。