仙石浩明の日記

2009年10月8日

__sync_bool_compare_and_swap_4 とは何か? ~ glibc をビルドする場合は、 gcc の –with-arch=i686 configure オプションを使ってはいけない

glibc-2.10.1 をビルドしようとしたら、 「__sync_bool_compare_and_swap_4 が定義されていない」 というエラーが出た:

senri:/usr/local/src/glibc-2.10.1.i386 % ../glibc-2.10.1/configure
        ...
senri:/usr/local/src/glibc-2.10.1.i386 % make
        ...
/usr/local/src/glibc-2.10.1.i386/libc_pic.os: In function `__libc_fork':
/usr/local/src/glibc-2.10.1/posix/../nptl/sysdeps/unix/sysv/linux/i386/../fork.c:79: undefined reference to `__sync_bool_compare_and_swap_4'
/usr/local/src/glibc-2.10.1.i386/libc_pic.os: In function `__nscd_drop_map_ref':
/usr/local/src/glibc-2.10.1/nscd/nscd-client.h:320: undefined reference to `__sync_fetch_and_add_4'
        ...
/usr/local/src/glibc-2.10.1.i386/libc_pic.os: In function `*__GI___libc_freeres':
/usr/local/src/glibc-2.10.1/malloc/set-freeres.c:39: undefined reference to `__sync_bool_compare_and_swap_4'
collect2: ld returned 1 exit status
make[1]: *** [/usr/local/src/glibc-2.10.1.i386/libc.so] Error 1
make[1]: Leaving directory `/usr/local/src/glibc-2.10.1'
make: *** [all] Error 2

__sync_bool_compare_and_swap_4 は gcc の組み込み関数なので、 関数が未定義であることを示す 「undefined reference to ...」 というエラーメッセージは、 誤解を招く不親切なメッセージだと思う。

__sync_bool_compare_and_swap_4(mem, oldval, newval) は、 mem が指し示すメモリの値 (4バイト分) が oldval であれば newval に変更する、 という操作をアトミックに行なう組み込み関数。 アトミック (不可分) 操作とは、 操作の途中が存在してはいけない操作のことで、 この例なら比較 (メモリの値が oldval か?) と代入 (newval に変更) が必ず 「いっぺん」 に行なわれ、 「比較だけ行なったけどまだ代入は行なわれていない」 という状態が存在しないことを意味する。

アトミックに行なうためには、 当然ながら CPU でその操作をサポートしている必要がある (複数個の命令の列で実現しようとすると、 命令列の半ばを実行中の状態が必ず存在してしまう) わけだが、 残念ながら Intel 386 プロセッサでは、 この compare_and_swap (CMPXCHG 命令) をサポートしておらず、 サポートするのは Intel 486 以降の CPU である。 テストプログラムを書いて試してみる:

#include <stdio.h>

int main() {
    int mem[1], oldval, newval;
    oldval=0;
    newval=1;
    mem[0] = 0;
    __sync_bool_compare_and_swap(mem, oldval, newval);
    printf("mem[0]=%d\n", mem[0]);
    return 0;
}

見ての通り、 mem[0] の値を oldval の値 (0) と比較し、 一致していたら newval の値 (1) を代入し、 mem[0] の値を表示するだけのプログラムである。

関数名が 「__sync_bool_compare_and_swap」 であって、 後ろに 「_4」 がついていないことに注意。 gcc が引数の型 (この例では int) を見て、 その型のビット長を後ろにつけてくれる (この例では int 型は 4 バイトなので 「_4」 をつけてくれる)。

gcc では 「-march=タイプ」 オプションを指定することによって CPU タイプを指定できる。 -march オプションを指定しなかったり (この場合は全 CPU でサポートされる組み込み関数のみ利用できる)、 あるいは -march=i386 を指定したりすると、 コンパイル時にエラーになる:

% gcc -Wall test.c
/tmp/cc4eNX6L.o: In function `main':
test.c:(.text+0x3b): undefined reference to `__sync_bool_compare_and_swap_4'
collect2: ld returned 1 exit status
% gcc -Wall -march=i386 test.c
/tmp/cc6chtFj.o: In function `main':
test.c:(.text+0x36): undefined reference to `__sync_bool_compare_and_swap_4'
collect2: ld returned 1 exit status
% gcc -Wall -march=i486 test.c
% ./a.out
mem[0]=1

いまさら i486 というのもアレなので、 今なら i686 を指定するのがよさげ。 私の手元にはいまだ PentiumIII マシンがあるものの、 PentiumIII より古いマシンはない (昨年 ML115 と SC440 を買ったとき PentiumII マシンを引退させた) ので、 pentium3 を指定すれば SSE (Streaming SIMD Extensions) が利用できるようになるが、 glibc をビルドするときに必要かというと、 たぶん必要ない。

というわけでエラーの原因は分かったが、 では glibc をビルドするときは、 どうすればいいだろうか?

とりあえず google で検索してみたら、 gcc の configure オプションに 「--with-arch=i686」 を指定して gcc をビルドする必要がある、 と書いてあるページが見つかった。

--with-arch オプションは、 -march のデフォルトを設定するための configure オプションである。 つまり 「--with-arch=i686」 を指定して gcc を再インストールすると、 gcc に -march オプションをつけなくてもデフォルトが i686 になる。 なるほど確かにそうすれば、 glibc 側で何も変更せずに __sync_bool_compare_and_swap_4 関数が使えるようになりそうである。

いまどき i686 以前の CPU 用のコードが必要になりそうなケースは滅多にないだろうから、 -march オプションのデフォルトを i686 にするのも悪い選択ではないように思えた。 gcc をビルドし直すのは面倒だなーと思いつつも、 ついでに gcc のバージョンを上げておこうと gcc-4.3.4 をダウンロードしてきて 「--with-arch=i686」 付でビルドしてみた。

ところが!

More...
Filed under: システム構築・運用,プログラミングと開発環境 — hiroaki_sengoku @ 09:39
2009年10月1日

新卒の内定者とかけて、がらがらの道路ととく。その心は? hatena_b

KLab(株)は、 2007年から新卒採用を行っています。
今年も例年通り、10月1日に内定式を行いました。

- o -

みなさん、内定おめでとうございます。 社長のお話が終わり、 みなさんは自己紹介が終わって、 緊張もだいぶほぐれてきたのではないかと思います。 これからの私の話はどーでもいい話なので、 リラックスして聞いてもらえればと思います。

唐突ですが、渋滞が起きる原因って知っています?

みなさん、いきなり何を言い出すんだ、という顔をしていますね?

渋滞が起きる理由なんて、 そりゃ車が多いからに決まってるだろう、 という声が聞こえてきそうです。 確かに道路を流れる車がどんどん増えると、 交通量がある限界を越えると、 渋滞になるのはアタリマエのような感じがします。

でも、 大渋滞が起きているときと、 混んではいるけど流れているときの交通量と、 どのくらい違うと思いますか? あ、もちろん工事や事故などで車線が減っている場合は、 そのぶん交通量は減りますから、対象外とします。 高速道路など流れを妨げるものが特にない道路で起きる、 いわゆる自然渋滞についてのみ考えます。

確かに大渋滞のときって車がたくさん詰まってるので、 交通量が非常に大きいような気がしますが、 みんなノロノロ運転だったり、 ひどい渋滞だと完全に流れが止まってしまっているときもあるわけで、 極端に言えばいくら車の台数が多くても、 スピードがゼロであれば、 ゼロに何台掛けてもゼロですから、 交通量としてもゼロです (正確には、 交通量[台/時間] = 車数[台] * 車速[距離/時間] / 車間[距離])。

ぐだぐだ説明してしまっているからすでにおわかりだと思いますが、 実は普通に流れているときも、 ノロノロ渋滞も、 交通量の観点で言うとほとんど変わりません。 むしろ渋滞一歩手前の流れているときの方が流量は多いかもしれません。

さて私は何を言いたいのでしょうか?

道路というのは押し並べて車を流すことが目的であるわけです。 つまり交通量というのは道路の「成果」ですね。 流れている道路と、大渋滞の道路、 「成果」が変わらないのに大渋滞の道路は大変な苦痛を伴います。

同じ成果が得られるなら、 苦痛が無い方がいいに決まってます。 ところが先月の大型連休のように、 交通量が増えると決まって大渋滞が起きますし、 会社では受注量が増えるとデスマーチが起きたりしますし、 「忙しい忙しい」 が口癖の人は、 TODOリストが長くなればなるほど気が急いてしまって仕事が手につきません。 先手先手で仕事をまわしている人と、 後手後手にまわってしまっている人とでは、 やってる仕事の量自体は大差なくても、 天と地ほどの評価の差がついてしまったりします。

どうやったら渋滞を防げるのでしょうか? 交通量が増えてしまってから防ごうと思っても、 大量の車を前にしては、 なすすべありませんよね。

みなさんは今、がらがらの道路なのだと思います。 どうやったら渋滞を起こさずに成果を出し続ける人生を歩むことができるようになるのか、 これから入社までの半年間じっくり考えてみてはいかがでしょうか。

Filed under: 元CTO の日記,自己啓発 — hiroaki_sengoku @ 11:46
2009年9月29日

無線LANコントローラ VIA VT6656 を Linux 2.6.30.8 で使ってみる

VIA Technologies の無線LAN コントローラ チップ VT6656 は、 SOTEC C10x や工人舎SC/SX などのネットブック / UMPC や、 Wyse USB 802.11 b/g Wireless Network Adapter などの USB 無線LAN アダプタなどで広く使われている。 香港で買った OLEVIA X10A-1160 でも、 このチップが使われてた (SOTEC C101 と同型機だから当然)。

幸い、 VIA Technologies が VIA Arena にて Linux 用の GPL なドライバ (vntwusb カーネル モジュール) VT6656_Linux_src_v1.19_12_x86.zip を公開しているので、 Linux 2.6.28 までは 簡単に無線LAN を利用できる。 Linux 2.6.29 になって、 「struct net_device」 (カーネル ソース include/linux/netdevice.h の中で定義されている) が変更されたので、 そのままではコンパイルできなくなったが若干のパッチをあてることで対応可能 (ではあるが、後述する方法のほうがお手軽)。

ところが、 VIA Arena が模様替えして、 上記無線LAN ドライバがダウンロードできなくなってしまった。 正確に言うと、 VT6656_Linux_src_v1.19_12_x86.zip のファイル自体はまだダウンロードできるのだが、 そこへ至るページが無くなってしまっている (私が見つけられないだけならいいのだが...)。 これは VIA Technologies としてはサポートを行なわないという意思表示なのか?

VIA Technologies がサポートしてくれなくても、 GPL で公開されているのだからなんとかなるだろうと思っていたら、 既に Linux 2.6.32-rc1 に Staging drivers (not of the "normal" Linux kernel quality level) として含まれていた。 内容を見てみると、 VIA Arena で公開されていたドライバほとんどそのままである。

というわけで、 Linux 2.6.32-rc1 のディレクトリ drivers/staging/vt6656 を Linux 2.6.30.8 の drivers/staging/ の下へそのままコピーし、 以下のパッチ (2行追加するだけ) をあててカーネルを再構築してみたら、 vt6656_stage.ko が生成された。

diff -ur linux-2.6.30.8.org/drivers/staging/Kconfig linux-2.6.30.8/drivers/staging/Kconfig
--- linux-2.6.30.8.org/drivers/staging/Kconfig        2009-09-25 00:28:02.000000000 +0900
+++ linux-2.6.30.8/drivers/staging/Kconfig        2009-09-28 13:49:36.026075562 +0900
@@ -115,5 +115,7 @@
 
 source "drivers/staging/serqt_usb/Kconfig"
 
+source "drivers/staging/vt6656/Kconfig"
+
 endif # !STAGING_EXCLUDE_BUILD
 endif # STAGING
diff -ur linux-2.6.30.8.org/drivers/staging/Makefile linux-2.6.30.8/drivers/staging/Makefile
--- linux-2.6.30.8.org/drivers/staging/Makefile        2009-09-25 00:28:02.000000000 +0900
+++ linux-2.6.30.8/drivers/staging/Makefile        2009-09-28 14:06:25.949515761 +0900
@@ -40,3 +40,4 @@
 obj-$(CONFIG_HECI)                += heci/
 obj-$(CONFIG_LINE6_USB)                += line6/
 obj-$(CONFIG_USB_SERIAL_QUATECH_ESU100)        += serqt_usb/
+obj-$(CONFIG_VT6656)                += vt6656/

起動してみると自動認識してドライバが組み込まれた:

vt6656_stage: module is from the staging directory, the quality is unknown, you have been warned.
VIA Networking Wireless LAN USB Driver 1.19_12<5>VIA Networking Wireless LAN USB Driver Ver. 1.19_12

vntwusb.ko と vt6656_stage.ko でモジュール名は異なるが、 バージョンはどちらも 1.19_12 で同じ。 「Staging」 だから 「Linux カーネルの品質レベルではない」 とのことだが、 今のところ WEP および WPA2 EAP-TLS で安定して接続できている。

Filed under: ハードウェアの認識と制御 — hiroaki_sengoku @ 19:21
2009年9月14日

文字化けしていなくても MySQL 内の文字コードが正しくない場合がある hatena_b

MySQL 5 からテーブルごとに文字列のエンコーディングを指定できるようになった (「そんなことは知ってるYO!」という人も多いと思うので、 そういう人は「これからが本題」 の部分まで読み飛ばして欲しい)。 例えばテーブルを作るときに、

mysql> CREATE DATABASE test;
Query OK, 1 row affected (0.05 sec)

mysql> USE test
Database changed
mysql> CREATE TABLE user ( name VARCHAR(255) ) CHARSET=utf8;
Query OK, 0 rows affected (0.05 sec)

などと 「CHARSET=utf8」 を指定すれば、 文字列を UTF-8 エンコーディングで格納する。 「CHARSET」 すなわち 「文字集合」 と、 エンコーディング (文字符号化) は本来別の概念であるが、 MySQL の場合は両者をまとめて CHARSET ないし character_set と呼んでいるので、 ここではそれを踏襲してキャラクタセットと呼ぶことにする。 MySQL のシステム変数のうちキャラクタセットに関連するものは、 以下のように沢山ある。

mysql> SHOW VARIABLES LIKE 'character\_set\_%';
+--------------------------+--------+
| Variable_name            | Value  |
+--------------------------+--------+
| character_set_client     | latin1 |
| character_set_connection | latin1 |
| character_set_database   | latin1 |
| character_set_filesystem | binary |
| character_set_results    | latin1 |
| character_set_server     | latin1 |
| character_set_system     | utf8   |
+--------------------------+--------+
7 rows in set (0.00 sec)

たくさんあってややこしいが、 重要なのは 「character_set_client」 と 「character_set_connection」 「character_set_results」 で、 この3変数はクライアントがクエリを送信し、 クエリ結果を受信するときのキャラクタセットを設定する。 charset コマンド (あるいは SET NAMES) を使うと、 クライアント側のキャラクタセットに関係するこの3変数を一度に変更できるので、 特に必要がなければこの3変数は常に同じキャラクタセット、 すなわちクライアント側で送受信するキャラクタセットに一致させておくとよい (PHP スクリプトから MySQL をアクセスするときは、 mysql_set_charset() を使ってクライアント側のキャラクタセットを設定する)。

mysql> CHARSET utf8
Charset changed
mysql> SHOW VARIABLES LIKE 'character\_set\_%';
+--------------------------+--------+
| Variable_name            | Value  |
+--------------------------+--------+
| character_set_client     | utf8   |
| character_set_connection | utf8   |
| character_set_database   | latin1 |
| character_set_filesystem | binary |
| character_set_results    | utf8   |
| character_set_server     | latin1 |
| character_set_system     | utf8   |
+--------------------------+--------+
7 rows in set (0.00 sec)

mysql> INSERT INTO user VALUES ('仙石 浩明');
Query OK, 1 row affected (0.00 sec)

mysql> SELECT name, HEX(name) FROM user;
+-----------------+--------------------------------+
| name            | HEX(name)                      |
+-----------------+--------------------------------+
| 仙石 浩明      | E4BB99E79FB3E38080E6B5A9E6988E |
+-----------------+--------------------------------+
1 row in set (0.00 sec)

このように 「select HEX()」 で確認すると、 文字列が正しく UTF-8 エンコーディングで格納されていることが確認できる。

蛇足だが、mysql クライアントが GNU readline を使っている場合は、 ~/inputrc などで 「set convert-meta Off」 を設定しておく。 デフォルトの readline では convert-meta が On なので、 キャラクタの最上位ビット (MSB) を 0 にしてしまう。 つまり UTF-8 (および EUC-JP や Shift_JIS) などの 8bit キャラクタセットだと、 MSB が 1 である文字が正しく送信されない。 例えば 「あ」 (UTF-8 で E3 81 82) を入力しようとしても、 MSB が落ちた 「c^A^B」 (63 01 02) が送られてしまう。

「character_set_server」 が latin1 になっていて気持ち悪いかも知れないが、 このシステム変数は新しく database を作るときのデフォルトを設定するものなので、 (latin1 な database は金輪際作らないというのでも無い限り) 変更する必要はない。

latin1 になっているもう片方の変数 「character_set_database」 は、 デフォルト database に合わせて (つまり USE コマンドを発行するごとに) サーバがこの変数を変更するので、 これもユーザが変更する必要はない。

前置きが長くなったが、これからが本題

UTF-8 なテーブルを読み書きする際は、 「charset utf8」 コマンドを送信してクライアント側のキャラクタセットを UTF-8 に設定すればよいのであるが、 デフォルトが latin1 であるクライアントも多い。 PHP などから MySQL サーバにアクセスする場合なども、 (PHP のビルド方法にも依存するが) デフォルトは latin1 になっている (PHP の場合 mysql_client_encoding() で確認できる)。 このようなクライアントをデフォルトの latin1 のままで使うとどうなるだろうか?

More...
Filed under: システム構築・運用 — hiroaki_sengoku @ 08:19
2009年9月2日

自分が何が出来るかじゃないんですよ。何がやりたいかだと思うんです。 hatena_b

以前、(株)ウェブキャリアの川井社長(当時)に取材していただいて、 お話しした内容が 「Webエンジニア武勇伝」として掲載されていたのですが、 現在その「武勇伝」のページが一時的に閉鎖されているのと、 幸い川井様から転載の許可をいただけたので、ここに全文を掲載します:

川井
本日は、Webエンジニアの武勇伝ということでお願いいたします。 趣旨については、メールでも触れましたが、 弊社の行っているエンジニアのキャリア支援事業の一環として、 「エンジニアのためのロールモデル」を提示したいと思っておりまして、 トップエンジニアの方々のインタビューを通じて、 そのヒントを提供できればと思っております。
仙石
なるほど。こちらこそよろしくお願いします。
川井
仙石さんのようなすごい方になると、 若いエンジニアからすると雲の上の存在でもあるので、 親近感を与えるためにも子供の頃のお話などもお聞きしています。
仙石
どういうところが「雲の上の存在」と感じるんですかね?
川井
ポジションもありますし、 ネット上でお名前がいっぱい出ているというのが大きいんじゃないでしょうか。
仙石
ポジションといってもたかがベンチャーですし、 どうということはないと思いますよ。 名前が出ているのも昔から長いことやっているだけですから。 まあ、そう思う人が多いっていうのも私なりには分かっているんですけども、 ある程度、技術が好きな人であればほとんどの人が、 私と同程度のことはできるんじゃないかなって気がします。
もしも、自分にはそんなことができないって思うんであれば、 できないと思うことこそが出来ない理由なのかなって思います。 自分で自分をけなしてもしょうがないんですけど、 私がやってきたことなんて誰にでもできることなんじゃないかなっていうのが 正直な感覚なんですよ。 ある意味、やる気があればできる世界じゃないでしょうか。
川井
なるほど。 ブログで拝見した「向き不向き」という話もありますし、 のちほどその辺りも詳しくお聞きしたいと思います。 それでは、まずはコンピュータとの出会いからお聞きしたいと思います。 コンピュータとの出会いは中学1年くらいだとおっしゃっていましたけど、 学校でという感じですか?
More...
Filed under: 元CTO の日記,技術者の成長 — hiroaki_sengoku @ 08:02
2009年8月18日

中学校の同窓会のデータベースを作ってみた

40歳前後になると同窓会に行きたくなる。 20歳代は自分自身に対して投資を行なう 10年間、 30歳代がそのリターンを得る 10年間とすれば、 自己投資の回収をほぼ終えて、 次の展開を考え始めるのが 40歳前後ということになろう。

27年ぶりに会う同窓生は、 30歳代に築いた人脈とは全くつながりがない人が多いわけで、 今までとは全く異なる展開を人生にもたらすかもしれない。 というわけで、中学校の同窓会の幹事になってみた。 正確に言うと、 (大阪の)中学校の同窓会の東京支部の幹事になることを、 中学校の恩師に頼まれたのであるが、 このチャンスを活かさない手はない。

私は中学校を 1982年に 34期生として卒業した。 1~61期の同窓生にどうやって年一度の総会に来てもらうかが、 幹事になった私の最初にして最大の課題。 我々の世代は、IT の視点から見ると過渡期で、 私より上の世代は、メールすらほとんど使いこなせないアナログ世代、 私より下の世代は、デジタルネイティブ世代。 上の世代は、総会通知に往復葉書 (復信は出欠連絡用) を使っていたが、 30年近くもたてば、多くの人が引越ししてしまっていて、 郵便が届かなくなるのは自明の理。 かといって下の世代はまだ 30歳代以下で、 同窓会なんかには興味がない。 勢い、同窓会の IT 化は我々の手に委ねられることになる。

まず IT 化の第一歩として、同窓会のデータベースを作ってみた。 データベースといっても、 名前とメールアドレス、 および総会への出欠とメッセージを登録できるだけの簡単なもの。 同窓会用のシステムなんて既存のものがいくらでもありそうだが、 機能が多すぎで、(ケータイ メールくらいしか使えない) 上の世代には取っつきにくそうなのと、 他人が作ったシステムの使い方を調べるより自分で作ってしまった方が早いので、 仕事の合間に計1日くらいで開発。

同窓生の大半に対して、既に連絡がつかなくなってしまっているので、 一人でも多くの同窓生に、 このデータベースへメールアドレスを登録してもらうところから始める他ない。 まずはメールアドレスが判明している同期に以下のようなメールを送ってみた。

メール本文中、 「%%NAME%%」 および 「%%DBURL%%」 は、 データベースに登録されているデータを使って、 それぞれ 「同窓生の名前」 と 「データベースへアクセスするためのURL (認証文字列を含む)」 に置き換えられる。 また、 「%%SCHOOL%%」 「%%ASSOC%%」 「%%ASSOCURL%%」 はそれぞれ、 「中学校の名称」、「同窓会の名称」、「同窓会ページの URL」 の伏字。

末尾に書いているように、 (PC でもケータイでも) 「同窓会ページの URL」へアクセスしてもらうことさえできれば、 (IT の知識に乏しくても) 容易にデータベースに新規登録してもらえるようなシステムを目指している (同窓生でない人が勝手に登録するのをどうやって防ぐかという問題は、 とりあえず脇へ置いておく)。 予備知識 (データベースの概念とか。もちろん DBMS とかの専門的な事じゃなくて、 サーバにデータを登録できるといったような単純な概念) が無くても、 同窓会ページの説明を読むだけで登録を行なえるようになることが望ましいが、 説明文が長すぎるとケータイで読みにくくなってしまうのが、 悩ましいところ。

%%NAME%% さま

%%SCHOOL%%で 3年D組だった仙石浩明です。ご無沙汰しております。

石田先生に依頼されたのをきっかけに、東京%%ASSOC%%の幹事をやっております。
「東京? 行く機会なんて滅多に無いよ!」と思われても、もうちょっと辛抱
して聞いてください。

東京%%ASSOC%%では、毎年11月に総会を開催しているのですが、昨年まで開催通知と
出欠連絡に往復葉書を使っていました。東京%%ASSOC%%の名簿には千人を超える
同窓生が登録されているのですが、その一人一人に往復葉書 (一枚 100円) を
出すわけで、総会開催費用のかなりの部分を郵送費が占めてしまう、という
笑えない事態になっていました。

すなわち、総会に参加した人に払って頂いた参加費のうち、少なくない部分が、
欠席者宛に送った往復葉書の費用に消えてしまうわけです。その結果、参加費を
高くせざるを得ず、高い参加費を敬遠して参加者が減ってしまう、という悪循環
が発生しかねない状況でした。本家大阪の%%ASSOC%%でも似たような状況が発生して
いるのかもしれませんね。

私は 10年ほど前に KLab(株) という IT ベンチャーの立ち上げに関わって以来、
KLab(株) の CTO (最高技術責任者) を勤めておりますが、東京%%ASSOC%%の窮状を
IT の力 (笑) で救えないかと柄でもないことを思い始めてしまい、総会の開催
通知と出欠連絡をインターネット経由で行なうシステムを作ってみました。

まあ、システムつーても大層なものではなく、データベースに同窓生のみなさん
の名前とメールアドレスを登録し、ついでに総会への出欠とかメッセージとかを
登録し、誰が総会に出るのかみんなが確認できて、「同期の○○さんが参加する
なら私も参加しよう」とかいう感じで参加者が増えてくれるといいな~といった
ものです。

以下の URL にアクセスすると、データベースに登録されている%%NAME%%
さんのデータを確認できます。万一誤りがありましたら修正してもらえると
幸いです。

%%DBURL%%

メッセージを入力する欄もありますので、何か書込んでもらえると嬉しいです。
もちろん、東京近郊にお住まいであれば、総会への参加も検討して頂き、
絶対参加できないというのでなければとりあえず「参加」にしておいて下さい。
変更はいつでも可能ですから。あ、ちなみに今年は 11/29(日) に開催されます。

「登録」ボタンを押したら、次にその下にある「総会参加予定者の一覧」を
クリックしてみてください。同窓生のみなさんが入力したメッセージを
読むことができます。

現時点では「東京」%%ASSOC%%のデータベースなのですが、別に「東京」限定では
なく、本家の大阪でも、そしてさらにはその他の地域でも、同窓会を開くのに
使えるんじゃないかと思います。「東京に行く機会なんて無いよ!」という
場合も、是非使ってみて頂ければ幸いです。

そして何かご要望があれば遠慮無く言ってください。こんな機能があればもっと
使えるのに、とかありましたら、いちおー CTO なんで、仕事の合間にどんどん
作ります。

このデータベースには「幹事フラグ」があって、各期の同窓生に対してメールを
送る機能もあります。実はこのメールもこの送信機能を使って送っています。
同窓生に呼び掛けたい場合は連絡して頂ければ「フラグ」を立てます。なお、
フラグが立っていてもデータベースに登録されているメールアドレスを参照する
ことはできません、あくまで送るだけです。

最後に、もし%%ASSOC%%の同窓生をご存じでしたら、新しい(東京)%%ASSOC%%ページ
%%ASSOCURL%% へアクセスしてデータベースに新規登録するよう
お伝え頂けませんか? このデータベースが同窓生みなさんの再会のきっかけと
なれば幸いです。
More...
Filed under: その他 — hiroaki_sengoku @ 09:26
2009年6月24日

初めて株の「カラ売り」をやってみた ~ 年度末に日経225 買い支えが入る中、見なし値上位の赤字企業を狙う hatena_b

私は大学生の時から株の売買をやっている。 といっても、 所詮は理系の学生が興味本位でやっていたことなので、 売買額も「お小遣い」の範囲。 初めて証券会社の店頭へ行ってみたのが ブラックマンデー (1987年10月19日) の記憶も生々しい 1988年初め。 その後バブル崩壊、平成金融不況、ネットバブル崩壊を体験し、 そして今回の世界恐慌を体験中であるが、 なにせ投じている金額が微々たるものなので、 損失もさほどではない。

いま振り返ってみると、 日経225 (日経平均株価) が最高値をつけたのは 1989年12月29日のことなので、 右肩上がりだったのは株を始めてわずかに 2年間で、 その後 20年間は右肩下がり、 しかも今現在は 1988年のスタート時点の半値以下に下がっている。 これでは長期投資では儲かるはずがないということにようやく気付いたが (遅すぎ! ^^;)、 かといって短期売買するほど相場に思い入れがあるわけではなく、 マーケット情報のウォッチに時間を費やすより、 コンピュータをいじっていたい性分なので、 株売買で儲けられないのは当然の成行。

ところが、 リーマンショックがまだ癒えない 2009年3月11日、 日経225 が今年 2番目の上げ幅 (3/11当時) を記録した。 別にマーケットをウォッチしていたわけではなく、 フツーに報道していたので多くの人が気に留めたはず。 この反騰を受けて報道では景気の先行きについて楽観的な見方を繰り返していたが、 「100年に一度」の世界恐慌が、 この程度の下げで V字回復するわけがないということくらい、 経済に疎い私だって分かる。 ということは株価を上げたいと考えている人が無理に買い上げているに違いない。

もちろん、テレビが率先して景気の先行きが暗いことを吹聴しては、 景気が余計に悪くなるのであえて楽観論のみ強調しているのだろうが、 甘い見通し報道を真に受けて投資したりすれば痛い目にあう、 ということは 20年間にわたって高い授業料を払って学んだところ。

株に関するブログなどをテキトーに拾い読みしてみると、 年度末である 3月に日経225 がある水準を下回ると、 金融機関などの決算上よろしくないことが起るらしく、 そのため誰かが株価を支えているということらしい。 真偽のほどは分からないが、 あまり健全とは言えない株価上昇だということだけは私にも分かる。

ムリヤリ買い上げた株価はいつかは下げるはずで、 しかもこれが決算対策ということであるなら、 4月に入れば上げた分が丸々下がる可能性が高い。 株価の上げ下げなんて、 当たるも八卦当たらぬも八卦の世界だと思っていたのだが、 今回ばかりは「無理な買い上げ」という原因がはっきりしているだけに、 ほぼ確実に下がりそうである。

というわけで、生まれて初めての空売り (からうり, 株を所有していないのに売る契約を結ぶこと) に挑戦してみることにした。 3月末に空売りするぞっと、 思った即その場で、 (普段利用している) ネット証券のサイトの信用取引方法の解説ページに目を通した。 ネットで申し込めば審査が行なわれ、 審査OK ならば数日後に取引開始できるらしい。 審査で落ちれば仕方がないが、 とりあえず申し込んでみるだけ申し込んでみようと、 これまたその場で申込みを終える。 これが 3/11 (水) 20:35 のこと。 大幅反発のニュースを知ってからここまで 1時間も経っていない (^^;)。

驚いたことに 3/13 (金) 03:45 には信用取引口座を開設可能とのメールが来ていた。 まだ 31時間しか経っていないのだが... こんなに早く済むとは、どんな審査なんだろうか? 結局 3/14 (土) には取引可能状態になっていた。

次の問題は、 どの銘柄を空売りするか? まず第一に、赤字企業であること。 大恐慌といえど儲かっている会社も中にはあるわけで、 そんな銘柄を空売りした後に株価が上がってしまっては目もあてられない。 むこう 1年くらいは赤字が続く予想が出ていながら、 株価が堅調に推移している不自然な会社を探すことにした。

第二に、日経225 算出の際の「みなし値」が高いこと。 日経225 は各銘柄を「50円換算」したときの株価を、 単純に合計して平均値を求めている。 だから「みなし値」が高いほど日経225 への影響度が高く、 日経225 をつり上げようとする人にとっては好都合となる。 ちなみに日経225 の騰落にどのくらい影響を与えたかを寄与額と呼ぶらしいが、 見なし値が高い銘柄ほど小幅の株価上昇で寄与額が大きくなる。 寄与額と株価変動額との比率を寄与率と呼び、 一般に値嵩株 (ねがさかぶ, 株価が高い株式) ほど寄与率が大きくなる。

また、 時価総額が大きい銘柄だと、 流通している株数も多いだろうから、 少々の資金では株価が動きにくいと思われる。 ということは日経225 をつり上げようとする人が狙うのは、 少ない資金でも値が飛びやすい銘柄なのだろう。 なので第三の条件として、 あまりに有名な超大企業は避けることにした。

ちなみに、 専門家ぶってエラソーに 「みなし値」 だの 「寄与率」 だの専門用語を振り回しているが、 土・日にネットサーフィン (死語) してニワカ仕込みで覚えた知識に過ぎない。 今まで信用取引をしたことがない全くの素人 (=私) でも、 「空売りしよう」と思った直後に一夜漬けで勉強できるのが、 「知の高速道路」たるインターネットのいいところ。

まず「みなし値」が高い順に日経225 採用銘柄を並べてみる。 まずは上位 10銘柄。 もちろんいつの時点での株価を用いるかによって順位は入れ替わるが、 だいたいこんな感じ:

コード銘柄名利益予想
9983ファーストリテイリング54000
6954ファナック26500
6971京セラ12000
4063信越化学130000
7267本田技研80000
9433KDDI260000
7751キヤノン128500
9984ソフトバンク115000
6762TDK2600
8035東京エレクトロン-43000

「利益予想」は来年 2010年度の予想額 (単位 百万円)。 大恐慌にも関わらず意外 (?) に黒字予想の企業が多い。 唯一赤字予想なのが、東京エレクトロン。 実はこれを調べるまで、 東京エレクトロン という会社が日経225 採用銘柄であることはおろか、 そもそも何をやってる会社かさえ知らなかった。 半導体製造装置の開発・製造会社らしい。 半導体製造というと不況業種というイメージを私は持っていたが、 実際あまり芳しくない業績のようだ。 そう簡単には黒字になったりはしないだろう。

ところが、 株価は 3/9 に 2875円の安値をつけた後、 一気に上昇している。 これはいかにも怪しい。 素人の私にも怪しさが伝わってくるくらいだから、 多くの人が怪しいと思ったのだろう。 空売りがどんどん膨らんで、 信用売残が信用買残の 10倍にも達している。 つまり多くの人が空売りを仕掛けているということだ。

ちなみに、 「みなし値」の 10位以降は以下のようになる。

コード銘柄名利益予想
4543テルモ34500
9735セコム56000
4502武田薬品298000
7203トヨタ自動車-750000
4503アステラス製薬172000
6857アドバンテスト-15000
4523エーザイ55400
4704トレンドマイクロ18400
6367ダイキン工業33000
9613NTTデータ45000
3382セブン&アイHLDGS121000
4901富士フイルムHLDGS-54000
6758ソニー-140000

以上 23社が、 日経225 に占める構成比 1% 以上の企業群。 1/225 = 0.4% なので、日経225 に与える影響は平均的銘柄の倍以上。 みなし値 1位のファーストリテイリング (ユニクロの会社) に至っては 構成比が 5% を超えていて、 みなし値最下位の企業群の 100倍以上の影響力を日経225 に対しておよぼしている。

構成比 1% 以上の企業のうち、 トヨタやソニーは超大企業なので除外すると、 赤字予想は東京エレクトロンの他は アドバンテスト富士フイルムHLDGS だけ。 いずれの株価も東京エレクトロンと同様、 3月上旬に安値をつけたあと一気に上昇していてとても怪しい。

というわけで、 狙いを 「東京エレクトロン」「アドバンテスト」「富士フイルムHLDGS」 に絞って、 しばらく株価をウォッチしてみることにした。 参考までに昨年 3月の株価を調べてみると、 東京エレクトロンは 2008年 3/26 に 6580円の高値をつけた後、 翌 3/27 に一気に下落している。 アドバンテストは 3/25 に高値をつけているが、 4月に入ってもあまり下落していないし、 富士フイルムHLDGSはむしろ 4月に入って上昇している。

空売り決行は 3月最終週、 特に 3/24 か 25 に狙いを定めた。

ところが 3/24 (火) は、 朝から学生さんを対象とした会社説明会を開催予定だった。 しかもその直後に KLab (株) の臨時株主総会が開催される。 これは人様の株なんか売ってないで、 自分の会社の心配をせよ、 という天の声なのか? もちろん説明会も総会も参加しないわけにはいかず、 マーケットをウォッチするのは物理的に不可能だった。 よりによって会社説明会と臨時株主総会の日程にぶつかるとわ... (ついでに言うと、総会の後には某出版社の取材が入っていた)

仕方ないので会社説明会に出る前に、 指値で信用売り注文 (空売り) を出しておくことにした。 寄り付き状況を確認した後、 まず 9:09 に東京エレクトロンを 4030円の指値で注文を出したら、 いきなり 9:10 に約定してしまった。 初めての空売りがこんなにあっさり出来てしまうとわ... このまま株価が急騰するとマズイと思い、 すかさず 9:14 に 4180円の指値で追加注文を出す。 ところが株価は 4100円から下がりはじめた。 4180円になる気がしなかったので、 9:24 に 4090円の指値で注文を出した後、 会社説明会へ出る。

会社説明会の後、 ほとんど間をおかず (スーツに着替える時間だけでいっぱいいっぱい) 臨時株主総会。 総会が終わると後場ももうあとわずかである。 結局 4090円までは戻らず、 出来たのは 9:10 の 4030円の指値注文のみであった。 「お小遣いの範囲の売買」なので、 もちろん株数は最低売買単位である 100株だけ。 信用取引では際限のない損失拡大を防ぐことがなにより大事であるので、 売値より 1000円株価が上がってしまったら、 つまり損失が 10万円に達したら、 問答無用で損切り (ロスカット) しようと決めている。

翌 25日も指値空売り注文を出していたのだが、 株価は戻らず結局出来なかった。 マーケットの状況も気にはしていたのだが、 実は 25日の朝は HP ML115G5 (Athlon 1640B マシン) が 11750円 (送料・消費税込) で売られていたのを見つけてしまい、 衝動買いしてしまった。 劇安PC によってマーケットへの集中力が削がれてしまった感は否めない。 このマシンはサーバ仕様と言いつつ PCIe x16 スロットがあるので、 普通のデスクトップマシンとしても充分使える。 また ECC 無しメモリも使えるので安価なメモリを利用できる。 だから週末は秋葉へ行ってグラフィックボードとメモリを買おうなどと考え出すと、 マーケットのことなど、 もうどうでもよくなってしまう (^^;)。

東京エレクトロンはその後 3/27 に 4120円、 いったん下げた後 4/2 に急騰した。 なぜ 4 月に入っても上がり続けるのか? (後で知ったが G20 期待だったらしい) と思いつつも、 ここで慌てて手仕舞するようでは信用取引をする意味がない。 いったん空売りを行なったからには、 ロスカット条件に達するまでは徹底して売り続ける必要がある。 4/2 に 4090円で、追加の空売りを行なった。

More...
Filed under: 経済・投資・納税 — hiroaki_sengoku @ 08:19
2009年5月14日

天国を見下ろすハイキング (Pillbox Hike) ~ ラニカイ ビーチ (Lanikai Beach) を山 (Kaiwa Ridge Trail) から見下ろしてみた

世界一美しいビーチと言われている (参考: 10 Best Beaches In Hawaii)、 ハワイのオアフ島にある ラニカイ ビーチ (Lanikai Beach, Lani はハワイ語で 「天国」、kai は 「海」 という意味なので、 Lanikai は 「天国の海」 という意味)。 このビーチの隣に 600フィート (180メートル) ほどの山があるので、 山道を登って上から見下ろしてみた。↓

Lanikai Beach from Kaiwa Ridge Trail

コンパクトカメラによる撮影だと色の再現性に難があるが (もちろん私の撮影スキルにも難あり ^^;)、 この青 (というか緑?) は 「天国」 (Lani) の名に恥じない美しさだと思う。

More...
Filed under: Hawaii — hiroaki_sengoku @ 08:21
2009年4月30日

ハワイでプリペイド SIM カードを買ってみた ~ 米国で携帯電話が 1日1ドルで使い放題 hatena_b

米国で携帯電話を使いたい場合、 (1)海外ローミング、 (2)レンタル携帯電話、 (3)携帯電話 and/or SIM カードの購入、 の三つの方法が考えられる。 (1) は日本で使っている携帯電話をそのまま使える点で手軽だが、 日本と国際通話する場合ならまだしも、 米国内で通話する場合まで国際電話扱いになるので通話料が極めて割高となる。 (2) は (1) ほど高くないにしても、 普通の携帯電話と比べると基本料が割高 and/or 通話料が割高なので、 1~2週間の滞在で毎日通話していると、 米国内通話だけでも 1万円以上かかってしまう。

私は今まで米国では (2) レンタル携帯電話を使っていたのだが、 今回は二週間強ハワイ (オアフ島) に滞在するので、 (3) プリペイド SIM カードを購入することにした。 米国でプリペイド SIM カードが購入できるのは AT&T ストアだけ (T-Mobile などでは携帯電話ごと購入する必要がある) なので、 ホノルルに到着して (ホテルへ行く前に) まず立ち寄った Ala Moana Center (ショッピングモール) で、 at&t ストアを探した

SIM カードを 2枚買って、 HTC P3600Motorola ZN200 に入れて使うつもり。 at&t Pay As You GoUnlimited Talk プランだと、 一日 1ドルの固定料金だけで at&t携帯電話同士の通話が無制限に可能 (通話しない日は無料)。 at&t携帯電話以外との通話は、10セント/分。 $.25 per minute プランの場合は 25セント/分なので、 一日の通話が 4分以内に限られるならこちらを選んでもよい。

ところがモールマップ を見ても、 at&t ストアが見つからない。 google map で検索すると、 確かに at&t ストアが Ala Moana Center 内にあるように表示されるのだが... 仕方ないので携帯電話を扱っている RadioShack へ行って店員に聞いてみる。 すると Sears (モール西端にあるデパート) の中にあるとの答。 なるほど、だからモールマップには載っていないのか...

RadioShack を出て駐車場沿いに歩いて Sears へ。 Sears の入口から入るとすぐ at&t ストアが目に入った。 ところが先客が 4組ほどいて (iPhone を買っている人もいた)、 待てど暮らせど順番がまわってこない。 結局 1時間ほど待つ羽目になった。 私の後にはほとんど並ぶ人はなく、 開店直後は待っている客が多くて混む、 ということだったようだ。 開店時刻 (平日9:30, 土曜9:00, 日曜9:30) 前から並ぶか、 あるいは逆に遅い時間、例えばお昼頃に行けばよさそうだ。

ようやく順番がまわってきて、 携帯電話二台を示しながら、 これ用にプリペイド SIM カードを二枚欲しいと店員に言うと、 そういうお客は多いのだろう、 話はすぐ通じた。 店員が、この携帯電話はアンロックしてあるか?と確認してきた。 もちろんどちらの携帯電話も SIM ロックフリーである。 続いて ID (身分証明書) の提示を求められた。 空港から直接ここへ来たのでパスポートを持っている。 パスポートを提示すると、宿泊するホテルを聞かれた。 プリペイド SIM カードのユーザも住所を登録しておく必要があるらしい。

念のため一枚目のアクティベートが終わった段階で、 その SIM カードを HTC P3600 と Motorola ZN200 の両方に差してみると、 両方とも無事接続できて、HTC P3600 では 3G での接続を確認できた。

アクティベート (および SIM カードそのもの) は無料で、 最初に最低 $25 の通話料 (air time) を購入する必要がある。 ところが新規契約の場合は $10 のボーナスがつくので、 計 $35 ぶんの通話が可能。 at&t携帯電話同士の通話だけであれば一日 $1 しかかからないので、 一ヶ月の滞在までこれで用が足りてしまうし、 一週間程度の滞在でも (air time は余ってしまうが) レンタル携帯電話より安くつくように思う。

もちろん、 プリペイド SIM カードを利用する場合は、 あらかじめ携帯電話を購入しておく必要があるが、 HTC P3600 は 17,980円、 Motorola ZN200 は HK$899 (約 1万円) で購入したので、 何度かレンタル携帯電話を借りることを考えれば十分ペイする。 また、 アジアやヨーロッパでの使用を考えずに、 米国専用の携帯電話でよければもっと安く購入できる。

なお Unlimited Talk プランだと at&t 携帯電話以外への通話は 10セント/分かかるが、 at&t 携帯電話以外から着信した場合や、 トールフリー (無料通話, 1-800-XXX-XXXX など) へかけた場合も、 10セント/分かかるので注意が必要。 通話時間は 1分単位で切り上げて課金される。

Filed under: Hawaii,SIM — hiroaki_sengoku @ 05:14
2009年3月1日

東京レインボーウオーク

東京レインボーウオークに参加した。 お台場海浜公園を朝 8:50 に出発し、 小雨がぱらつくあいにくの天候の中、 レインボーブリッジを往復する 7km のコースを歩いた。 参加者は約5000人だったらしい。

Rainbow Brdige Walk

この写真↑ は、橋の中間点から芝浦埠頭方向。 折り返してくる人々が反対車線に見える。 この時は歩いている人がまばらで歩きやすかったが、 お台場方向へ戻ったあたりで先が詰まってしまい、 満員電車並のすし詰め状態↓ になった。

Rainbow Brdige & helicopter

こうなってくると、「ウォーキング」というよりはお祭り。

ニュース:
卓球の愛ちゃんも歩く!東京レインボーウオーク3月1日開催
レインボーブリッジでウオーキング大会-東京五輪招致に向けPR

Filed under: その他 — hiroaki_sengoku @ 17:09
2009年2月25日

虫の記憶はさなぎでリセット ~ 変態する生物など、エピソード記憶を残さない方が生存に有利な場合もある hatena_b

進化論を否定しようというのでなければ、 エピソード記憶や自我意識も、進化の過程で生まれたと考えるのが妥当だろう。 つまり、 エピソード記憶を持つ個体の方が、 過去の経験から学び、同じ失敗を避けようとする (例えば危険な目にあったモノから逃げる) ことによって生存確率を高めることができて、 自然淘汰を経ていくうちにその記憶する能力が強化されていく。

そして、 エピソード記憶を持つ個体の中に、 あるとき突然変異によって自我の芽生えのようなものが生じた。 「自分」という自我意識が強くなればなるほど、 自分という存在が「かけがえのない」ものに思えるようになり、 自己を大事に思うようになる。 すなわち「死への恐怖」が生まれる。

「死」を忌避する個体の生存確率が高まるのは自明であり、 自我意識はどんどん強固なものへ (死がどんどん怖ろしいものへ) と進化し、 ついには自己同一性概念 (アイデンティティ) を獲得するに至り、 自身が「自由意思」を持っていると認識したりする。

幼虫から蛹、そして成体に至る過程において、 大量に予定された細胞の死 (programmed cell deathと言います) が起こるのですが、 芋虫から蝶、あるいはカブトムシというような、身体の形だけでなく、 なんと「神経系」に至るまで再構成されると聞いているからです。?!?!
...
成長の一ステップにおいて、 自分のこれまでの経験も何もかもが組み込まれた大きな系が再構成されるということで、
...
この幼虫とこの成虫は同じアイデンティティを持つ個体と呼べるものなのか

変態によって生存戦略が大きく変わる (例えば、地面を這う個体と、飛べる個体とでは、天敵を回避する戦略は全く異なる) ことを考えれば、 変態前のエピソード記憶は、 害になることはあっても益にはなるまい。 つまり、 エピソード記憶を忘れることが、 生存確率の向上につながる。

進化の過程で変態を行なう生物が生まれたとき、 もしかすると最初の変態生物は神経系の再構成までは行なわなかったのかもしれない。 そして、 あるとき突然変移によって神経系までも再構成する個体が生まれた。

変態前のエピソード記憶を引きずる個体は、 過去の経験が邪魔をして命を落とすこともある一方で、 変態によって記憶をリセットした個体は、 なまじ経験がないぶん有利となる。

あるいは、 神経系の再構成を完全には行なわず、 一部の神経組織が残る場合でも、 変態前のエピソード記憶を積極的に消去する個体の方が、 生存確率を高めることができるだろう。

どちらの場合も、 幼虫と成虫が同じアイデンティティを持つことによるメリットよりも、 エピソード記憶を引きずらず、 したがって同じアイデンティティを持たない (持てない) ことによるメリットの方が、 大きいだろう。 変態生物が自我の強化を行なうのは難しそうである。

Filed under: その他 — hiroaki_sengoku @ 08:01
2009年1月19日

SOTEC C101 (OLEVIA X10A-1160) で Linux (Ubuntu) を使う場合の注意点

香港の旺角電脳中心で買った OLEVIA X10A-1160 は、 Ubuntu 8.04 LTS がプレインストールされていた。 そのまま使うぶんには問題無いが、 Ubuntu のアップデートをインストールしてしまうと (正確に言えばカーネルを更新すると)、 OLEVIA X10A-1160 固有の設定が無効になり、 無線LAN やタッチパッドが使えなくなるなどの問題が生じる。 Ubuntu アップデートを行なった後、 あるいは新規に GNU/Linux (Ubuntu に限らず) をインストールする場合に、 OLEVIA X10A-1160 固有の設定を行なうためのメモ。

OLEVIA X10A-1160 は、 SOTEC C101 と (キーボード配列や天板のデザインを除けば) 同等であるため、 以下の対策は SOTEC C101 に Ubuntu 等の GNU/Linux をインストールして使う場合も、 そのまま適用できるはず。

i8042 のバグ対策を行なってタッチパッドを認識させる

他のいくつかのノートPC (dynabook Satellite P10, Thinkpad R31, Lifebook P7010, Dell XPS M1530 など) と同じく、 OLEVIA X10A-1160 (確認していないが、おそらく SOTEC C101 も同様) のキーボード/マウス コントローラ i8042 互換チップにはバグがある。 OLEVIA X10A-1160 の場合、カーネル起動時に以下のようなログを出力する:

PNP: PS/2 Controller [PNP0303:PS2K,PNP0f13:PS2M] at 0x60,0x64 irq 1,12
i8042.c: Detected active multiplexing controller, rev 1.1.
serio: i8042 KBD port at 0x60,0x64 irq 1
serio: i8042 AUX0 port at 0x60,0x64 irq 12
serio: i8042 AUX1 port at 0x60,0x64 irq 12
serio: i8042 AUX2 port at 0x60,0x64 irq 12
serio: i8042 AUX3 port at 0x60,0x64 irq 12
        ...(中略)...
input: PS/2 Generic Mouse as /devices/platform/i8042/serio4/input/input9
psmouse.c: Failed to enable mouse on isa0060/serio4

存在しないはずの外付けポート (AUX0~3) コントローラ (multiplexing controller) を認識してしまうようだ。 このため、 タッチパッド (SynPS/2 Synaptics TouchPad) が使えなくなってしまう。 この問題は、 カーネルパラメータに i8042.nomux=1 を追加することによって回避できる。 例えば GRUB の設定ファイル /boot/grub/menu.lst に、

title           Ubuntu 8.04.1, kernel 2.6.24-23-generic
root            (hd0,0)
kernel          /boot/vmlinuz-2.6.24-23-generic root=UUID=(省略) ro quiet splash vga=789 i8042.nomux=1
initrd          /boot/initrd.img-2.6.24-23-generic
quiet

といった感じで 「i8042.nomux=1」 を追加すればよい。 Linux を再起動すると、

PNP: PS/2 Controller [PNP0303:PS2K,PNP0f13:PS2M] at 0x60,0x64 irq 1,12
serio: i8042 KBD port at 0x60,0x64 irq 1
serio: i8042 AUX port at 0x60,0x64 irq 12
        ...(中略)...
Synaptics Touchpad, model: 1, fw: 5.10, id: 0x258eb1, caps: 0xa04711/0x0
input: SynPS/2 Synaptics TouchPad as /devices/platform/i8042/serio1/input/input7

などと出力し、 無事 SynPS/2 Synaptics TouchPad が認識できた。

なお Linux は、 i8042 にバグを持つ PC で問題を回避できるよう、 PC のブラックリストを持っている。 すなわち linux/drivers/input/serio/i8042-x86ia64io.h で定義されている配列 i8042_dmi_nomux_table に PC の ID を登録しておくと、 該当する PC では自動的に i8042.nomux=1 が設定される仕掛けだが、 あいにく OLEVIA X10A-1160 は固有の ID を持っていないようだ:

# head /sys/class/dmi/id/{sys_vendor,product_*}
==> /sys/class/dmi/id/sys_vendor <==
 

==> /sys/class/dmi/id/product_name <==
 

==> /sys/class/dmi/id/product_serial <==
Not Applicable

==> /sys/class/dmi/id/product_version <==
Not Applicable

DMI のベンダ名、プロダクト名が共に空白になっている。

無線LAN ドライバ vntwusb をインストールする

OLEVIA X10A-1160 (確認していないが、おそらく SOTEC C101 も同様) は、 無線LAN チップとして VIA Technologies の VT6656 を使用している。 しかし残念ながらこのチップは、 現時点の Linux 標準カーネルではサポートしていない。 したがってドライバをインストールする必要がある。

まず VIA Technologies のサポートページ VT6656 WLAN Linux Driver Source から、 最新版のドライバ vt6656_wlan_linux_v118.zip (1/18 現在) をダウンロードする。 展開して make すれば、 VT6656 用のカーネルモジュール vntwusb.ko が作られる。

% wget http://www.viaarena.com/Driver/vt6656_wlan_linux_v118.zip
--10:19:24--  http://www.viaarena.com/Driver/vt6656_wlan_linux_v118.zip
           => `vt6656_wlan_linux_v118.zip'
