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' が切れているのがわかるでしょうか。