SVX日記

2004|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|

2005-11-01(Tue) ペンティアム(i586)飛びます

  まだ、coLinuxしてます。詳細はまたいずれ。


2005-11-08(Tue) 電車でBind!!

  coLinuxをノートPCにインストールしてからというもの、電車の中では快適三昧である。Cygwinも悪くないが、どうしたってある意味では本物のLinux環境にはかなわない。しかもディストリビューションはWBEL。仕事で慣れ親しんでいる環境とほぼ同じであるし、rpmも使えるし、コンパイルもできるし、manページもすべて揃っている。ハードウェア関係以外は完璧。まったくもってcoLinux万歳である。

  しかしながら、調子が悪いのがネームサーバのBind。別に必ずしもBindが動かなくても困らないのだが、仕事で軽い動作検証くらいには使いたいし、やっぱりイジり回したいのである。前回インストールした時は、nslookupやdigを打った瞬間にセグメント例外で落っこちる現象が出ていて、どうにも根が深そうなトコロ(UDP?)に問題がありそうだったのでアキらめたが、なぜか今回インストールしなおしたら、シスログにやたらとエラーが出るだけで動いているっぽいので、そのやたらと出るシスログだけは、なんとかしようと思い立ったのである。

  そのやたらと出るメッセージとはコレだ。

Nov 10 23:18:22 colinux named[5877]: gettimeofday returned bad tv_usec: corrected
Nov 10 23:18:35 colinux last message repeated 151273 times

  秒間一万数千というレベルで出ている……笑ってしまうような状況だ。これだけ出ると、事実上messagesが使い物にならなくなる。とりあえず、問題の根を探るために、Bindソースを確認し、このメッセージを出している部分を見てみよう。もしかしたら、最新版のBindでは直っているかもしれないと淡い期待を抱きつつ、某所からBindの最新版のsrpmを持ってくる。

[root@colinux root]# wget ftp://ftp.redhat.com/pub/redhat/linux/updates/enterprise/3ES/en/os/SRPMS/bind-9.2.4-7_EL3.src.rpm
[root@colinux root]# rpm -ivh bind-9.2.4-7_EL3.src.rpm
[root@colinux root]# rpmbuild -bp /usr/src/redhat/SPECS/bind.spec
[root@colinux root]# cd /usr/src/redhat/BUILD/bind*
[root@colinux bind-9.2.4]# grep -r 'gettimeofday returned bad tv_usec: corrected' *
lib/isc/unix/stdtime.c:         syslog(LOG_ERR, "gettimeofday returned bad tv_usec: corrected");
lib/isc/unix/time.c:            syslog(LOG_ERR, "gettimeofday returned bad tv_usec: corrected");

  2箇所出た。

[root@colinux bind-9.2.4]# vi lib/isc/unix/stdtime.c +/gettimeofday

  ソースを読む。2箇所ともコードは同じ構造で、tv_usecが負だったり、上限値であるUS_PER_S(1000000)を超えていたりすると出るらしい。tv_usecとはカーネル関数のgettimeofdayを呼び出したときに返る、現時刻の秒以下の時刻成分のことである。単位はマイクロ秒だから、通常は0〜999999までが返るハズである。このコードにからは、明らかにヘンな値を読んでいるとしか考えられない。coLinuxカーネルのバグか? しかし、Bind側ではちゃんと補正らしきことをしているし、特に重要な処理部分でもなさそうだ。イチイチ、こんなメッセージを出力しなくたっていいのになぁ。

  とりあえず、ホントにヘンな値を返しているものか確認してみよう。gettimeofdayを使って小さなプログラムを書いてみる。こんな時は、本を開かず、ググりもせず、manするのが吉である。

[root@colinux SOURCES]# man gettimeofday
GETTIMEOFDAY(2)            Linux Programmer's Manual           GETTIMEOFDAY(2)
 
名前
       gettimeofday, settimeofday - 時間を取得/設定する
 
書式
       #include 
 
       int gettimeofday(struct timeval *tv, struct timezone *tz);
       int settimeofday(const struct timeval *tv , const struct timezone *tz);
 
説明
       関数 gettimeofday と settimeofday は時間とタイムゾーン (timezone) を 取
       得または設定する。 tv 引き数は /usr/include/sys/time.h に定義されている
       timeval 構造体である:
 
       struct timeval {
               long tv_sec;        /* seconds */
               long tv_usec;  /* microseconds */
       };
 
       これにより紀元 (the Epoch: time(2) を参照) からの秒とマイクロ秒が取得で
       きる。 tz 引き数は timezone 構造体である:
<以下略>

  ロクにmanを読まないクセに、やたらと本を買えと勧める先輩エンジニアはタコであると断言しておこう。これをもとにサラッと確認コードを書いてみる。

      1 #include 
      2 #include 
      3
      4 main() {
      5     int ret;
      6     struct timeval tv;
      7     struct timezone tz;
      8
      9     ret = gettimeofday(&tv, &tz);
     10
     11     printf("%d, %d, %d, %x\n", ret, tv.tv_sec, tv.tv_usec, tv.tv_usec);
     12 }

  コンパイルして実行してみる。

[root@colinux furuta]# cc gettime.c
[root@colinux furuta]# ./a.out
0, 1131740415, -27341712, fe5ecc70
[root@colinux furuta]# ./a.out
0, 1131740416, -27489711, fe5c8a51
[root@colinux furuta]# ./a.out
0, 1131740417, -28040701, fe542203
[root@colinux furuta]# ./a.out
0, 1131740417, -27594655, fe5af061
[root@colinux furuta]# ./a.out
0, 1131740417, -27213469, fe60c163

  ……なんと!! ホントに負の値が出ている!! 大バグではないか。機種依存かなぁ。家の骨董デスクトップ上のcoLinuxでも試してみないといかんなぁ。そっちにはcoLinuxの0.6.2が入っているし。

  なんにしても、coLinuxのカーネルに手を入れることはできないので、Bind側のメッセージ出力をコメントアウトしてしまおう。せっかくsrpmパッケージを入手しているので、コードを直して、自分のrpmをrebuildし、それをインストールすることにする。

  まずはフツーに全buildする。