Resolving www.viaarena.com... 74.54.151.131
Connecting to www.viaarena.com|74.54.151.131|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 4,483,650 (4.3M) [application/x-zip-compressed]

    0K .......... .......... .......... .......... ..........  1%   68.92 KB/s
        ...(中略)...

% unzip vt6656_wlan_linux_v118.zip
Archive:  vt6656_wlan_linux_v118.zip
   creating: VT6656_WLAN_Linux_V118/
   creating: VT6656_WLAN_Linux_V118/driver/
        ...(中略)...
% cd VT6656_WLAN_Linux_V118/driver
VT6656_WLAN_Linux_V118/driver % make
make -C /lib/modules/2.6.24-23-generic/build SUBDIRS=/home/sengoku/VT6656_WLAN_Linux_V118/driver modules
make[1]: ディレクトリ `/usr/src/linux-headers-2.6.24-23-generic' に入ります
  CC [M]  /home/sengoku/VT6656_WLAN_Linux_V118/driver/main_usb.o
        ...(中略)...
  LD [M]  /home/sengoku/VT6656_WLAN_Linux_V118/driver/vntwusb.ko
make[1]: ディレクトリ `/usr/src/linux-headers-2.6.24-23-generic' から出ます

あとは、make install して modprobe vntwusb するだけ。

