VARDIA RD-S601購入

このページへのアクセスが多いので、その後のレポートにリンクを張っておきます

東芝のHDD/DVDレコーダ RD-S601を購入しました。もちろんこの機種を選んだ理由はパソコンの連携ができるからです。

まずはリモートへの動画転送。最初はネットdeダビング機能を使って転送しようとしたが、DLNAに対応しているとのことでRDLNAというソフトを使って簡単に転送できました。

次にメールでの予約。Docomoのこのiアプリを使うことでこれも素直に実現。いくぶん便利にはなるのですが、チャンネル名がわからなかったり、その他オプションのデフォルト値を設定できなかったりとあまり満足のいくものではありません。いずれWebベースのツールを作ろうかな。

RDのWebサーバに アクセスすれば、予約やら録画の確認などいろいろできますが、このポートをインターネットにそのまま公開するのは恐いので、インターネット経由でのアクセス用にはapacheのproxy機能を使用してhttpsで実現。これでパスワードを平文で流さなくてすみます。プロキシ部分の設定はこんな感じ。

UseCanonicalName on
ProxyRequests Off
<Proxy *>
   Order deny,allow
   Allow from all
</Proxy>
ProxyPass / http://192.168.1.4:80/
ProxyPassReverse / http://192.168.1.4:80/