[root@colinux root]# rpmbuild -ba /usr/src/redhat/SPECS/bind.spec

  画像の説明

  このrebuild、電車の中で行ったのだが、30分以上かかった気がする。職場のサーバでコンパイルすれば5分もかからないのになぁ。仕方ないので、フリーセルしたり、Rubyで別のお仕事コード書いたりして待つ。うーん、でも、マルチタスクっていいねぇ……と、できた。

[root@colinux root]# ls -lrt /usr/src/redhat/RPMS/i386
合計 5264
-rw-r--r--    1 root     root       470258 11月 10 23:38 bind-9.2.4-7_EL3.i386.rpm
-rw-r--r--    1 root     root       558046 11月 10 23:38 bind-libs-9.2.4-7_EL3.i386.rpm
-rw-r--r--    1 root     root       134058 11月 10 23:38 bind-utils-9.2.4-7_EL3.i386.rpm
-rw-r--r--    1 root     root      2250325 11月 10 23:39 bind-devel-9.2.4-7_EL3.i386.rpm
-rw-r--r--    1 root     root        32640 11月 10 23:39 bind-chroot-9.2.4-7_EL3.i386.rpm
-rw-r--r--    1 root     root      1914506 11月 10 23:39 bind-debuginfo-9.2.4-7_EL3.i386.rpm

  rpmbuildのmanの、-baオプションのトコロには、

       -ba    Build binary and source packages (after doing the %prep, %build,
              and %install stages).

  という記述があり、ソース展開とパッチ当てをする「%prep」コンパイルする「%build」インストールする「%install」の段階を踏んでからバイナリ及びソースパッケージを作る、とあるが、実際のインストールはされないっぽい。どうやら、tmpディレクトリに対して空インストールを行い、パッケージを作っているようだ。

  あらためて、インストールする。

[root@colinux root]# cd /usr/src/redhat/RPMS/i386
[root@colinux i386]# rpm -Uvh bind*
[root@colinux i386]# service named start

  一応、最新パッケージではあるが、今回の問題はバグとしては扱われていないようだ。現象は再現してしまう。まぁ、カーネル側がロクな時間を返さないのがそもそもの原因だから、Bindを責めるには無理があるよな。でも、対処はBind側でするしかない。やはり、予定通り、Bind側のメッセージ出力部のコードをコメントアウトし、自分オリジナルのrpmパッケージをrebuildし、それをインストールして解決を図ることにしよう。まずは、rpmbuildコマンドと使って「%prep」処理を行わせる。これにより、修正パッチが当たった、最新バージョンのソースが「/usr/src/redhat/BUILD/bind*」の下に生成される。

[root@colinux root]# rpmbuild -bp /usr/src/redhat/SPECS/bind.spec

  ここで先の2つのファイルを修正する。

[root@colinux bind-xxxx]# vi lib/isc/unix/stdtime.c
[root@colinux bind-xxxx]# vi lib/isc/unix/time.c

  両者とも、修正部分はココだ。コメントアウトする。

/*      if (fixed)
                syslog(LOG_ERR, "gettimeofday returned bad tv_usec: corrected");        */

  でもって「%compile」処理、「%install」処理を順に行わせるが、ココでハタと困った。

[root@colinux root]# rpmbuild -bc --short-circuit /usr/src/redhat/SPECS/bind.spec
[root@colinux root]# rpmbuild -bi --short-circuit /usr/src/redhat/SPECS/bind.spec

  -baオプションには--shurt-circuitオプションが効かないらしい。

[root@colinux root]# rpmbuild -ba --short-circuit /usr/src/redhat/SPECS/bind.spec

  これすると、また頭からソースが展開されてしまうので、先ほどの修正が作業が無駄になってしまう。失敗……仕方ない「/usr/src/redhat/SOURCES」の下のアーカイブを直接修正してしまおう。この方法だと、不幸にも修正部分にパッチが当たった場合、ややこしいコトになるかもしれない。まぁ、ややこしいコトになったら、パッチ当てに失敗するだろうし、とりあえずやってみる。

[root@colinux SOURCES]# tar xvfz bind-9.2.4.tar.gz
[root@colinux SOURCES]# vi lib/isc/unix/stdtime.c
[root@colinux SOURCES]# vi lib/isc/unix/time.c
[root@colinux SOURCES]# tar cvfz bind-9.2.4.tar.gz bind-9.2.4

  修正後、再びアーカイブにまとめて、一気に全部処理させる。

[root@colinux root]# rpmbuild -ba /usr/src/redhat/SPECS/bind.spec

  パッケージ完成。バージョンナンバが同じため、インストールの時には、--forceオプションを付加する必要があることに注意。

[root@colinux i386]# rpm -Uvh --force *
[root@colinux i386]# service named start

  よし!! 思惑通り、問題のログが出なくなった。これにてプロジェクトの完了である。

  よく考えたら、ホントは「%prep」処理の後、自分の修正部分の差分をパッチファイルにまとめ、SPECファイルをイジって最後にパッチが当てるようにして、改めて全部をrebuildするといいんだろうな。でもまぁ、公開するわけでもないし、これでいいのだ!! あー、スッキリした。明日からはボチボチBindの基本設定をしていきたい。ネタになるほどの設定ではないので日記にはまとめないと思うけどね。では。


2005-11-09(Wed) NonCooperative Linux for Bind

  昨日、直ったと思ったBindだが、実はぜんぜん直ってなかった。怒涛のシスログ攻撃はなくなったが、相変わらずBindのCPU使用率は100%を割らない。怒涛のシスログ攻撃は暴走の副産物に過ぎなかったみたいだ。そりゃ、よく考えたら、gettimeofdayの百連打が収まらなければ、問題の解決になるわけがないよな。やっぱり、gettimeofdayがムチャな値を返すのが原因か?

  一体何をやっているんだろうと思って、CPUを食いまくっているBindの子プロセスにstraceをアタッチしてみる……