VT6656_WLAN_Linux_V118/driver % sudo make install
make -C /lib/modules/2.6.24-23-generic/build SUBDIRS=/home/sengoku/VT6656_WLAN_Linux_V118/driver modules
mkdir -p /lib/modules/2.6.24-23-generic/kernel/drivers/net
install -m 644 -o root vntwusb.ko /lib/modules/2.6.24-23-generic/kernel/drivers/net
/sbin/depmod -a || true
VT6656_WLAN_Linux_V118/driver % sudo modprobe vntwusb

ただし前もって、 カーネルモジュールを make するための環境を整えておく必要がある。 Ubuntu (というか debian) の場合であれば、 module-assistant パッケージと linux-headers パッケージをインストールしておけばよい。 あるいは、 上記 VT6656_WLAN_Linux_V118/driver ディレクトリを、 Linux カーネルソースにコピーしてカーネルを再構築してもよい。

私は、 Linux カーネルソースツリーに、 linux/drivers/net/wireless/vntwusb ディレクトリを作って、 VT6656_WLAN_Linux_V118/driver ディレクトリの内容をコピーし、 linux/drivers/net/wireless/Kconfig および linux/drivers/net/wireless/Makefile に以下のパッチをあてている。

--- linux-2.6.27.11.org/drivers/net/wireless/Kconfig        2008-10-10 07:13:53.000000000 +0900
+++ linux-2.6.27.11/drivers/net/wireless/Kconfig        2009-01-06 14:52:10.459276155 +0900
@@ -702,5 +702,6 @@
 source "drivers/net/wireless/b43legacy/Kconfig"
 source "drivers/net/wireless/zd1211rw/Kconfig"
 source "drivers/net/wireless/rt2x00/Kconfig"
