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ができるようになり、戻ることができます。


ゲスト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を設定することにしました。

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

# /etc/init.d/adjtimex start

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

# /etc/init.d/ntp start

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などのパケットの内容をいろいろといじることができました。しかし、あまりに変なパケットだとドライバではじいているのか、パケットがネットワークインタフェースから出ていかないこともありました。