gettimeofday({1131896487, 3949351405}, NULL) = 0
rt_sigprocmask(SIG_SETMASK, [HUP INT TERM RTMIN], NULL, 8) = 0
gettimeofday({1131896487, 3949351701}, NULL) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [HUP INT TERM RTMIN], 8) = 0
rt_sigprocmask(SIG_UNBLOCK, [RTMIN], [HUP INT TERM RTMIN], 8) = 0
gettimeofday({1131896487, 3949352340}, NULL) = 0
rt_sigprocmask(SIG_SETMASK, [HUP INT TERM RTMIN], NULL, 8) = 0
gettimeofday({1131896487, 3949352635}, NULL) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [HUP INT TERM RTMIN], 8) = 0
rt_sigprocmask(SIG_UNBLOCK, [RTMIN], [HUP INT TERM RTMIN], 8) = 0
gettimeofday({1131896487, 3949353278}, NULL) = 0
rt_sigprocmask(SIG_SETMASK, [HUP INT TERM RTMIN], NULL, 8) = 0
gettimeofday({1131896487, 3949353571}, NULL) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [HUP INT TERM RTMIN], 8) = 0
rt_sigprocmask(SIG_UNBLOCK, [RTMIN], [HUP INT TERM RTMIN], 8) = 0
gettimeofday({1131896487, 3949354214}, NULL) = 0
rt_sigprocmask(SIG_SETMASK, [HUP INT TERM RTMIN], NULL, 8) = 0
gettimeofday({1131896487, 3949354508}, NULL) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [HUP INT TERM RTMIN], 8) = 0
rt_sigprocmask(SIG_UNBLOCK, [RTMIN], [HUP INT TERM RTMIN], 8) = 0

  やはり、怒涛のgettimeofday攻撃である。ちなみに、coLinuxというものはインストールしたディストリビューションのカーネルを使わない。WBEL3をインストールしても、WBEL3のカーネルは使われないのである。coLinuxはWindows上で動くためのカスタムカーネルを使うことで、LinuxをWindows上で動かしている。当然ながら、カーネルに依存するモジュールもcoLinux側に添付されている。VMwareとはそのヘンがちがうのである。しかし、アレだ。2.4、2.6の違いがあっても、カーネル以外の部分はそのままで動くというのは意外だったなぁ。つまり、WBEL3は2.4カーネルとの組み合わせられているが、カーネルだけを2.6にしても、ほとんど何の問題もなく動くということである。まぁ、システムコールの動作に互換性があれば、不思議でもなんでもないが……

  ……などというコトを考えながら、なんとなくググっていたら、こんなカキコミを見つけた。そういえば、最近は、仕事の時間中、英語の文章を読まざるをえないコトが多いから、苦がなくなったなぁ……なるほど、やっぱりカーネルのバグっぽい。既知の問題だったのね。coLinux上でBindを使う人は少ないのか?

  ココには最新のスナップショットで、やっとこさ直ったようなことが書いてあるが、家のゴミにインストールしたcoLinuxの0.6.2では、この現象は発生しなかった。どこで直っているのかは知らないが、0.6.2に上げるかなぁ……。でも、coLinuxの0.6.1のカーネルベースは2.4.26、0.6.2のカーネルベースは2.6.10なんだよなぁ。WBEL3のカーネルは2.4.21、どうしたって0.6.1と組み合わせてる方が相性が良いと思うんだよねぇ。それに職場のXPではcoLinuxのインストールに失敗しまくっているから、せめて手元のcoLinux環境を壊すことだけはしたくないんだよなぁ。

  本来であれば、自分でカーネルにパッチを当ててしまいたいところだが、coLinuxのカーネルはあくまでWindowsアプリである。どんな環境でコンパイルできるのかもわからない……ムリヤリBind側にパッチを当ててしまおうかなぁ。アレだろ? Bind的に、時刻が負になったり、戻ったりしなきゃ大丈夫なんじゃないの? 違うかな?

  <かきかけ>


2005-11-10(Thu) Linux Kernel Conference 2005

  今日はLinux Kernel Conference 2005の日である。青山でLinuxのカーネルに対する講義みたいなのを聴講しに行く。本来は1セッション8,000円という御大臣な講義なのだが、オイラの会社はスポンサー。モロに仕事の一部なので、個人負担はなしである。我ながら、なんとウラやましい。

  画像の説明

  第1セッションは「Linuxカーネル入門−ブロックI/OとI/Oスケジューラ」。前半は軽くカーネルの役割に触れた後、後半ではブロックI/Oをスケジュールする機構についてのネットリした解説だ。簡単に言えば、ランダムに発生する読み書き要求を、ハードディスクのヘッドが効率よく読み書きできるように並べ替えるのがI/Oスケジューラである、という話。4タイプほどの方式を次々と説明し、なるほどと納得しながら聴き入っていたが、最後の最後で「フラッシュメモリや高度なRAIDなどでは、デバイスに任せたほうが効率がいい」なんて説明が入ってゲンナリ。そんなん言い始めたら、最近はIDEのハードディスクでもたんまりとキャッシュが載っているじゃん。なんだか、すべてが無駄な努力のような気がしてきた。

  第2セッションは「組込みLinuxにおけるカーネル2.6の開発とデバッグ」。Linuxは各種のCPUに対応するマルチプラットフォームOSである、なんていう話から始まって、ICEなどを使ったデバッグ方法の話なんかを聞く。ところが、このセッションの後半になって、カーネルソースに含まれているMips用などのIA-32用以外のコードは、まともにコンパイルすらできないということを言い出してガックシ。本人すら「カーネルパッケージに含まれているコードはトカゲのシッポ程度の意味しかない」なんて言い出してズッコケてしまった。つまり、組み込み用途に使われるような、小規模のCPU向けのカーネルコードは、手を入れずにはマトモに動かないってコトだ。なんてこったい。

  画像の説明

  第3セッションは「Xenによる仮想マシン環境構築」。Xenという仮想OSプラットホームについての特徴説明から始まるが、何しろ話が冗長だ。インストール方法なんてイチイチ説明する必要なんてないだろ。だいたい、coLinuxにハマっているオイラにはLinux on Linuxの意図がいまいち理解できない。特長として1台のマシンを複数台にみせたり、メモリやCPUを効率的に割り当てるなどの流動的な運用が可能であることはわかるが、デモの時に「あー、うまくいってよかった、よくコケるんだね」なんていわれた日には、これまたひっくり返ってしまう。いくら流動的な運用ができても、そんなもん使い物になるかよ!! まぁ、未来に期待するのは悪いことじゃないから、それは否定しないけどさ。

  第4セッションは「スピンロックから始めるLinuxカーネル入門」。若手向けのセッションであるため、オイラには参加権がない。ココだけは無料セッションだし、内容がかなりオモシロそうなだけに、参加したい……というか、参加できるものと思って、会場に資料を置いてきてしまった。席に戻る段になって気がついたので「会場に忘れ物をしまして……」なんていいつつ、そのまま聴講してしまった。あひゃひゃ。でも、内容は一番有意義だったかな。CPUのキャッシュの話から始まって、CPU間のロックの例を交えつつ、カーネルのスピンロックのコードをその場で仕上げていくかのような構成。ロックをトイレの個室のカギに例えたりして笑いを取りつつ、この構成力には舌を巻いた。すげぇ、オモシロかった。しかし、複数のCPUのキャッシュって、ハード的に排他機能が付いているのね。今まで、他のCPUのキャッシュの内容を知らずにどうやってマルチCPUで動いているのかとても不思議だったんだよね。そりゃ、ハード的な排他機構が必要だよな。もしかしたら、排他機構が付いている=マルチプロセッサ対応CPUというコトなのかな。別途、最近になって知ったMMUのページングの仕組みと合わせて、ちょっと近代CPUに詳しくなって嬉しいぞ。なにせ、この仕事を始めるまで、オイラの中の最新CPUはMC680EC30だったからねぇ……。

  画像の説明

  今日は、そのまま直帰して家でのんびりする。有意義だかなんだか、よくわからないカンファレンスであった。ちゃんちゃん。