+source "drivers/net/wireless/vntwusb/Kconfig"
 
 endmenu

diff -ur linux-2.6.27.11.org/drivers/net/wireless/Makefile linux-2.6.27.11/drivers/net/wireless/Makefile
--- linux-2.6.27.11.org/drivers/net/wireless/Makefile        2008-10-10 07:13:53.000000000 +0900
+++ linux-2.6.27.11/drivers/net/wireless/Makefile        2009-01-06 14:52:10.491275159 +0900
@@ -58,6 +58,7 @@
 
 obj-$(CONFIG_IWLWIFI)        += iwlwifi/
 obj-$(CONFIG_RT2X00)        += rt2x00/
+obj-$(CONFIG_VNTWUSB)        += vntwusb/
 
 obj-$(CONFIG_P54_COMMON)        += p54/
 

Ubuntu などのディストリビューションのアップデートに頼らずに、 カーネルのバージョンアップを行なっている場合は、 カーネルソースツリーに組み込んでおく方が、 ドライバ込みでカーネルを再構築できるので手間が省ける。

Filed under: ハードウェアの認識と制御 — hiroaki_sengoku @ 08:59
2009年1月8日

wpa_supplicant のバグ: TLS拡張 (TLS Extensions) 対応の OpenSSL と使うと、WPA EAP-TLS が常に失敗する

