SVX日記
2005-12-04(Sun) ノートPC塗装指南
今日は小雨が降っていて、客が少ないかと思いきや、そんなこともなく、雨で出掛けるコトができないからか、むしろ客が多く、ついでにオイル交換でもしよっか、なんて感じなのか、オイル交換も待たされる。1時間待ち!? まーいーや。しばらく車の中でフリーセルでもして、その後は店の中でフラフラしていよう。
最近はグッと腕を上げたフリーセルで3連勝した後、店の中をブラつく。最近、熱心に工作をしていないので、あまり見るものがない……と!! SVXのカー用品でも見るか……もう、興味のあるカーグッズもないなぁ。ん? へぇ、タッチペンをスプレー化するキットがあるんだ。
と、突如として、ココで思い立ってしまった。先日、なんとか思いとどまったLet'sNoteではあるが、今のゴミノートを好きな色に塗ってしまえば、しばらくはちょっと気分よく使えるのではないか? PCカードスロットの接触不良、バッテリパックの付け根のヒビや、キーボードのフィーリングの悪化、サウンドチップのノイズなど、このノートPCもこの先さほど長く使えるものではない。別に失敗してキタナクなっても、1年ソコソコのガマンであろう。よっしゃ、塗料売り場に行ってみよう。
別に車売り場で塗料を選んでもいいのだが、そんなの無駄に高いだけである。一般家庭用の塗料なら……ほれ、298円。ラッカー系、エナメル系、アクリル系……よくわからんが、確かラッカー系は乾くのが早かった気がする。ラッカー系にしよう。色は赤。赤といっても一般家庭用の塗料であるから微妙な赤があるはずもなく、明るい原色の赤。その他のラインナップも、青、黄、緑、白、黒。とても明快だ。
場所は奥まった台所の奥。換気扇があるから、これで換気しつつスプレーすることにする。ウチは新聞を取っていないので、郵便受けの近くのゴミ箱から大量に広告類をゲットしてきて、壁にガムテープで貼り付ける。即席の塗装ブースの完成である。
あまりちゃんと塗装する気はないが、一応のことはしておく。天板に貼ってあった「銃弾の着弾跡シール」を剥がし、表面を軽くティッシュでゴシゴシする。あとは、テープによるマスキング。天板の側面を塗るのは面倒なので、天板の上部分を残して、すべてマスキング。あ、表面にCOMPAQのバッジがあるので、そこはマスキングテープを貼ったあと、カッターで丁寧に切り抜く。
あとは、ブシューッ!! である。下地が黒なので発色が悪い。10往復したあたりで小休止。ウチワ代わりのCD-Rで扇ぐ。なんとなく、ヌレたようなテカリが収まったあたりで、また、ブシュー。タレないように気をつけながら幾度となく繰り返す……と、あれ? なんだか、手が粉っぽい……ん? 手が赤いぞ!? 思わず手をコスり合わせると赤さが落ちる……!? どうやら、このラッカーという塗料、塗料が霧として浮遊している間にも、乾燥が進捗し、床に落ちる頃には粉末になってしまうという特性があるらしい。
あぁ!! ジーパンのヒザが赤くなっている!! 床も壁も赤くなっている!! 鏡を見たら、鼻の穴の中の鼻毛まで真っ赤になっている!! でも、ジーパンは払えば落ちるし、床も壁も拭き取れるし、鼻をかめばテッシュは赤くなり鼻毛は黒に戻る……。
……と、そんなコトはどうでもいい。肝心のノートPCはどうなんだ? ちょっとムラになった? いや、そんなコトはない。それは光の都合で影が落ちてそう見えるだけだ。ペンライトで照らせば、かなり美しく赤に染まっているように見える……というのも、台所の奥では光源が電球と蛍光灯のミックス光で、ヘンな影も落ちており、どんな色をしているのかサッパリつかめないのだ。
注意深く見ると、若干ホコリが塗装面に落ちてしまっている。完全に乾く前に取り除くべきか? ピンセットで慎重に取り除こうとすると……あぁ!! 塗装面に触れてしまった!! ……あれ? どうにもならないぞ? というか、すでに乾いている!? ラッカーは乾くのが早いとは聞くが、ココまで早いのか!? マジかよ!?
念には念を入れ、ホコリを取り除いた後、1時間ほど放置する。一応、換気扇はつけっぱなし。ボケーッと待つ。1時間が経った。塗装面に触れないように、そっと持ち上げ、マスキングテープを剥がす。かなり厚塗りしたつもりだったが、マスキングの境界面がボッタリしていることもなく、想像以上に美しく仕上がっている。恐る恐る塗装面に触れてみる……大丈夫、完全に乾いている。手のひらで、ダーッっとナデてみる。ちょっとホコリがついた部分がザラザラしているが、塗装の美しさに影響が出るほどではない。居間の蛍光灯の下でシゲシゲと仕上がりを見てみる。想像以上の完璧ぶりである。勇気を出してティッシュで磨き込んでみる。塗装はさらに輝きを増す。仕上げにCOMPAQのバッジのマスキングを剥がす。すっげー!! こんなにキレイに仕上がるとは思いもしなかったよ!!
というワケで、ムチャクチャ気に入ってしまった!! PCが赤くなるだけでこんなに楽しいとは!! そして、ラッカー塗料がここまで扱いやすく、こんなにも強靭だとは!! 早速、バッテリを取り付けて、バキ……なんだ? バキて? わー!? バッテリーの付け根がクラッシュしとる!! こんなにキレいに塗れた矢先に壊れるかッ!?
結局、バッテリを力学的に接続する部分のパーツを取り去ったら、なんとなく、使用に問題がない状況にはなったが、これ、まるでメビウスのヒンジの片側が壊れたときみたいになってる……どうしようかなぁ……HDDは換装したばかりだし、こんなにキレイに塗れたトコだから、まだまだ使うことに違いはないが、バッテリの付け根をどうやって補修するか? 瞬間接着剤? ホットボンド? 可動部だけにちょっと慎重にならざるを得ない。まぁ、当面はプラプラ状態で使うかなぁ……。
2005-12-08(Thu) うるう秒を先取る
久々にうるう秒がやってくるらしい。地球の自転のズレがどうとかで発生する、いわば「スキマな時間」であるワケだが、たった1秒であるから有効に活用することもできない。うるう年にある「うるう日」は、シッカリ24時間あるから活用できるが、暦の一部であるからフツーに平日である。ちぇ。
ちなみにこの「閏」という漢字。元は「うるう」という読みはなく「ジュン」と読むのが正しかったらしい。なんでも「潤」の漢字と読み間違ったところから「うるう年」という読みが生まれ「閏」の訓読みとして定着したそうな。マコトにダサいが、ママあるコトでもある。オーケー、OK、Oll-Kollect、All-Collect……こいつもそうだしな。
もうひとついうと、うるうシリーズには「うるう年」「うるう月」「うるう日」「うるう秒」がある。うるう月は太陰暦の概念であり、現在の暦には存在しない。一方で、うるう年はうるう日の存在する年を表す言葉であり、実体を持たない時間である。コトバというものの、誠にファジーであることよ。
それに引き換え、地球の自転の正確なこと。そりゃ、4年に一度、100年に一度、400年に一度の「うるう日」の補正は入るが、それ以外は数年に一度のうるう秒だけなんて、どうにかしているとしか思えない正確さ、偶然さである。月がいつもこっちを向いているのと同じくらい奇妙である。いつか悪いことがおきるような気がするぞ。知らないぞ。
しかしながら、いただけないのは、365日、7日/週、12月/年という現在の暦制度。プログラムでの日時の扱いの面倒だったらない。まぁ、365を因数分解したところで、5x73までしか分解できないから、画期的に美しい暦は提案できないだろうから、仕方ないトコロではあるが……あぁ、この世の基数が2でないことの、なんという醜さよ、かく言う私の指も片手に8本ないのが恨めしい……というギャグは置いておいて。
さて、今日のテーマはうるう秒である。たった1秒であるが、これが結構ややこしい。なにがややこしいかって、うるう秒がOSでどう扱われているかがややこしいのだ。で、オイラはLinuxの人なので、このあたりの知識をねっとりと勉強するハメになった。実はこの件に関しての質問が多いのよ。1秒くらいどうでもいいじゃんとは思うし、その1秒を重要視する必要のある状況は多くないだろうから、興味本位の質問だとは思うのだが。
結論から言うと、Linuxのカーネルにはうるう秒が清く正しくプログラムされている。このインターネット時代、NTPで時刻同期をするのはもはや常識ではあるが、このNTPプロトコルにもうるう秒を取り扱うための情報が含まれているのだ。その名もLI(LeapIndicater)ビット。このビットはうるう秒が存在する日は一日中オンになっていて、この情報は下位のNTPサーバに伝播していく。
で、問題は実際の補正がどのように行われるかである。NTPクライアントがLIビットを受け取ると、これはOSに渡される。Linuxの場合、カーネル内部のtime_stateという変数がTIME_INSに変化する。そして、時間が日本時間で8時59分59秒から60秒になった瞬間、60秒から1が引かれ、59秒に戻されるのである。かくして1秒間の余計な時間が刻まれることで、その瞬間とて、1秒足りともズレることなく正しく時が刻まれるのであった。
392 case TIME_INS:
393 if (xtime.tv_sec % 86400 == 0) {
394 xtime.tv_sec--;
395 time_state = TIME_OOP;
396 printk(KERN_NOTICE "Clock: inserting leap second 23:59:60 UTC\n");
397 }
398 break;
385 case TIME_OK:
386 if (time_status & STA_INS)
387 time_state = TIME_INS;
388 else if (time_status & STA_DEL)
389 time_state = TIME_DEL;
390 break;
240 #define TIME_INS 1 /* insert leap second */
221 #define STA_INS 0x0010 /* insert leap (rw) */
このビットを立ててやれば、なにも正月を待つことなく、明日の朝9時にでも、うるう秒を挿入することができるのである。このビット、通常はNTPから、おそらくadjtimex関数経由で立てられるビットであるが、面倒くさいので今回は直接カーネル内部の変数をイジってしまうことにする。カーネル内部の変数をイジるには、以前に作ったモジュール、intruder.cを使う。
1 //
2 // カーネルの内部変数を確認、変更する&内部関数を呼ぶモジュール
3 //
4 // コンパイル方法
5 // # cc -c -I /usr/src/linux-`uname -r`/include intruder.c
6 //
7 // 実行方法
8 // # insmod intruder.o; rmmod intruder; dmesg | tail
9 //
10
11 #define MODULE
12 #include <linux/module.h>
13
14 #include <linux/kernel.h> // for printk
15 #include <linux/time.h> // for struct timeval
16 #include <linux/timex.h> // for STA_INS
17
18 int init_module(void) {
19 printk(">>> Intruder module installed.\n");
20 {
21 int* time_status = (int*)0xc0XXXXXX; // /boot/System.map - time_status
22 printk("time_status = %x (before)\n", *time_status);
23 *time_status |= STA_INS;
24 printk("time_status = %x (after)\n", *time_status);
25 }
26 {
27 int* time_state = (int*)0xc0XXXXXX; // /boot/System.map - time_state
28 // *time_state = 1;
29 printk("time_state = %x\n", *time_state);
30 }
31 return 0;
32 }
33
34 void cleanup_module(void) {
35 printk("<<< Intruder module uninstalled.\n");
36 }
37
38 MODULE_AUTHOR("ITLine Inc. <furutanian@gmail.com>");
39 MODULE_LICENSE("GPL");
40 MODULE_DESCRIPTION("Kernel Intruding Module");
time_statusとtime_stateはカーネルのグローバル変数であるが、外部に公開されていないので、上記の「0xc0XXXXXX」部分に直接アドレスを書き込む必要がある。書き込むアドレスを知るには/boot/System.mapを参照し、現在稼動中のカーネルのシンボルを確認しなければならない。アドレスを間違えるとカーネルのどこかを適当に書き換えてしまうので、暴走する危険があるので注意だ。そもそもSystem.mapがなかったり、情報が不足している場合は、以下のコマンドでvmlinuxからSystem.mapを生成するとよい。
nm vmlinux | grep -v '\(compiled\)\|\(\.o$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | sort > System.map
で、ちゃんとintruder.cの該当部にアドレスを書き込んでコンパイルしたら「# insmod ./intruder.o; rmmod intruder; dmesg | tail」を実行。time_state = 1が表示されたら「うるうビット」が立った証拠である。「date -s "mm/dd 8:59 2005"」を実行、時刻を8時59分にセットして、dateコマンドを連打。うるう秒が発生するのを待とう。
Www Mmm dd 08:59:60 JST 2005……出た? なに!? 出なかった? そう。実は「59秒が2秒間継続する」だけで、60秒という時間は出てこないのである。というのも、UNIXの標準を定めているPOSIX規格では、うるう秒の存在は「ないことになっている」のである。まぁ、確かに数年に一度だけ60秒なんて数字が出てこられたら、アプリケーションが問題を起こしてしまうよな……ん? 待てよ? すると、アレはなんなんだ!? 「man strftime」の中の「%S 秒 (10 進数表記) (00-61)」の記述は!? オイラが見たい未来は、こんな59秒が2秒間続くような未来じゃないんだッ!!
確かにPOSIX規格の中には60秒は存在しない。しかし、タイムゾーンの設定によっては、POSIX規格を敢えて外れ、うるう秒を正しく処理することもできるのである。ちなみに、タイムゾーンの設定はWBEL3(RHEL3)の場合「/usr/share/zoneinfo」の下にある。
# find /usr/share/zoneinfo -name Tokyo -exec ls -l {} \;
-rw-r--r-- 2 root root 125 12月 16 05:44 /usr/share/zoneinfo/Asia/Tokyo
-rw-r--r-- 2 root root 125 12月 16 05:44 /usr/share/zoneinfo/posix/Asia/Tokyo
-rw-r--r-- 2 root root 309 12月 16 05:44 /usr/share/zoneinfo/right/Asia/Tokyo
3つのファイルが見つかった。デフォルトはAsia/Tokyoで、実はAsia/Tokyoとposix/Asia/Tokyoは同じ物である。つまり、デフォルトではPOSIX準拠の動作が行われるために、60秒という時間を刻むワケがないのである。そこで、以下のコマンドを試してみる。
# date; TZ=right/Asia/Tokyo date
2005年 12月 12日 月曜日 09:23:36 JST
2005年 12月 12日 月曜日 09:23:14 JST
同じJSTのハズなのに、後者は22秒遅れている。実はこれこそが、今までに発生したうるう秒を考慮した「right」な時間なのである。このタイムゾーンファイルright/Asia/Tokyoには、今までのすべてのうるう秒が登録されている。しかしながらRHEL3の発売当初には、今年の正月にうるう秒が挿入されるコトなど判明しているワケがない。よって、うるう秒発生の場合にはタイムゾーンファイルを更新する必要があるわけだ。以下の場所から、最新のタイムゾーンファイルをダウンロードしよう。
ftp://ftp.redhat.com/pub/redhat/linux/updates/enterprise/3ES/en/os/SRPMS/tzdata-2005m-1.EL3.src.rpm
# rpm -ivh tzdata-2005m-1.EL3.src.rpm
# rpmbuild -ba /usr/src/redhat/SPECS/tzdata.spec
# rpm -ivh /usr/src/redhat/RPMS/noarch/tzdata-2005m-1.EL3.noarch.rpm
1 #!/usr/bin/ruby
2
3 p ENV['TZ'] = 'Asia/Tokyo'
4 p Time.now.strftime('%F %T')
5
6 p ENV['TZ'] = 'right/Asia/Tokyo'
7 p Time.now.strftime('%F %T')
後はタイムゾーンを「export TZ=right/Asia/Tokyo」で設定して、さっきの「insmod ./intruder.o; rmmod intruder; dmesg | tail」は「やらない」。そして今度は「date -s "01/01 8:59 2006"」を実行し、ホントにうるう秒が発生する時刻の直前にセット。チョイと小洒落て「while true; do ./strftime.rb; echo; sleep 1; done」なんて小細工しちゃったりして、うるう秒が発生するのを小粋に待とう……
# while true; do ./strftime.rb; echo; sleep 1; done
"Asia/Tokyo"
"2006-01-01 09:00:20"
"right/Asia/Tokyo"
"2006-01-01 08:59:58"
"Asia/Tokyo"
"2006-01-01 09:00:21"
"right/Asia/Tokyo"
"2006-01-01 08:59:59"
"Asia/Tokyo"
"2006-01-01 09:00:22"
"right/Asia/Tokyo"
"2006-01-01 08:59:60" ←60秒目が発生!!
"Asia/Tokyo"
"2006-01-01 09:00:23"
"right/Asia/Tokyo"
"2006-01-01 09:00:00"
2005-12-27(Tue) 次期PCを選んでみる
先の日記に書いているが、新しいノートPCを購入したくてうずうずしているオイラである。しかし、新品でノートを購入したのは、10年近く前のMacのPowerBook550cが最後かな。その時は特に持ち歩く必要も無く、むしろ据え置きで使っていたので、ノートの拡張性のなさに泣いたこともあり、二度と割高なノートなんか買うかと心に決めた気がするが、状況が変われば心も変わる。まぁ、毎日電車の中で2時間近くも使えるとなれば、変わって当然であるが。
で、現代のノートPCにおいて、もっとも金が注ぎ込まれるのは、ハイテクでなく「軽量」「稼動時間」「堅牢」である。この点、ふんだんに金のかかっているLet'sNoteは文句がつけようがないほどに素晴らしい。それは疑う余地がない。当然ながら高い!! もうひとついうと、先日も書いたが、色が選べるのにもかかわらず、オイラの気に入る色がない。
そんな時に浮上してきたのが富士通のLOOX……いや、なに、別に買うつもりはなかったんだけど、色が選べてその中にイタリアンレッドがあればイヤでも注目するってもんだ。色は好みだし、Let'sよりは安いし、ウチのカミさんが既に5年くらい使っている昔のLOOXは、まだ目立って壊れてないし……これも悪くない……んが、画面が小さいんだよなぁ。重量的にはLet'sと同等なんだけど。フニフニとネットサーフィンするだけなら、どうでもいいんだけど、電車の中でバリバリと文章を打ったり、プログラミングしようと思うと、キーピッチが18mmpと狭いのもマイナス。
えーい!! ほかにオイラの心をつかむPCはないのか!! ……と、我が某社(?)のページを見ると……赤いPCがある。なんだかド派手な赤でなく「カシスレッド」という色であり、もしかすると気に入らなかったLet'sの「キールロワイヤル」と似たような色かもしれないが、コイツは使用する状態で目に入る側にこの色が配置されているのが、なんだかうれしい。Let'sもLOOXも天板の色なんだよね。オイラが自分で赤く塗ったPCもそうだけど、使っているときにはその色が目に入らないってのはちょっぴりツマらない。
いやいや、色だけで決めてはいけない。基本性能はどうなのよ? CPU速度とかHDD容量なんてどうでもいいけど、大きさとか重量とか……厚い!! 4cmもある。一応、N社のカテゴリではモバイル範囲に属しているが、間違いなくリアルモバイルを目指したPCではない。しかし、スペックを読めば読むほど悪くない。オイラは1スピンドルマシンで十分なのだが、DVDは取り外せて、取り外せば1.6kg。少々重いが、今まで使っていたARMADAだって1.45kg。気になったことはない。
バッテリ稼動は5.8時間。まぁ、実際にこの時間を稼動するとは思ってないが、8割計算でも4時間半。行き帰りの電車の中でカーネルをコンパイルする(するのかよ!!)くらいの用途には十分だろう。2時間持てば会社で充電する必要はなくなるのでACアダプタを持ち歩く必要がなくなり、その分も、軽量になる。
一方で、かなり期待が持てそうなのがキーボード。近所のビックカメラでちょっとイジった感じでは、かなり自然なキータッチ。ちょっと柔らかめではあるが、ノートPCであまりガツガツと指を落とすのは精神衛生上よろしくないので(下にHDDがあるし、キーの交換は効かないし)、この辺も好印象。なんといっても、フツーに「半角/全角」キーが「1」キーの横にあるのが気に入った。オイラの場合、このキーは「ESC」キーに割り当てて使うことになるのだが、viやemacsを使用する場合、非常に使用頻度が高いキーなのである。Let'sが気に食わないのは、このキーが上にオフセットされていること。思えば、パンピーは「半角/全角」や「ESC」キーなんて使用頻度低いんだろうなぁ。
で、値段。なんと、アウトレットに出ているモデルは、本来はオプションの無線LANを装備して、14万チョイ。単純比較でLet'sより10万近くも安い。そりゃ、堅牢性はかなり落ちるであろうが、ノートPCなんて気をつけていたって壊れるときは壊れるモノである。
ここで思い出すのが、Rubyの作者であるmatz氏の先日の日記。ThinkPadを購入したものの、どうにも不安定なのでメモリチェックをしてみたら、メモリ化けが起きていた。つまりはメモリモジュールの不具合。彼の場合は、保障期間や保障範囲がどうとかで、実費になってしまうらしく、激しくPCを使う人は必ず保険に入っておいたほうがいいとのコト。そりゃある意味、毎日持ちあるくオイラは、上位1%に入るハードユーザに間違いはないであろう。で、不意の破損も保障してくれる保険はいくら? え? 3年で1万!? 入るッ!! 入りますッ!! 海外でレンタカーする時も一番安い保険にしか加入しないオイラであるが、これには入らなきゃソンというものである。