2005-11-13(Sun) Dynamic IP タコる

  光にしたときに、DDNS更新スクリプトを修正するのを忘れてて、アクセスできなくなっていた。失礼。

  画像の説明


2005-11-20(Sun) Let's思いとどまる

  先日から電車の中でビシビシとカーネルソースを読んだりなんだりしているオイラである。以前にも書いたが、そんなオイラの獲物は2000円で買ったPC。PenIIIの600MHz、RAMが320MB、HDDは12Gと不足気味ながら、バッテリーは2時間持つし……あぁ、でも、Let'sNoteが欲しい!! 別に重量は重くても差し支えないが、12時間もバッテリーの持つT4が魅力的である。無線LANが内蔵というのもいい。

  しかし、ひとつ言わせてもらってよいか? 「Let'sNote」って名前、もはやブランドであるとはいっても、いくらなんでもダサすぎはしないか? 英語の文法には詳しくないから、そもそも正しい英語なのかも知らないが、和製英語の「マイカー」に次ぐダサさではないかと思う。このノートPCはアメリカで売ってたりはしていないのだろうか? まさか、アメリカでもこの名前で売っている? まぁ、どーでもイイけどさ。

  名前のダサさには目をツブりつつ、どうせ買うならコダわるオイラである。なにせ、パナの直販サイトから購入すれば「ノートPCの天板の色」が選べるのである。初めて手に入れたPCが「ローズレッド」のシャープのX1だったオイラであるから、PCといえば「ローズレッド」なのである。

  しかしながら、直販サイトの色見本を、液晶パネルに穴があくほど見つめても、ホントの色がわかるワケもない。キールロワイヤルというタイプがイメージに近いような気もするが、ちょっと地味っぽい感じも受ける……にしても、TタイプとRタイプで色のラインナップが違うというのはどういうコトだ? Rタイプのワインレッドなんて、かなりイイ色のような気がするが、Tタイプには用意されていない……なんでだ!? 用意しろよ!!

  サイトを読むと、なんでも天板の色見本が「秋葉のWillcomプラザ」に置いてあるらしい。パナとWillcomの関係はよくわからないが、オイラはWillcomユーザであるし、そこにも行ったことがある。ちょっくら出掛けて実物を見てみるコトにしよう。

  Willcomプラザに着いて辺りを見回す。が、Let's Noteは置いてあるものの、各種天板が置いてある感じではない……と、あった。インフォメーションカウンターのお姉さんの後ろ側、床の上にパネルが置いてある。なんつー扱いだよ……仕方なく、ちょっと横から覗き込むように……してたら、お姉さんが気づいて出してくれた。なるほど……え? まだあるって? わ!! ダンボールの箱にゴッソリと天板の見本が入っている。これまた、なんつー扱いだよ……まーいーけど。

  ノートPCの天板だけを単品で見るというのは初めての経験だが、こりゃ軽い。そして丈夫。おまけにダンボールの中で天板同士がコスれまくっているのに、さして塗装にダメージがあるようにも見えない。なかなかの品質ではないだろうか……と、感心するのもつかの間、キールロワイヤルという色は地味すぎだ。暗いエンジといった色。色の好みは人それぞれだが、もうちょっとハデな赤がいいんだが……そして、Rタイプに用意されている赤……赤すぎ!! 朱色の直前のように明るい赤だ。まだ、こっちのがいいけどなぁ、ローズレッドはないんかいな……場合によってはそのためにRタイプをチョイスするのもやむをえない……ない。ガックシ。ゴールドもちょっと悪くないと思いつつ、しかしどうせゴールドならもう少しネットリとしたゴールドがいい。シャンパンゴールドよりちょっと濃いくらいではオイラのイメージではないのだ。お姉さんにお礼を言って返す。

  つーわけで、色の好みがないという理由でLet'sNoteの購入は却下!! である。なまじっか、色を選べるだけに、購入を思いとどまってしまうという、松下には皮肉な結果に終わってしまった。まぁ、そんなユーザはオイラを含めて超少数派だろうが。

  仕方なく、秋葉をブラつく。Let'sNoteがダメなら、現在のゴミノートPCの延命を図るのである。HDDだけ交換してやれば、とりあえず電車の中で快適にPCを使うことはできるだろう。ホントは電車の中でカーネルのコンパイルをできるくらい、タフなPCが欲しいが、無理を言ってはいけない。

  問題は持ってきたHDDのマウンタが、なぜかトルクス止めになっているコトだ。メビウスのACアダプタといい、携帯のベンツネジといい、なんでこういうイケズなコトをするのか。そんなにオイラのような分解野郎の財布を直撃したいのか。いちいちネジ回しを買わなきゃいけないではないか……などといいつつ、ヒロセテクニカルへ向かう。HDDを出して、どのドライバが合うか試す。あ、これが合うな。ちゃんと回るかな? 回るね。外せるかな? 外せるね。念のため、反対側のネジも外せるかな? 外せるね……すまんッ!! 今度はドライバーを買うから!! ありがとう!! ヒロセテクニカル!!

  若干能力がプア目のノートPCのHDDのチョイスはチョイと難しい。バッテリーをガンガンと削るほどのハイパフォーマンスHDDは困るし、あまり遅くても処理能力に影響が出る。容量は20Gもあればいいのだが、容量が上がるにつれて、情報密度が上がるため、読み書き速度も上がるという傾向もあると考えられる……結果、チョイスしたHDDは「MK4026GAX」。40Gバイト回転速度5400rpmと一見フツーのスペックながら、16MBという巨大なキャッシュが載っている。しかもコレで7,680円ナリ。これで少しは処理速度が改善されるといいが。あとは、ちょろちょろと秋月で買い物して帰宅。

  画像の説明 画像の説明

  家に帰って早速、新しいHDDに入れ替える。トルクスのドライバを買わなかったので、4本のうち2本しかネジ止めしていないが、HDDをサクッと入れ替える。お。ちゃんと認識するぞ。KNOPPIXを立ち上げてパーテイションを切る。10G、20G、10G。アタマの10GにWindows2000を導入。なんとなく、かなり体感的に速度が上がった気がするぞ。容量に余裕があるから、coLinuxにも2G+4Gを割り当ててあげよう。CDもbinもsrcも6枚とも入れてしまおう。

  つーわけで、なんとかLet'sNoteを思いとどまり、もう少しゴミノートを延命して使うことにした。しかし、ちょっと気になるのが、このHDDの振動だ。内蔵CD-ROMドライブまではいかないものの、左の手のひらにかなりの振動が伝わる。大丈夫なんか……コレ。