あけましておめでとうございます。 今年もよろしくお願いします。

自宅の無線LAN を WPA2-EAP (WPA2 エンタープライズ) にして 1ヶ月になるが、 すこぶる快適。 アクセスポイントがエンタープライズモードに対応していなければいけないのと、 RADIUS サーバが必要である上、 EAP-TLS を用いる場合は SSL クライアント証明書を発行する 認証局 (CA) を作る必要まであるので、 自宅LAN での導入にはややハードルが高いが、 いったん導入してしまえば WPA/WPA2 パーソナルより手間がかからない。

WPA/WPA2 パーソナルだと、 秘密のパスワードを全ての無線LAN 端末で共有するので、 端末の台数が増えてくるとどんどん漏洩のリスクが高まる。

自宅LAN でそんなに端末があるのか? という突っ込みが入りそうだが、 格安 NetBook や、 無線LAN 機能付スマートフォンなどを買っていると、 自宅LAN とはいえ、 「エンタープライズ」 的なニーズが出てくる。

WPA2 エンタープライズで認証方式として EAP-TLS を使うと、 無線LAN 端末にはそれぞれ個別の証明書をインポートしておくだけでよく、 万一その端末を紛失しても、 その端末の証明書を無効にするだけで済む。

EAP-TLS には対応機器/OS が多いというメリットもある。 無線LAN 端末として、 Windows VISTA, Windows XP, Ubuntu 8.04 LTS などを使ってみたが、 いずれもあっけないくらい簡単に接続できてしまった。 証明書さえインポートしておけば (Windows ならダブルクリックだけ)、 あとはパスワードを入力しなくてもいいぶん WPA/WPA2 パーソナルより設定が簡単。