最初は以下のように階層を掘って(hogeの部分 VARDIAに転送していましたが、

ProxyPass /hoge/ http://192.168.1.4:80/
ProxyPassReverse /hoge/ http://192.168.1.4:80/

VARDIAが出力するHTMLに絶対リンクがあるため、うまく動きませんでした。よって、新しくダイナミックDNSでDNS名を取得し、名前ベースのVIrtualHostを使ってサーバ名直下で運用することでうまくいきました。ただし、ネットdeモニターのようにJAVAでサーバに直接接続しにいく機能は使えないようです。

これでインターネットからいつでもVARDIAにアクセスできるようになったのですが、VARDIAの電源がOFFの場合はWebサーバにアクセスできません。よってリモートからVARDIAの電源をWOLでONにするスクリプトを記述して自宅サーバに設置。内容は以下のようにいたって簡単なものです。

 <?php
        echo "RD WOL<BR>n";
        $a = exec("/usr/bin/wakeonlan 00:xx:xx:xx:xx:xx");
        echo $a;
        echo "<BR>n";
?>

今回はPHPで記述しました。これをApacheに設置して、携帯などからURLを叩けば電源を入れることができます。

ちなみにwakeonlanというコマンド(Debianではapt-getでインストールできた)でWOLのパケットが投げられ、電源をONにします。 00:xx:xx:… はVARDIAのMACアドレスです。

さて、これで電源ONもリモート操作できるようになったのですが、VARDIAの起動は時間がかかるし、内部処理中(□が表示窓に表示されている)の場合はなぜかONにできないため、遠隔にいると状態がわかりません。なので、以下のスクリプトを書いて設置しました。

<?php
        echo "Ping<BR>n";
        $a = exec(" ping -c 1 192.168.1.4 | grep icmp_seq");
        echo $a;
        echo "<BR>n";
        echo "TCP Port 80 Scan<BR>n";
        $a = exec("/usr/bin/nmap -sT 192.168.1.4 -p 80 | /bin/egrep open");
        echo $a;
        echo "<BR>ndone";
?>

これで、pingでネットワークを確認、nmapでポート80が空いているかが確認できます。

ひとまずはこれで設定終了です。


Ctrl-Sの端末ロックを無効にする

bashではCtrl-Sを入力してしまうと端末がロックされた状態になり何も受け付けなくなります。Ctrl-Qで解除できるが、普段ロックすることないしいらいらするから、無効にする方法を調べてみた。

方法はいたって簡単で

# stty stop undef

でOK。常に有効にしたい場合は.bashrcなどにどーぞ。

Ctrl-Rはreverse-i-searchでコマンド入力履歴をさかのぼって検索できますが、たまに行き過ぎて戻りたくなることがあります。上記の設定でCtrl-Sのロックを無効にすることでi-searchができるようになり、戻ることができます。

ちなみに、Ctrl-Cで実行中のプログラムを止めるのもこのsttyで無効にできます。どのような機能が定義されているかは”stty -a”コマンドでわかります。

$ stty -a
speed 38400 baud; rows 50; columns 127; line = 0;
intr = ^C; quit = ^; erase = ^H; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q;
stop = <undef>; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo -echoe -echok -echonl -noflsh -xcase -tostop -echoprt -echoctl -echoke

各単語の意味は以下の通り。

intr   割り込み (interrupt) シグナルを送る。
quit   終了 (quit) シグナルを送る。
erase  最後にタイプされた文字を消去する。
kill   現在の行を消去する。
eof    ファイル終了 (end of file) を知らせる (入力を終了する)。
eol    行末 (end of the line)。
eol2 (np)
       行末を表す別の文字
swtch (np)
       別のシェル層 (shell layer) にスイッチする。
start  停止している出力を再開する。
stop   出力を停止する。
susp   端末に停止 (stop) シグナルを送る。
dsusp (np)
       入力をフラッシュしてから端末に停止 (stop) シグナルを送る。
rprnt (np)
       現在の行を再表示する。
werase (np)
       最後にタイプされた単語 (word) を消去する。
lnext (np)
       次にタイプされる文字を (特殊文字であっても) そのままの文字として受け取る。

—-

2009/11/2 追記

上記設定が原因のようで、上記サーバに対して、scpコマンドでファイルをコピーすると標準入力が不正という旨のエラーが発生しました。


ゲストOSの時刻同期@VMware + adjtimeでの調整

Windows上のVMware ServerでゲストOSとしてLinux (Debian etch)を動かしていますが、このLinuxの時刻があり得ないぐらいずれてしまいます。以前はカーネルのbootオプションに

clock=pit

をつけることでなんとか時刻を保持できていたが、ハードを更改するとこのオプションをつけてもずれが激しい。どうもIntelのCeleronからAMDのAthlon X2に変更したのが原因のよう。

Athlon X2のコア同士のTSCのずれがあるらしく、AMDのDual Core Optimizerを入れるとかなり正常に近づき、NTPで同期できるようになった。

 # ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*ntp.xx.xxxxxxx. .GPS.            1 u    - 1024  377   15.990  -59.864  30.723

== 追記 2008/8/17  ==

上記方法で一応ntpで補正できる範囲にはなったが、それでも誤差が大きいらしく、ずっと以下のログが出力されてしまします。

Aug 10 09:45:09 gin ntpd[3554]: time reset -2.491515 s
Aug 10 09:45:09 gin ntpd[3554]: frequency error -512 PPM exceeds tolerance 500 PPM

上記のようなログが20分おきぐらいに出力されるので、私の環境では、20分に2~3秒ぐらいずれていて(マイナスはローカルがntpより早い)、ntpサーバへのポーリングタイムが64秒より長くなりません。なので、adjtimeを使用して調整することにしました。adjtimeはハードウェアクロックの精度が悪い時にその誤差を調整するもので、今回ぐらいの誤差ならば調整できそうです。

まずはapt-get コマンドでコマンドをインストールします。

# apt-get install adjtimex

adjtimeで補正する誤差を計算します。以下のように計測しました。

# /etc/init.d/ntp stop
# ntpdate -b ntp.nc.u-tokyo.ac.jp; sleep 180; ntpdate -b ntp.nc.u-tokyo.ac.jp
17 Aug 01:04:33 ntpdate[19824]: step time server 130.69.251.23 offset -0.176401 sec
17 Aug 01:07:33 ntpdate[19830]: step time server 130.69.251.23 offset -0.419513 sec

ここでは東大のntpサーバを使用しています。最初に時計を合わせて、180秒(3分)待って、さらに合わせます。この時のずれが-0.419513秒(offsetの値)つまり、0.41953秒早く進んでいます。3分で0.42秒、つまり20分で2.8秒のため、上記でかいた20分で2~3秒というログと辻褄があいます。もっと正確に検出したいならば、sleepの値をのばしたり、何回も測定して平均を計算するとよいと思います。

上記結果より、1日当たりの誤差を計算します。私の環境では数回の計測と計算の結果、1日で、-196.19856秒としました。

この値を /etc/default/adjtimex に設定してあげます。このファイルの設定値は秒ではなく、TICKとFREQで設定します。

1TICK=6553600FREQ  で、+1TICK=8.64 秒/日 早く進むらしいので、196.19856秒遅く時計を進ませるためには、-196.19856/8.64=-22.70 となる。TICKは10000で誤差なしということらしいので、小数点を無視して、TICK=10000-23=99977, FREQ=0を設定することにしました。

TICK=99977
FREQ=0

これでadjtimeで、上記設定を有効にします。

# /etc/init.d/adjtimex start

以上で、誤差がかなり少なくなりましたがまだ誤差があったので(そもそもsleep 180が正確でないので)、最終的には”99971″にしました。vmwareは誤差が大きいので、ntpは起動しておきましょう。

# /etc/init.d/ntp start

== 追記 2009/4/26  ==

vmwareの時刻補正機能とNTPを同時に動かしていると時刻修正機能がバッティングしてしまいます。maznはNTPを止めて、 vmwareで補正するように変更しました。ただしホストOSは時刻が正確であることが前提です。

あと、以下のコマンドで最適なtickを計算してくれるようです。

# adjtimex --compare
                                      --- current ---   -- suggested --
cmos time     system-cmos  error_ppm   tick      freq    tick      freq
1240719539      -0.625205
1240719549      -0.634765     -956.0   9990   4000000
1240719559      -0.643681     -891.6   9990   4000000    9999   3446719
1240719569      -0.651886     -820.5   9990   4000000    9998   5345630
1240719579      -0.659008     -712.3   9990   4000000    9997   4803917
1240719589      -0.668480     -947.2   9990   4000000   10000    536868
1240719599      -0.677599     -911.9   9990   4000000    9999   4782655
1240719609      -0.687442     -984.3   9990   4000000   10000   2968118

suggestedのtickとfreqを設定するのがよいとは思いますが、vmware上では安定しないようなので、これらの平均を設定するのがよさそうです。


Date型@EntityBean

EntityBeanからDate型にマッピングしたデータを取り出した場合、java.util.Dateではなく、java.sql.Date型でマッピングされます。そのため、toString()を呼び出した場合、日時の表示形式が異なります。

Date型ってmonthは0~11で指定するんだね。Javadoc見ればすぐわかるんだろうけど、はまってしまった。


sendip

ネットワークのテストをしたいとき、任意のパケットを送出したい場合があります。Windowsの場合はipsendwinや、Linuxの場合はsendipといったツールがあるようです。

ipsendwinを使用してみたところ、MACアドレスからTCPやUDP, ICMPなどのパケットの内容をいろいろといじることができました。しかし、あまりに変なパケットだとドライバではじいているのか、パケットがネットワークインタフェースから出ていかないこともありました。