2005-11-21(Mon) USBメモリでモバイルcvs!!

  今日はちょっとメモ書き。ノートPCのHDDを慎重に新調して伸張したので、改めていろいろと環境を構築してみたいと思う。今日は、職場と家と、CygwinとcoLinuxとで、グッチャングッチャンになってしまっている、文書やプログラムを一括管理するため、cvsを導入するという話。

  cvsを導入するといっても、職場と家とを一括で管理する必要があるから、リポジトリはUSBメモリを活用することにする。先日、iPodシャッフル替わりに購入してはみたものの、電源を切る度に1曲目から演奏という恐るべき仕様のために、256Mという大容量がサッパリ活用できないスットボケアイテムを活用するのである。

  画像の説明

  コイツをCygwinからcvsリポジトリに使うならなんの工夫もいらないが、coLinuxから使うには、通常とは逆にWindows上のドライブをcoLinuxから読み書きできるようにする必要がある。確かsmbmountというLinux上からWindows上のドライブをマウントするアプリを利用すればできるであろう。さてトライ。

  まずは、USBドライブのドライブレターを決めておく必要がある。USBだから「U」にしよう(安直)。マイコンピュータ、管理、ディスクの管理、ドライブ文字とパスの変更から、ドライブレターを変更してやる。そしたら、マイコンピュータ上のリムーバブルディスク(U:)、共有、新しい共有から、共有名を「usb」にしてやる(さらに安直)。でもって、マイネットワーク、近くのコンピュータから自分のPC(オイラのPCの名前はJyokusyuだ)を開いてやる。「usb」という共有ドライブができていればオッケーだ。

  今度はcoLinux側からマウントする設定に移る。マウントポイント「/mnt/smbusb」を作り(究極に安直)、smbmountでマウントしてやる。ワークグループ名やユーザ名は適当に合わせること。

# mkdir /mnt/smbusb
# smbmount //Jyokusyu/usb /mnt/smbusb -o username=Administrator workgroup=MYGROUP
Password:

  cvsの初期設定をする。最近、使ってないからmanや/usr/shareの下のドキュメントをチラ見しながらの作業である(ってほどのことでもないけど)。

# export CVSROOT=/mnt/smbusb/cvs
# cvs init

  基本的な設定はコレだけだ。テストに移ろう。テスト用プロジェクトのディレクトリを作って、移動する。

# mkdir test
# cd test

  テスト用のドキュメントを作る。バージョン管理するファイルである。内容は「This is CVS test.」の1行だけ。

# vi test.txt
This is CVS test.

  プロジェクトをcvsに登録(import)する。適当なコメントをつける。このコメントがとっても悩ましいが、ちゃんとした名前を付けるクセを付けておくと有効だぞ。Rubyの人も「名前重要」と言っている。

# cvs import test itline initial
This is CVS test initial check in.
CVS: ----------------------------------------------------------------------
CVS: Enter Log.  Lines beginning with `CVS:' are removed automatically
CVS:
CVS: ----------------------------------------------------------------------

  この段階で、USBメモリのリポジトリの中にファイルは移動しているハズだ。プロジェクトの登録が終わったので、消してしまおう。

# cd ..
# rm -rf test

  改めてプロジェクトをチェックアウトする。ディレクトリの中を見てさっきのファイルが復活していることを確認しよう。

# cvs checkout test
# ls -lrt test
合計 8
-rwxr-xr-x    1 root     root           18 11月 22 10:56 test.txt
drwxr-xr-x    2 root     root         4096 11月 22 10:58 CVS

  今度はcvsの機能を活用してみる。cvsの真骨頂は常に差分を意識しながらプログラムが組めることだ。これにより、コミット直前に不要な修正が含まれていないか確認することができる。さっきのテスト用ドキュメントに修正、追加してみる。

# cd test
# vi test.txt
This is CVS change test.
This is CVS add test.

  状態を確認しよう。cvs updateはcvsの基本だ。cvsは複数人が同時にソースに触れられるから、暇さえあればcvs updateをして、リポジトリの状態を確認するといい。

# cvs update
cvs update: Updating .
M test.txt

  修正を加えたから「M」マークが出ている。どんな修正を加えたか確認してみる。cvs diffだ。

# cvs diff
cvs diff: Diffing .
Index: test.txt
===================================================================
RCS file: /mnt/smbusb/cvs/test/test.txt,v
retrieving revision 1.1.1.1
diff -r1.1.1.1 test.txt
1c1,2
< This is CVS test.
---
> This is CVS change test.
> This is CVS add test.

  行がどのように修正されたか一目瞭然だ。実際にはcvs diff -bcなんて使うことが多いかな。じゃ、最後にコミットだ。

# cvs commit
This is CVS commit test.
CVS: ----------------------------------------------------------------------
CVS: Enter Log.  Lines beginning with `CVS:' are removed automatically
CVS:
CVS: Committing in .
CVS:
CVS: Modified Files:
CVS:    test.txt
CVS: ----------------------------------------------------------------------

  これでUSBメモリ上に更新が反映された。反映されたことを確認してみよう。