既存の OS (Linux の場合はディストリビューション) で無線接続できるようになったので、 次は私が独自に構築した GNU/Linux (いわば my distribution) 上で WPA2 EAP-TLS 接続を試みた。

まず wpa_supplicant 0.5.11 をダウンロードしてコンパイル。 続いて設定ファイルである wpa_supplicant.conf を書く。

network={
        ssid="XXXXXXXXXX"
        key_mgmt=WPA-EAP
        eap=TLS
        identity="olevia"
        ca_cert="/usr/local/ssl/certs/GCD_Root_CA.pem"
        client_cert="/usr/local/ssl/certs/olevia.pem"
        private_key="/usr/local/ssl/private/olevia.pem"
        private_key_passwd=""
}

「ca_cert=」 「client_cert=」 「private_key=」 にそれぞれ CA の公開鍵、端末の公開鍵、端末の秘密鍵のファイル名を指定している。 で、wpa_supplicant を実行。

# wpa_supplicant -i eth1 -c /etc/wpa_supplicant.conf -d -D wext
Initializing interface 'eth1' conf '/etc/wpa_supplicant.conf' driver 'wext' ctrl_interface 'N/A' bridge 'N/A'
Configuration file '/etc/wpa_supplicant.conf' -> '/etc/wpa_supplicant.conf'
Reading configuration file '/etc/wpa_supplicant.conf'
Priority group 0
   id=0 ssid='XXXXXXXXXX'
