MX700(ワイヤレスマウス)の修理のため、修理受付窓口に電話したとき、予想通り「交換になる場合はMX1000への交換を勧めさせていただきます」って言われたけど、MX700のまま交換してくれないか聞いてみたところ、MX700を希望の場合はそれを書いて送ってほしい、とのこと。で、先週修理に出したんだが、今週になって新品になって戻ってきた。もちろん希望通りMX700のまま。今月の初めごろからMX1000を使ってきたけど、やっぱり慣れない。使い慣れた700の方がいいよ。帰ってきてよかった。とりあえず、700も長持ちするように、両方交互に使うことにした。電池が切れるごとに入れ替え。幸い、受信機の受信機能自体は700と1000で互換性があるので、PCには700の受信機だけをつないでおく。2つ受信機があると邪魔なのと、電源タップ、USBの両方に余裕がないので、1000の受信機はPCから離れたところにおいてUSBを接続せずに充電専用にする。できれば充電も互換性があればよかったんだけど、ACアダプタの記載では700は5.6V、1000は8Vで違うのであきらめる。
ネットワークがめちゃくちゃ遅くなったらしく、一昨日から何回も電話やメールが実家の人たちから飛んでくる(結局1人1回以上電話がかかってきた)。数ヶ月前に、ある1台から全くつながらないことがあって、OSの設定の問題だと思ってら、実はハブのポートが一つ死んでたというオチだった、ということがあったので(そのときはちょうど実家に帰る予定があったのですぐに解決した)、またハブが原因か?と思った。で、電話越しにLEDの状態を確認してもらったけど、点灯してるらしい。しかも、「全然使えないわけじゃなくてやたらと遅い」らしいので、おそらく無線LANかなぁ、と。今使ってるのは5年前に買ったのだしね。今度の休みに見に来いとか言われたけど、往復の交通費より無線LANのアクセスポイントのほうがよっぽど安いので、通販で実家宛に送り込んでおくことにする。それにしても、確か5年前に買ったときはルータ無しハブ無しの単機能アクセスポイント1台+クライアント1枚で5万ぐらいしたと思うんだけど(しかも802.11bの11Mbps)、いまや802.11g/11b両対応のAP+クライアントのセットは1万で買えちゃうんだな。
とりあえず、ソフトを作るための最低限のIPv6環境が完成。いろいろ調べてみたところ、自分のネットワークまでネイティブなIPv6環境がつながってない場合は、IPv6のグローバルIPを1つ得るためには、IPv4のグローバルIPが1つ必要みたい。2台をつなげてテストしたいけど、自分のところにはIPv6は来てないし、IPv4のグローバルIPも1つしかないので断念。IPv4のIPが1つでもがんばればできるかもしれないけど、大変だし普通の環境じゃなくなってテストの意味が無いかと。
そういうわけで、外とは接続しない前提で構築することにした。あくまでもテスト用なので、IPアドレスも自分で設定する。こういう用途で使うためのアドレスは、当初はサイトローカルユニキャストアドレスを使うことになっていたらしいけど、最近ではユニークローカルなアドレスを使う方針に決まりつつあるらしい(決まったという情報は見つけてない)。で、自分で勝手に割り振っていいのはfd00::/8の空間らしいので、この範囲で決めればいい。インターフェースにアドレスを追加するには、
(Windows XPの場合) > ipv6 adu 4/fd00::1234 (/の前の4はインタフェース番号) (Linuxの場合) % ifconfig eth0 add fd00::1235/64 up (eth0はインタフェース名、64のところはネットマスクビット数)
とする(ここで手動設定したアドレスは、OSを再起動させると消える)。このアドレスはグローバル空間のアドレスとして認識されるため、この段階で、Windowsからのアクセスで前回のような"%"つきの表記が不要になる。前回はWindows機のFireFoxからLinuxのApacheにアクセスするとエラーが出て見えなかったのが、"%"が不要になったのでIP直打ちで見えるようになった。でも、IEではまだ無理。
続いてDNSの整備。あくまでもDNSはIPv4で引いてもらう作戦。Linux機にbind9を立ち上げ、ここにAAAAレコードを入れておく。(ホスト名はv6svrとする。アドレスはさっき自分でつけたfd00::1235。)DNSの設定自体の問題との切り分けのため、IPv4用にAレコードも入れておく(ホスト名はv4svrで、192.168.1.10)。digコマンドでAAAAレコードを問い合わせて取得できることを確認。続いてWindowsのDNS設定をLinux機のアドレス(192.168.1.10)に設定。ここで、IPv4のDNSサーバとして設定することに注意。IPv6のDNS手動設定がXPではできないみたいだったので心配だったけど、どうやらIPv4で設定したDNSでAAAAレコードが返ってくればIPv6でアクセスしてくれるみたいで、Pingも名前で飛ばせるようになった。IEでもIPv6用に設定した名前(v6svr)でアクセスできるようになった。
引き続きIPv6の話題。そもそも今やっているのがCGIで使うPerlスクリプトなんだけど、CGIの場合は通信自体はHTTPサーバがやってくれるので、Perlとしては環境変数から読んだアドレスをどうやって扱えばいいか、ってぐらいのことしかない。また、この場合、PerlはIP通信しないので、IPv6対応が必要なのはHTTPサーバより下だけだ。なので、PerlがIPv6対応してない環境でも動くようなスクリプトで文字列を16バイトのバイナリに変換して覚えておこうと思ったんだけど、意外に大変だった。最終的にはこんな関数ができた。
# IPアドレスを文字列からバイナリに変換(IPv6) - IPv4互換/射影アドレスは非対応 sub IPv6_Addr_Str2Bin { my $data_ref = shift; my $remote_addr = shift; my ($result, $addr_t, $addr_b, $str, $data_bin, $index); # アドレスチェック if ($remote_addr =~ /(.*)::(.*)/ ) { # フィールドの省略表現あり $addr_t = $1; # "::"より前 $addr_b = $2; # "::"より後 }else{ # フォールドの省略表現なし $addr_t = $remote_addr; $addr_b = ""; } # アドレス解析(前半) $index = 0; $str = $addr_t; while ( ($str ne "") && ($index<8) ){ if ($str =~ /^([0-9a-fA-F]{1,4}):(.*)$/ ){ # フィールド1個分を処理 $data_bin[$index] = hex($1); $str = $2; $index++; }elsif ($str =~ /^([0-9a-fA-F]{1,4})$/ ){ # フィールド1個分を処理 $data_bin[$index] = hex($1); $str = ""; }else{ $result = -1; return ($result); } } # アドレス解析(後半) $index = 7; $str = $addr_b; while ( ($str ne "") && ($index>=0) ){ if ($str =~ /^(.*):([0-9a-fA-F]{1,4})$/ ){ # フィールド1個分を処理 $str = $1; $data_bin[$index] = hex($2); $index--; }elsif ($str =~ /^([0-9a-fA-F]{1,4})$/ ){ # フィールド1個分を処理 $data_bin[$index] = hex($1); $str = ""; }else{ $result = -1; return ($result); } } # バイナリに変換してセット $$data_ref = pack("S8", @data_bin); $result = 0; return ($result); } # IPアドレスをバイナリから文字列に変換(IPv6) - IPv4互換/射影アドレスは非対応 sub IPv6_Addr_Bin2Str { my $data_ref = shift; my $remote_addr = shift; my ($result, $data_bin, $str_addr); $result = 0; $str_addr = ""; @data_bin = unpack("S8", $remote_addr); # 一旦全て文字列に変換する for ($i=0; $i<8; $i++){ $str_addr .= sprintf("%x", $data_bin[$i]); if ($i<7){ $str_addr .= ":"; } } # アドレス表示の省略を適用 $str_addr =~ s/:(0:)*0:/::/; $$data_ref = $str_addr; return ($result); }
で、例えば &IPv6_Addr_Str2Bin(\$remote_addr, $ENV{'REMOTE_ADDR'}); として呼べば@remote_addrにバイナリ値が格納されるので、取り扱いが楽になる。後で文字列に戻したいときは IPv6_Addr_Bin2Str() で文字列に戻せる。ただし、IPv6のアドレス省略は一意ではないので、表記までは元に戻らないことがあることに注意。上の関数では単純に、最初にマッチする0の連続を省略してるだけだ。バイナリ化するのは予想以上に大変だったけど、文字列に戻すのは予想以上に楽だった。そういえば、ここにソースコードを載せるのってすごい久しぶりのような気がする。
Linux機のDVD-R記録。この前cdrecordで文句を言われたのでほったらかしにしてたんだけど、やっぱり自動バックアップしたいので、方法を探してみた。growisofsってのを使えばいいらしい。インストールした覚えは無いけど既に入ってたのでそれを使ってみる。バックアップしたいファイルは、固定ファイル名なので、常に同じ名前だ。これをDVDに書くときには日付つきの名前にしたいので、最初はファイル名が日付つきの名前で実体がバックアップファイルのシンボリックリンクを/tmpに作ってそれをgrowisofsに渡してみた。おぉ。なんか書いてるみたい。Windows機のドライブに入れてみてみると...サイズ0だ。やられた。シンボリックリンク自体を書かれてしまったらしい。これではバックアップになってない。仕方が無いので、同じディレクトリに日付つきの名前でハードリンクしてから書くことにした。
#!/bin/sh FILENAME=/home/hoge/bkpfile WRITEFILENAME=$FILENAME.`date +%F` ln $FILENAME $WRITEFILENAME # for only NEW disc #growisofs -Z /dev/hdc -R -J $WRITEFILENAME # for only 2nd or later growisofs -M /dev/hdc -R -J $WRITEFILENAME rm $WRITEFILENAME
スクリプトはこんな感じで。マルチボーダって(Linuxに限らず)初めて使ったんだけど、一瞬で書き終わるね。リードアウトがいらないのってすばらしい。それと、これでようやくLinux機のDVD-Rドライブが日の目を見るようになった。
久々に病院へ。この前の骨髄検査の結果が出てて(ちらっと染色体の形状画像も見えてた)、9年前と同じく、骨髄にも特に問題なし、とのこと。血小板の値を上げる薬はあるみたいだけど、効果は一時期的なものでしかも副作用もあるので、7万/mm3ぐらいで安定してる俺の場合は使う意味が無いらしい。でも、とりあえず特発性血小板減少性紫斑病という病名がつきました。公費対象の特定疾患の一つなので、申請すると毎月一部負担額上限を超えた分は自分で払わなくてよくなるらしい。が、どうも調べてみるとあんまりメリット無いかも..前年の所得税額が14万を超えてると生計中心者本人の外来でも月額上限が5775円。今の状況だと、どうせ数ヶ月に1回採血して様子を見て「今回も特に変化は無いようですね」といわれることの繰り返しになりそうな予感。これだと月額5775円もかからないので、結局申請しなくても変わらない気がする。公費の範囲がどこまでなのか(耳鼻科での鼻血の治療みたいに直接今回のと関係しない場合でも利くのか)よくわからないんだけど、そもそも俺はこの件以外は健康なので病院にいくこと自体ほとんど無いし。でもって、申請のためには、住民票と医師に書いてもらう臨床調査個人票がいるんだけど、あわせて2000円ぐらい取られた。しかも、他にも書かないといけない書類がたくさんあって結構大変な上に、毎年更新のために同様の申請を毎回しないといけないみたい。
そういえば、今日の診察で教えてもらった情報。風邪を引いたり歯を抜いたりすると血小板が低下するみたい。もしかして、親不知を抜くたびに長時間気分が悪かったのって、それが原因なのかも。あと、薬以外の治療法としては、脾臓摘出ってのもあるらしい。腹切りたくないぃ..。あ、調べたら最近は大きく切らずに摘出できるらしい。でもやだな。
いろいろ調べてみたけど、どうやら入院が必要になる境界線は3万/mm3ってところのようだ。9年前は4万〜12万の間で、当時もあと1万減ったら即入院とは言われたことあるけど、脅しでもなんでもなく事実だったわけね。風邪を引いたりしてるときはもしかしたら最近でも3万割ってるかもしれない..こりゃ、普通の人以上に風邪には気をつけないといけないな。
何ゆえか職場の自分の席からかなり遠いところにあって、完食率の低さ&リピーター(2個以上食べる人)の少なさのおかげでたくさん残ってたので、1個もらってきて今日になって食べた。噂どおり、お世辞にもうまいといえる代物ではなかったが、完食。吐き出すほどではなかった。でも、甘くない味が混ざったキャラメルはだめだろ..。とりあえず、北海道に行ったときに自分で買ったバター飴でお口直し。あー、こっちは天国だ。
いまどきネットワークのソフトを作るんなら、やっぱりIPv6対応は当たり前。ということで、とりあえず自室内でIPv6を使えるようにすることにした。外との通信はとりあえずおいといて、隣のマシンとお互いに通信できることを最初の目標とする。まず、Linuxマシン(debian r3.1)は、この前sargeを入れた段階で勝手にIPv6対応してたので何も必要ない。WindowsXPマシンは、ネットワークのところでIPv6のプロトコルを入れれば完了。で、この後、お互いにPingを通すところで苦戦。まず、現状はルータがIPv6対応じゃないので、ネイティブなIPv6のままでは外に出ることはできないので、グローバルなアドレスも決まらない。とりあえず、link-localなアドレスで通信することにする。Linux側は、普通に/sbin/ifconfigするだけでアドレスが見える。Windowsは、ipconfigするだけでアドレスが見える。アドレスなんて自分で指定してないし外部と通信できないのにどうやって決まってるんだろ?と思ったけど、どうやらlink-localなアドレスはMACアドレスから勝手にきまるっぽい。で、ping。コマンドとしてはLinux、Windowsともにping6を使う。まずWindowsから。link-localなアドレスだと、インターフェースを特定する必要があるので、
ping6 fe80::1234:56ff:fe78:90ab%4
ってな感じで、最後に%とインターフェース番号を入れないといけない(ipconfigしたときのアドレス表示の最後に出てる数字を使う)。Linux側からもほぼ同様だけど、指定の仕方が違って、
ping6 -I eth0 fe80::1234:56ff:fe78:90ac
となる。最初、"-I eth0"の部分なしで試してたら、
connect: Invalid argument
と表示された。的をはずしたエラーだなぁ。でも、なんとか両方からお互いにping6が通ることは確認できた。
続いて、ブラウザからアクセスできるか試してみる。IE6でリテラルIPv6形式で入力するが、IEが嫌がって接続できず。Windows XP IPv6 プロトコルに関する FAQによると、XPのIEではアドレスバーへの入力は対応してないらしい。ということは、WinInetのInternetCrackURL()APIも対応してない可能性高し。作成中のソフトはこのAPIを使ってるので、ホスト名からIPv6アドレスを取れるように環境整備しないと動作確認は無理だな。念のため、FirefoxからリテラルIPv6で入力してみたところ、Apacheのエラー表示が見えた。httpsはそれ以前のところでつまずいててApacheの表示すら出なかったけど、sslサポートを追加したときのように、VirtualHostのところにリテラルIPv6形式で追加したらhttpと同じくBad Requestが返るようになった。Bad Requestが出る理由は、多分リテラルIPv6形式のホスト名の中に"%"が含まれることが原因。Linuxマシンから直接http://[::1]/でアクセスすると正常にアクセスできるし。ということは、link-localなWindowsマシンからLinuxのApacheにはリテラルIPv6でアクセスできないということか..やっぱり自分でIPv6用にDNSを起こして名前解決を可能にするしかないか。今日のところはここまで。いろいろ整備するのも必要だけど、その前にIPv6の知識が不足しすぎ。そもそもローカルでDNSを起こせるのかもまだわかってないし。先は長い。
今の自分の部屋(寮)の広さがわかってないので、測ってみた。奥行き5.7m、幅2.2m。部屋は完全に長方形なので、占有面積にして12.54m2か。寮じゃなかったらトイレや風呂も必要なので、同じレベルの広さを維持するとしても20m2は欲しいな。でも、正直今は狭すぎるので、25m2ぐらいは欲しい..
昨日のMakefileが完成。Borlandのmakeの仕様で動くように(複数回の展開をしなくてもいいように)いろいろ定義しまくって回避。GNU makeだったらこれの半分以下の量で済みそうなサイズになってしまった。複数回展開できなくて一番困ったのが、コマンド行で複数回の文字列置換ができないこと。ファイル名をいじくりたいのにうまく置換できない。コマンド行だと新たにマクロ定義するわけにも行かないので、試行錯誤の末、デフォルトのマクロの修飾"F"を使用して何とか解決。今の俺の力では、これが精一杯。関係箇所だけ抜き出したので、見にくいけどこんな感じ。
CC = bcc32 CFLAGS_REL = -O2 -v -wall INTERMED_REL = obj SRC_DIR = src SRCS = \ @SRC_DIR@\hoge1.cpp \ @SRC_DIR@\hoge2.cpp OBJS = $(SRCS:.cpp=.obj) OBJS_REL = $(OBJS:@SRC_DIR@=$(INTERMED_REL)) $(OBJS_REL): $(CC) $(CFLAGS_REL) -c -o$@ $(SRC_DIR)\$(<F:.obj=.cpp)
最後の行では、ソースファイルを得るために、ターゲットから"F"でファイル名だけを取り出して、拡張子を変換(":.obj=.cpp")した後にソースディレクトリと結合してる。あと、$(OBJS_REL)の依存関係を書いてないので、ソースを書き換えてもコンパイルしなおしてくれないという問題あり。そもそも、依存関係の左側に複数のファイルを持ってくるのはよくないと思うが。数日前からこの作業はやってたんだけど、普段自分でMakefileを書くことはほとんど無かったので、いろいろ勉強にはなった。ネットに転がってる情報はGNU makeの情報ばっかりなので、やっぱりGNU makeがいいなぁ、と思った。
会社ではメーラーにEdMaxのフリー版を使ってるんだけど、振り分けに使える正規表現の機能に問題が見つかった。どうやら".*"(任意文字の繰り返し)の表現が使えないようだ。なんてこった。これが使えなくて正規表現といっていいのか?かゆいところに手が届かない感じ。現段階では使えなくても何とかなったけど、もっと複雑な振り分けが必要になってきたら、メーラー乗換えも考えないといけないかも。
かゆいところに手が届かないシリーズその2。Borlandのmake用のMakefileを書いてるんだけど、GNU makeと比べると機能があまりに貧弱すぎ。複数回のマクロ展開ができないなんて、ありえないだろ。
2年前に買ったマウス、MX700のクレードルの充電端子の接触が悪くなってきたので、買い替え。MX700は5年のメーカー保証がついてるので、直してもらえるはずなんだけど、2ch情報によると、最近はMX700を修理に出すと換わりにMX1000が送り返されてくることがあるらしい..。というのと、そもそもまともな予備マウスも無かったので購入。MX1000は1年以上前に発売されたものなので、いまさら感想書いたところで意味が無いかもしれないけど、ちょっと書いとく。大きさは、MX700よりも若干でかい。滑りやすさは700のほうが上で、MX1000のほうは滑りにくくて耐えられなかったのでエアパッドソール(AS-36)に付け替えたところ、やけに滑りすぎる。でも滑らないよりはマシ。ボタン配置はMX700のほうがいいけどMX1000も許容範囲。バッテリーの残量表示があるのはいい。MX700は残量がわかんないので使わないときは常にクレードルに乗せてたけど、MX1000だと少なくなってきたら乗せればよくて充電の頻度が減るので、クレードルの充電端子の接触不良も起きにくそうだ。総合的には、現状だとMX700のほうがよかったけど、使い慣れてくればMX1000でも悪くないかも、という印象。とりあえずMX700は修理に出すか..。
この前の成果を確認。あいかわらず平均1日1回ぐらい攻撃を受けてるけど、いずれも規制が開始される5回目であきらめてる。効果覿面。さすがに20分のブロックは利いてるようだ。ログのファイルサイズも減ってめでたしめでたし。
現状を見る限り、ICMPステルス機能は有効にしてもアタック防止効果はなさそうだ。攻撃前にPINGで確認するわけではないのか。
会社で偉くなる人は、仕事を効率よく片付けられる人だと思ってたけど、そうじゃなくて、手を抜けるところを的確に判断できる人だってことが分かった(その結果として効率よく仕事が片付くんだけど)。確かに上に行けば行くほど仕事は増える一方だから、そんなもんだよな。
朝一から13:30ぐらいまでシステムが動かなかったらしい。ニュースは仕事中に知ったんだけど、今日は株の購入注文をしてたので気になってた(帰るまで見ないようにしてるので)。帰ってから確認をしてみたら、午前中に約定してる。東証じゃなくてジャスダックだった。あんまりどこか気にしないので東証かと思ったよ。