# cvs update
cvs update: Updating .

  コミット後は「M」マークが消えていることで確認できる。これで、職場も家も、CygwinもcoLinuxも、ファイルを一元管理できるのだ。やっほー。

  ……などという作業を、1時間の帰りの電車の中で試して、この文章まで書き上げてしまった。というワケで、ちょっと雑なのは勘弁。ではまた。


2005-11-22(Tue) モバイルcvs環境・改

  昨日、cvsの設定をサクッと終わらせてホクホクのオイラである。早速、朝の通勤電車の中で、現在ボツボツと進めているsar情報をグラフ化するRubyスクリプトをcvs登録しだすオイラである……

  「……早朝早々だめじゃん」

  Windows側の権限やら、coLinux側のパーミッションやらが絡まって、coLinuxの一般ユーザからマトモにcvsを使うことができない。うぅ……coLinuxの中だから常にrootで作業してもいいけど、常にrootで開発するのはチョット気持ち悪い。いやね、そりゃLinuxのサポートやりだす前は、rootでの作業率は3%くらいだったけど、最近は一般ユーザでの作業率が3%と逆転してますよ。でも、トラブルシューティングの時は特別だと思うのよ、やっぱ。

  で、結局、どのユーザでもcvsを手軽に使えるようにするには、sshを通すのがいい。sshを使うということは、どういうことか。coLinux側をcvsクライアント、Cygwin側をcvsサーバにするというコトだ。なんだ、昨日せっかく設定したsmbmountはいらなくなっちゃうのか。まぁ、いいけど。

  まずは、Cygwing側でsshdを立ち上げてみよう。えーっと、よく考えたら、今までCygwin側はsshクライアントでしか使ったことがない。どうやんだ? service……ない? /etc/init.d/sshd……ない? /usr/sbin/sshdで起動。なんだ? sshd_configがない? touch /etc/sshd_config。ダメだ……rsaキーがないとかいわれる。

  こうなりゃ、coLinux側の/etc/init.d/sshdを参考にキーを用意してやれ……

/usr/bin/ssh-keygen -q -t rsa1 -f /etc/ssh/ssh_host_key -C '' -N ''
chmod 600 /etc/ssh/ssh_host_key
chmod 644 /etc/ssh/ssh_host_key.pub

  ……ちがう!! こんなに面倒な作業が必要な状態になっているワケがない!! なんか、設定するためのスクリプトとかあるに違いない。ふと、/etc/setupの下にopenssh.lst.gzというファイルを見つけた。読む。なんだか、中にそれっぽいスクリプトが入ってるじゃん。/usr/bin/ssh-host-configってヤツ。fileしたらシェルスクリプトと判明。中を確認する……これだ!! これに違いない!! 実行!!

$ /usr/bin/ssh-host-config
Generating /etc/ssh_host_key
Generating /etc/ssh_host_rsa_key
Generating /etc/ssh_host_dsa_key
Generating /etc/ssh_config file
Privilege separation is set to yes by default since OpenSSH 3.3.
However, this requires a non-privileged account called 'sshd'.
For more info on privilege separation read /usr/share/doc/openssh/README.privsep.
 
Should privilege separation be used? (yes/no)

  なんだ? privilege separationを使うかって? 特権分離? 指示されたドキュメントを読むがよくわからない。ググるが、表面的には今までと変化なさそうだ。スクリプトでインストールしてるんだし、お任せしてみるか。yes!!

Warning: The following function requires administrator privileges!
Should this script create a local user 'sshd' on this machine? (yes/no) yes
Generating /etc/sshd_config file
Added ssh to C:\WINNT\system32\drivers\etc\services
Added ssh to /etc/inetd.conf
 
Warning: The following functions require administrator privileges!
 