Initializing interface (2) 'eth1'
EAPOL: SUPP_PAE entering state DISCONNECTED
EAPOL: KEY_RX entering state NO_KEY_RECEIVE
EAPOL: SUPP_BE entering state INITIALIZE
EAP: EAP entering state DISABLED
        ...(中略)...

wpa_supplicant はデバッグモード (-d オプション) にすると大量のログを出力するので動作を追いにくいが、 wpa_supplicant のプログラムは状態遷移機械 (オートマトン) として動作するよう書かれているので、 「EAP: EAP entering state」 の部分を追っていくとよい。 「DISABLED」 と出力されているのが、 その時点におけるオートマトンの状態。

状態遷移機械 (オートマトン) と言ってしまうと、 コンピュータ/プログラムは全てオートマトンなのであるが (^^;)、 プログラミングの方法として状態遷移機械 (state machine) と言うときは、 各状態に名前を付けて、 各状態ごとの動作を (switch 文や if ... else if ... 文などで) 分けて書く方法を指す。

状態には INITIALIZE, DISABLED, IDLE, RECEIVED, GET_METHOD, METHOD, SEND_RESPONSE, DISCARD, IDENTITY, NOTIFICATION, RETRANSMIT, SUCCESS, FAILURE の 13状態がある。 もちろん 「SUCCESS」 が受理状態。 SUCCESS 状態は、 アクセスポイントが接続を許可した状態を意味する。