Do you want to install sshd as service?
(Say "no" if it's already installed as service) (yes/no) yes
 
Which value should the environment variable CYGWIN have when
sshd starts? It's recommended to set at least "ntsec" to be
able to change user context without password.
Default is "ntsec".  CYGWIN=
 
The service has been installed under LocalSystem account.
To start the service, call `net start sshd' or `cygrunsrv -S sshd'.
 
Host configuration finished. Have fun!

  怒涛のyes&Default攻撃で乗り切ったら、net start sshdしろと出たので、素直に指示に従う。あっけなく、サービスは起動した。

  Cygwin側はとりあえずここまで。次はcoLinux側の設定。まずは鍵ペアを作ろう。

[furuta@colinux furuta]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/furuta/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/furuta/.ssh/id_rsa.
Your public key has been saved in /home/furuta/.ssh/id_rsa.pub.
The key fingerprint is:
35:0e:01:f2:92:3f:8e:a7:df:84:35:87:ef:e4:bf:b5 furuta@colinux

  公開鍵を表示させてクリップボードにコピる。

[furuta@colinux furuta]$ cat .ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEA7QpG1JtPtlBuoygHdKK8N+SWf/ab2pM9hYOlPaBzNRn9slkjkrz7kW8+ptQUZfQn/aYsOtjAIDfiICA9SmeojLd5FELxeXb7/LWu0s3Cni9TaltflKasuALtMtXK8RPzGRtQh4DNX7MIedZhjBKlM5GY14uAOTnWZkpJNA0nVWU= furuta@colinux

  coLinux側から、Cygwin側にsshでログインする。最初はパスワードログインだ。

[furuta@colinux furuta]$ ssh jyokusyu -l Administrator
The authenticity of host 'jyokusyu (192.168.0.1)' can't be established.
RSA key fingerprint is 21:63:89:39:6b:56:64:55:a2:91:2c:d2:d4:ec:1c:a4.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'jyokusyu,192.168.0.1' (RSA) to the list of known hosts.
Administrator@jyokusyu's password:
Last login: Tue Nov 22 09:05:57 2005 from jyokusyu
Fanfare!!!
You are successfully logged in to this server!!!

  ログインできた。公開鍵を登録してやる。

$ vi .ssh/authorized_keys

  2度目のログインはノーパスワードである。ウホウホ。

[furuta@colinux furuta]$ ssh jyokusyu -l Administrator

  ここまできたら、coLinux側からCygwin上のcvsのリポジトリを指定してやる。

[furuta@colinux furuta]$ export CVSROOT=:ext:Administrator@jyokusyu:/cygdrive/u/cvs
[furuta@colinux furuta]$ export CVS_RSH=/usr/bin/ssh

  ssh接続なので、環境変数CVS_RSHの設定も忘れないようにする。ここまで設定が終わったら、Cygwin側に戻って、リポジトリを初期化してやる。

Administrator@jyokusyu ~
$ mkdir /cygdrive/u/cvs
$ export CVSROOT=/cygdrive/u/cvs
$ cvs init

  初期化完了。こっちは普段からAdministrator権限で作業しているので、ssh経由でなく読み書きする設定にしてある。

  あとは職場のPCの設定。こっちもダイレクト書き込みでもよかったが、自分のPCをcvsサーバに設定しておくと、接続先ホストで開発を行う時にも使えて便利である。自分のPCがWindowsXPの場合、ファイアウォールの22番ポートに穴をあけておくことも忘れずに。

m-furuta@1TL1NE ~
$ export CVSROOT=:ext:Administrator@localhost:/cygdrive/u/cvs
$ export CVS_RSH=/usr/bin/ssh

  職場のPCでは普段Administratorで作業してないので、PC自らがアクセスする場合にもsshでログインするように設定した。以上でめでたくモバイルcvs環境の構築完了である。


2005-11-23(Wed) coLinuxをブラッシュアップ

  coLinuxにWHEL3をインストールしてしばらく経つ。1台のノートPCの中にWindowsとLinuxを入れ、電車の中でも「ほぼ本物」のLinux環境を使えるようになってとても満足している。そのうち、coLinuxでWHEL3を使う方法についてまとめようと思いつつ放置してあるが、そんな中、とうとう怒りが爆発させるオイラであった。

  「いい加減にせんかッ!! 日経Linuxッ!!」

  すでにバックナンバーになっているので、いまさらではあるが、2005年7月号。特集は「独自coLinux作成術-お気に入りディストリビューションで挑む-」というもの。オイラは試行錯誤しながら、一部、不可解な作業を伴いつつ、苦労してWHEL3をインストールした。それをスマートに記事としてまとめているかと思ったら、特集の頭から一般論が始まり、途中から「独自のイメージはこう作る」という題目のもと、フツーにダウンロードできるDebianの中身を少しずつFedoraに置換していく作業を9ページもダラダラと並べ「如何にDebianの中身を入れ替えようがFedoraにはならない」などというギャグをかましたかと思ったら、最後の1ページで「インストーラを配布しているサイト」を紹介して終了である。

  「ザケんなッ!!」

  今月の特集は「独自coLinux作成術-お気に入りディストリビューションで挑む-」じゃねーのかよ!? こんなのサギじゃねーか!! 特集の根幹を「サイト紹介」で済ます神経も、すっかりイッちゃってる精神状態としか思えないが、そのサイトでもVineとFedoraほかRedhat系を中心とした数ディストリビューションにしか対応してないのだ。まったくのサギ、いやゴミ記事である。どこが「お気に入りディストリビューションで挑む」なんだ!?

  だいたい、以前からオイラは「日経○○」に対して、疑問を感じていた。日経ソフトウェアなんて、非常に「そそる特集」を組みつつ、中身は毎度スッカラカンである。そんなこと、その辺に転がっている野良プログラマにだって書ける、というレベルの特集ばかりである。記事じゃないぞ「特集」だぞ。オイラは、1度は買って、2度目は立ち読みして、3度目からはパラパラするだけ、4度目からは特集のタイトルを見るだけ、それ以降は目にも入れないようにしている。

  というワケで「やたらと本を並べまくっている技術者の技量は疑ったほうがいい」と、以前に書いたが「日経Linuxほか日経○○をありがたがって購読している技術者の技量も深く疑ったほうがいい」と断言しておく。貴重な紙資源をこれ以上ゴミにするのはヤメていただきたいと思うオイラである。

  ……と、独自のディストリビューションではないものの、coLinuxにWHEL3をインストールする方法についてはそのうち触れる予定であるが、とりあえず、今日の作業のメモ書きである。最近、忘れっぽくて、自分で自分の日記を参考にすることが多いので……。

  以下、coLinux用にswapパーティションを追加する方法である。まずは、Windows側でCygwinのddコマンドを利用して、swapパーティションとなるイメージファイルを作る。ウチのPCは320MB。coLinuxには64Mしか割いてないが、HDDも増設したことだし、軽く256Mバイトでも割り当ててみる。

$ dd if=/dev/zero of=wb3r2_swap_256m bs=1M count=256

  coLinuxの起動設定であるdefault.colinux.xmlを修正する。coLinux側からは/dev/cobd1として見えるようにしてやる。

<block_device index="1" path="\DosDevices\d:\wb3r2_swap_256m"
enabled="true" />

  あとはcoLinuxを起動してswapを足してやる。基本的にコマンドなんてガンバって覚えるものではないが、swap関係のコマンドなんて、ことさら使用することのないコマンドであるから「くれぐれも覚えない」ようにしていただきたい。こういうのをチマチマ覚えないといけないLPICという資格も、かなり××な資格であるとツッコんでおこう。

[root@colinux root]# mkswap /dev/cobd1
Setting up swapspace version 1, size = 268431 kB
[root@colinux root]# swapon /dev/cobd1
[root@colinux root]# swapon -s
Filename                        Type            Size    Used    Priority
/dev/cobd1                      partition       262136  0       -1
[root@colinux root]# free
             total       used       free     shared    buffers     cached
Mem:         62172      40512      21660          0       4028      22044
-/+ buffers/cache:      14440      47732
Swap:       262136          0     262136

  swaponなんて、覚えなくていいったら、覚えなくていい。そんなもの覚えるくらいなら、また/etc/fstabの書式でも覚えたほうが役に立つ。ちなみに末尾の「0 0」は前者が意味のない数値、後者がもっと意味のない数値である。

[root@colinux root]# vi /etc/fstab
/dev/cobd1              swap                    swap    defaults        0 0

  さて、swapの設定が終わったところで、HDDにも余裕があることであるし、ソース一式を持ち歩くように環境設定してみよう。なんのことはない。WBEL3の3枚のソースCDをcoLinuxにマウントするように設定するだけである。まずは3枚のソースCDのISOイメージ3つを、Windows上のDドライブのルートに置き、default.colinux.xmlに以下の記述を加える。

<block_device index="5" path="\DosDevices\d:\liberation-respin2-source-1.iso"
enabled="true" />
<block_device index="6" path="\DosDevices\d:\liberation-respin2-source-2.iso"
enabled="true" />
<block_device index="7" path="\DosDevices\d:\liberation-respin2-source-3.iso"
enabled="true" />

  index="x"という設定で、/dev/cobdxに接続されるかが決定される。オイラの配布(予定)のWHEL3イメージは/dev/cobd3までしか用意してないので、coLinux側から/dev/cobd4〜7を足してやる。

[root@colinux root]# ls -lrt /dev | grep cobd
brw-r--r--    1 root     root     117,   0 11月  5 21:19 cobd0
brw-r--r--    1 root     root     117,   1 11月  5 21:19 cobd1
brw-r--r--    1 root     root     117,   2 11月  5 21:19 cobd2
brw-r--r--    1 root     root     117,   3 11月  5 21:19 cobd3
[root@colinux root]# mknod /dev/cobd4 b 117 4
[root@colinux root]# mknod /dev/cobd5 b 117 5
[root@colinux root]# mknod /dev/cobd6 b 117 6
[root@colinux root]# mknod /dev/cobd7 b 117 7
[root@colinux root]# ls -lrt /dev | grep cobd
brw-r--r--    1 root     root     117,   0 11月  5 21:19 cobd0
brw-r--r--    1 root     root     117,   1 11月  5 21:19 cobd1
brw-r--r--    1 root     root     117,   2 11月  5 21:19 cobd2
brw-r--r--    1 root     root     117,   3 11月  5 21:19 cobd3
brw-r--r--    1 root     root     117,   4 11月 23 07:35 cobd4
brw-r--r--    1 root     root     117,   5 11月 23 07:35 cobd5
brw-r--r--    1 root     root     117,   6 11月 23 07:35 cobd6
brw-r--r--    1 root     root     117,   7 11月 23 07:35 cobd7

  あとはマウントポイントを用意してやって、fstabに追加してやるだけだ。

[root@colinux mnt]# mkdir /mnt/cdrom1
[root@colinux mnt]# mkdir /mnt/cdrom2
[root@colinux mnt]# mkdir /mnt/cdrom3
[root@colinux mnt]# vi /etc/fstab
/dev/cobd5              /mnt/cdrom1             iso9660 ro              0 0
/dev/cobd6              /mnt/cdrom2             iso9660 ro              0 0
/dev/cobd7              /mnt/cdrom3             iso9660 ro              0 0

  再起動すれば自動的にマウントされているハズだが、それが待ちきれないという人は、以下のコマンドラインですぐさまマウントできる。

[root@colinux root]# mount /dev/cobd2 /mnt/cdrom1 -t iso9660

  毛が薄い人は以下のようにならないようにしよう。気持ちはわかるが。どうにもならない。

[root@colinux root]# mount /dev/cobd2 /mnt/cdrom1 -t iso9696
mount: ファイルシステムタイプ iso9696 はカーネルがサポートしていません
mount: 多分あなたは iso9660 を指定したかったのでは?

  ちなみに、このメッセージはマジで出るぞ。なかなかシャレているではないか。

  さて、ソース一式を持ち歩いても、まだHDDに余裕があることであるし、ワークエリアを追加しておこう。基本的な作り方はswapに似ている。まずは、軽く4Gでも割り当てておこうか。

$ dd if=/dev/zero of=wb3r2_ext2_work_4g bs=1M count=4096

  swapと同様、default.colinux.xmlに以下の記述を加える。

<block_device index="2" path="\DosDevices\d:\wb3r2_ext2_work_4g"
enabled="true" />

  swapと違うのは、mkswapでなく、mkfs.ext2を使うことだ。ちなみに、いまさらではあるがcoLinuxではイメージファイルはパーティションと同義である。つまり、直接/dev/cobdxになるのでfdiskは不要である。

[root@colinux root]# mkfs.ext2 /dev/cobd2

  マウントポイントを作って、/etc/fstabに記述を加える。

[root@colinux /]# mkdir home2
[root@colinux mnt]# vi /etc/fstab
      6 /dev/cobd2              /home2                  ext3    defaults,noatime    0 2

  あら。マウント失敗。そりゃ、ext2をext3でマウントしようとしても失敗するわな。ext3に変換しておくとしようか。ちなみにext3はエクストスリーと読むらしい。どーでもいーですけどね。

[root@colinux root]# tune2fs -j /dev/cobd2
[root@colinux root]# mount /home2
[root@colinux root]# df -h
Filesystem          サイズ  使用  残り 使用% マウント位置
/dev/cobd0            2.0G  1.6G  281M  85% /
none                   31M     0   31M   0% /dev/shm
/dev/cobd5            535M  535M     0 100% /mnt/cdrom1
/dev/cobd6            535M  535M     0 100% /mnt/cdrom2
/dev/cobd7            535M  535M     0 100% /mnt/cdrom3
/dev/cobd2            4.0G   33M  3.8G   1% /home2

  よっしゃ。これで余裕を持って作業ができるというものである。なんてことをしつつ、なにやら、ゴソゴソ始めるのであった。詳細は明日。ではまた。

  画像の説明


2005-11-26(Sat) Olimex再び

  いろいろあって、もう一度注文。

  画像の説明


2005-11-30(Wed) Olimex再びの再び

  ちっとも返事が来ないので、Olimexのサイトをみたら、Hotmailとかのフリーメールアカウントは見ない、と書いてある。もしかして、Gmailも? 久々に、OEをセットアップして送りなおす。ほげげ。