ところが、ログを追っていくと、

EAP: EAP entering state RECEIVED
EAP: Received EAP-Success
EAP: EAP entering state FAILURE
CTRL-EVENT-EAP-FAILURE EAP authentication failed

FAILURE 状態 (非受理状態) に遷移している (*_*)。当然、接続できず。
その直前に 「Received EAP-Success」 と出ているにもかかわらず!

アクセスポイント側 (正確に言うと RADIUS サーバ) のログを調べてみると、 ちゃんと接続を許可している (EAP-Success を送っているのだから当然だが)。 一体これはどうしたことか?

私がコンパイルした wpa_supplicant に問題があるのかと思って、 この wpa_supplicant を、 既に接続できることが確認済みの Ubuntu 上にコピーして実行してみる。 「Received EAP-Success」 をログの中から探してみると、

EAP: EAP entering state RECEIVED
EAP: Received EAP-Success
EAP: EAP entering state SUCCESS
CTRL-EVENT-EAP-SUCCESS EAP authentication completed successfully

ちゃんと SUCCESS 状態に遷移しているし、接続もできた。
同一バイナリなのに、異なる環境 (ディストリビューション) だと、 どうして結果が異なるのか?

どのような可能性が考えられるだろうか? 腕に覚えがあるかたは、 この続きを見ずに (といっても、既にタイトルでネタバレしてしまっているが ^^;) 原因を推測してみてはいかがだろうか?

More...
Filed under: システム構築・運用 — hiroaki_sengoku @ 08:58
2008年12月29日

香港の旺角電腦中心で NetBook OLEVIA X10A-1160 を買ってみた

香港の旺角電腦中心 (Mongkok Computer Centre) の 4階 (香港の呼び方だと 3樓) 320號にあるパソコンショップ 「道亨顧問有限公司」 (Dorman Consultants Limited) で、 NetBook OLEVIA X10A-1160 を HK$2880 (約 33,000円) で売っていた。

Olevia X10A 10.1" notebook

Olevia X10A 10.1" notebook

Operation SystemLinux (Windows Compatible)
ChipsetIntel Atom N270 1.6GHz
BIOSPhoenixBIOS 1.0.00-31
Memory1GB DDR2
LCD10.1” 1024x600 SVWGA
HDD160 GB (SATA) WD1600BEVT
I/OD-sub*1 , USB 2.0*3 , Mic-in
Headphone, LAN
BatteryLithium-Ion 11.1V 2.2Ah (3 cells)
Webcam1.3M Webcam
SoundStereo speakers
Dimension26.5*18.5*2.5cm
Weight~1.3 Kg (including 3 cells battery)

物価が安い香港と言えど、HK$3000 以下の NetBook というと EeePC 701SDX あたりになってしまうわけで、 メモリ 1GB, HDD 160GB の Atom N270 で HK$2880 というのは興味深い。 その場で悩み込むこと数分間。 店員がべらべら説明を始めたが、広東語なので何も分からない (^^;)。

同等スペックの NetBook としては、 例えば acer Aspire One AOA150 がある。 メモリ 1GB, HDD 160GB, Atom N270, WSVGA, 無線LAN あたりは同等で、 違いは Aspire One AOA150 の方が若干小さく (画面サイズも 1インチほど小さい)、 LAN が 100Mbps (X10A は 1Gbps) で、 Webカメラの画素数が 30万画素 (X10A は 130万画素) である点など。 Aspire One AOA150 の最安値は 35000円くらい?

何より OS が Linux というのがいい。 香港版の Windows XP なんて広東語を喋れない私には無用であるわけで、 HK$600 くらいはする Windows XP ライセンスが付いた PC は避けたいところ。 一応 「Windows Compatible」 を謳っていて 「Designed for Microsoft WindowsXP」 シールも貼ってある。

買う一歩手前まで行ったのだが、最後の背中のひと押しが無かったのと、 妻がホテルで待っているというのがあって、 これから帰る旨を電話で伝えて、 後ろ髪を引かれつつお店を後にした。

ところが

More...
Filed under: ハードウェアの認識と制御,香港 — hiroaki_sengoku @ 08:25
2008年12月26日

香港 電脳街 住所と最寄駅出口の まとめ

香港の電脳街は「高登電腦中心」のように、 巨大な看板があるので駅の出口さえ間違えなければ迷いようがないビルがある一方で、 「旺角電腦中心」のように駅から少し離れているうえに入口が目立たないので、 場所を知らないと辿り着けない恐れがあるビルもある。

旅行前の準備で、 電脳街の場所を調べるのに苦労したので、 Google Maps での位置をまとめておく。 ついでに最寄駅の出口、道路の名前、ビルの名前も付記した。 駅の出口と道路の名前さえ覚えておけば探すのは難しくないはず。 「街」 「道」 がついているのが道路の名前で、 それぞれ「street」 「road」 の意味。 ちなみに 「站」 は 「駅」 の意味で、「大廈」 は 「ビル」。

「1樓」「1/F」は日本で言うところの「2階」のこと。 「2樓」「2/F」は「3階」。 つまりイギリスと同じ数え方。 「地下」 「G/F」 (Ground Floor) が、 日本で言うところの「1階」になる。 「地下」が「1階」なら、 日本で言うところの「地下1階」は一体何て言えばいいんだ? という疑問が湧くが、 「第1層地庫」 「地庫1層」 「地庫一」 「地庫1樓」 「1/B」 (1st Basement) などと表現するらしい。

電腦街住所/地図 Google Maps最寄駅/出口ビルの名前
新高登電腦廣場
New Capital Computer Plaza
深水埗 元州街 85-95號
85-95 Un Chau st. Sham Shui Po
深水埗站/D2
Sham Shui Po
金必多大廈
Capital Bldg
高登電腦中心
Golden Shopping Centre
深水埗 福華街 146-152號 上層
1/F 146-152 Fuk Wah st. Sham Shui Po
深水埗站/D2
Sham Shui Po
黄金大廈
Golden Bldg
黄金電腦商場
Golden Computer Shopping Arcade
深水埗 福華街 146-152號 地下
G/F 146-152 Fuk Wah st. Sham Shui Po
深水埗站/D2
Sham Shui Po
黄金大廈
Golden Bldg
鴨寮街
Ap Liu st.
深水埗 鴨寮街 143-220號
143-220 Apliu st. Sham Shui Po
深水埗站/A2, C2
Sham Shui Po
先達廣場
Sin Tat Plaza
旺角 亞皆老街 83號
83 Argyle st. Mongkok
旺角站/D2
Mongkok
先施大廈
Sincere House
旺角電腦中心
Mongkok Computer Centre
旺角 奶路臣街 8號
8 Nelson st. Mongkok
旺角站/E2
Mongkok
宏景樓
Grandview Bldg
星際城市
Sim City
旺角 山東街 47-51號
47-51 Shantung st. Mongkok
旺角站/E2
Mongkok
中僑商業大廈
Chung Kiu Commercial Bldg
MK1超級數碼廣場
Mk1 Super Digital Mall
油麻地 彌敦道 525號
525 Nathan rd. Yu Ma Tei
油麻地站/B1
Yu Ma Tei
寶寧大廈
Bell House
灣仔298電腦特區
Wan Chai 298 Computer Zone
灣仔 軒尼詩道 298號
298 Hennessy rd. Wanchai
灣仔站/A4
Wan Chai
廣生行大廈A座
Kwong Sang Hong Bldg Blk A
灣仔電腦城
Wan Chai Computer City
灣仔 軒尼詩道 130號
130 Hennessy rd. Wanchai
灣仔站/B1
Wan Chai
修頓室內場館
Southom Stadium

「數碼」(「數」は「数」の繁体字) は「デジタル」の意味。 深水埗站 D1 出口には、 數碼之源 Digital Hub と銘じたオブジェがある。

Filed under: 香港 — hiroaki_sengoku @ 21:46
« Newer PostsOlder Posts »