2014年11月 : してログ

12

表題どおりなのですが、時計の進み方が遅いときがあります。 コントロールパネル>日付と時刻で進み方を眺めていると、遅いときは2~4秒ごとに1秒進むようです。 これは常にそういう状態なわけではなく、ちゃんと1秒ずつ進んでいるときもあります。 そのためか、時計がすぐに遅れてしまいます。 検索で調べてみると、ゲスト OS が CentOS のときの事例はありました。

ゲスト OS が CentOS の場合は、カーネルオプションで直せるとのことです。 逆に、異常に進みが早くなる場合もあるようで、この場合は VMware-Server の config.ini に CPU のクロック周波数などを書くと直るようです。 残念ながら、ゲスト OS が Windows で時計が遅くなる現象は見つけられませんでした。 私も、他のサーバーでこのような現象を経験したことが無いので、非常にレアなケースなのかも知れません。

現象を確認している環境

何か情報がありましたらコメント下さい。

CPU
AMD Athlon 64 X2 Dual Core Processor 4200+ 2.2GHz
OS
Windows Server 2003 sp2
VMware
VMware-Server 1.0.10
ゲスト OS
WindowsXP Professional sp3

訳あって AVI コンテナの内部構造について勉強していたところ、大きいデータにスケールアップできなくて利用を断念したというお話し。 Time Lapse で大量に撮った JPG の格納に、ZIP では無く動画ファイルを活用しようと考えました。 ZIP では、そのまま動画編集ソフトで扱えないし、動画ファイルにしてしまうと、EXIF などの情報が失われたり、再エンコードで劣化してしまうからです。 しかし、単純に jpeg をフレーム毎に記録しているだけの mjpeg ならば、目的を達成できるのでは無いかと言うわけです。 試しに、ffmpg で -qscale 0(-sameq の代わり)を付けて mjpeg に出力してみたところ、容量が大幅に減ってしまうことから、EXIF や品質を維持していないように見えます。 このような状況から、自前で動画フレームを結合し、AVI コンテナに収めるようなツールを作ることにしました。

AVI ファイルの構造

AVI ファイルは、RIFF という形式で表され、チャンクとリストにより構成されています。 それらを組み合わせて、AVI ヘッダーやストリームを格納する仕組みです。 詳しい仕様は、AVI ファイル フォーマット を参照してください。 これによると、Motion JPEG を格納するには、AVIメインヘッダー、ストリームヘッダー、ストリームフォーマット、ストリームデータ、インデックスエントリの 5 つのチャンクを出力すれば良いことになります。 この時ストリームデータは、JPEGファイルをそのまま格納できるので、EXIF や品質を落とさないで保存することができます。

これらの情報から、連番 JPEG 画像を AVI コンテナに収めるツールを作成しました。 基本的には、下記のサイトや仕様通りに作成すれば良いのですが、いくつかポイントがありましたので列挙しておきます。

補足情報
AVIヘッダーの dwFlags ビット配置は?
ドキュメントでは曖昧な記述でどのようなビットをセットするのか分かりません。これは、Aviriff.h に定数定義があります。定数の中身については、Microsoft ライブラリのソースコードを見ないと分からない場合があるので、異なる言語で実装する場合でも、ソースコードを取得して読んでみることをお勧めします。
ストリームデータの記述方法
JPEG ファイルを羅列するものと思いましたが、各 JPEG ファイルを 00dc チャンクで包むようです。ひとつの 00dc チャンク内に JPEG を羅列した場合、エクスプローラのプロパティで AVI ヘッダを認識せず、サムネイルも表示されません。ただし、VCL media player や TMPGEnc などで再生または認識できました。恐らく AVI2.0 のオーバーヘッド節約モードとかが関係していると思われます。
JUNK チャンクを挿入して 2048 バイト境界に配置する?
そのような説明がされているサイトがありましたが、特に配慮する必要は無いように思います。
AVI は 2GB 以下の容量しか対応しない?
AVI には、Video for Windows(AVI1.0) の時代のものと、OpenDML AVI File Format Extensions(AVI2.0) の拡張仕様の2種類があり、AVI1.0 は 2GB まで、AVI2.0 は無制限(ファイルシステムの限界より大きい)のようです。なお、AVI1.0 ではチャンクサイズやオフセット値などが DWORD 型になっているので、4GB までは行けそうな気もします。
dwMicroSecPerFrame には何を入れたらいい?
フレームあたりのマイクロ秒を入れます。下記の計算式に当てはめれば良いです。60fps の場合は、16666 になります。
1 / fps * 1000 * 1000
dwMaxBytesPerSec には何を入れたらいい?
秒あたりの最大バイト数を入れます。ドット数とビット深度、及びフレームレートから、「width * height * 3 * fps」の計算式でしょうか? しかし、これだとかなり大きくなるし、ffmpg で作った似たような AVI では 2500 という比較的小さな値が入っていました。
dwSuggestedBufferSize には何を入れたらいい?
推奨バッファサイズを入れます。dwMaxBytesPerSec の数十倍程度を入れておくべき? よく分かりませんが、ffmpg で作ったものには 0x100000 が入っていました。
AVI 出力ツールの構造

基本的にはチャンクとリストを単位に順番に出力していく構造になります。 各チャンクまたはリストの出力は、下記のような手順が単純で効率が良いです。

  1. FOURCC を出力する
  2. ファイルポインタを記憶する
  3. チャンクサイズを 0 で出力する
  4. データを出力する
  5. (2)の位置との差からチャンクサイズを計算し、正しいサイズに(3)を書き換える
容量限界が 2GB なわけ

AVI(1.0)が 2GB までなのは、チャンクサイズを 4 バイトで表すためでした。 4 バイトで表すことのできるサイズは、符号ありで 2GB、符号なしで 4GB になると思います。 また、実装上 fseek など使う場合は、引数の long int 型が 2GB の制限を生んでしまいます。 従って、AVI を扱うソフトウェアはフォーマットの上でも、実装の上でも 2GB に制限されていると思われます。

OpenDML AVI File Format Extensions(AVI2.0)

仕様をざっくり読むと、1GB 以下では単一の RIFF AVI チャンクを持つ AVI ファイルと同じようです。 1GB 以上では RIFF AVI チャンクと、複数の RIFF AVIX チャンクで構成されるようです。 基本的には、1GB 以下になるように、複数の RIFF に分けて出力すれば良さそうです。 なぜ、1GB 以下なのかはナゾですが、実装としては 1GB 以下で RIFF ファイルを分割して出力し、最後に1本のファイルに結合するのが楽そうです。

VMware-Server 1.0.10 は現在 EOL になっていますが、使い勝手の良さでは VMware 製品の中で間違いなくトップだと思います。 ESXi を導入した今では不要なのですが、その手軽さでまだまだ使いたい場面はあると考えています。 最大のネックは、新しい OS が入らないことなのですが、今回は CentOS で最新版から試して行きました。 動かなかったものは、ググった範囲(といってもほとんど情報がありません)で色々と試しても無理でした。

CentOS 7 ... 失敗
インストールを開始すると「Press the <ENTER> key to begin the installation process.」が表示された後、フリーズ状態になります。ENTER キーを押してもインストール開始できません。
CentOS 6.x ... 失敗
インストールを開始すると「Probing EDD (edd=off to disable)... ok」が表示された後、フリーズ状態になります。
CentOS 5.11 ... 成功
SCSI ディスクだとインストーラが認識しないので、VM を作成するとき Custom を選択して、IDE ディスクを作成しました。また、VMware-Tools はうまく動かないようです。

公開 NTP サーバーを使って、ESXi サーバーとゲストOSの時刻を同期するには、vSphere Client の ESXi サーバー>構成>時間の構成、から行います。 ゲストOS の同期については、VMware Tools のオプションから行えますが、個別に NTP サーバーを介した同期を行うことを推奨しているようです。

  1. ESXi サーバー>構成>時間の構成 を開きます
  2. NTP 構成の「オプション」をクリックします
  3. 全般の起動ポリシーで「ホストに連動して開始および停止」を選択します
  4. NTP 設定の「追加」をクリックして、NTP サーバーのアドレスを追加します
  5. 「変更を適用するにはNTPサービスを再開」にチェックを入れ OK をクリックします
  6. 「日付と時間」を手動で設定(正確な時間は設定後にしばらくすると NTP サーバーと同期します)して OK をクリックします

Windows 8.1 のライセンス認証をしようとしたところ、電話でのライセンス認証になりました。 VMware ESXi 用に購入した PC にプリインストールされていた、Windows 8.1 を仮想マシン上にインストールしようとしていますので、ハードウェアが全部変わったという扱いになったのだと思います。

  1. ライセンス認証の実行

    「このプロダクトキーは他のPCで使われています」という表示が出て、新しいプロダクトキーの入力、プロダクトキーの購入、サポートに電話(Windows を再インストールしたり、ハードウェアを最近変更した場合は、サポートにお問い合わせください)の選択肢が表示されました。「サポートに電話」を選択します。

  2. 国または地域の選択

    地域の選択が表示されるので、「日本」を選びます。

  3. 電話

    フリーダイヤルと有料電話番号が表示されるので、フリーダイヤルのほうに電話します。

  4. インストールIDの入力

    自動ガイダンスに従って、製品種別(Windows)を選択すると、インストールID の入力を求められますので、画面に表示されている 9 組の数字を入力します。ここで通った場合は、確認ID を自動ガイダンスが案内してくれますので、次の画面で入力します。今回は、ハードウェアの大幅な変更と判断されたためか、オペレータとの対話になりました。

  5. オペレータとの対話

    しばらく待たされた後、オペレータに繋がりました。聞かれたことは、インストールID、製品の種類、他のPCで使っていないか、何回目のライセンス認証か、今回の1台での利用になるか、くらいだったと思います。それぞれ、Windows 8.1、プリインストールされていたものを消して ESXi 上の仮想マシンにインストールしたこと、同じPCでの使用であること、2回目のライセンス認証であること、今回の1台での利用であること、を回答しました。

  6. 確認ID の入力

    オペレータから確認ID が発行されたと告げられ、口頭で聞きながら入力をしました。最後に、「ライセンス認証」ボタンを押して Windows ライセンス認証が完了しました。

この Windows 8.1 は、最初から ESXi 上の仮想マシンで利用するつもりだったので、プリインストール時に認証しなければ良かったのだと思います。 プリインストールの OS を、ゲスト OS として同一マシンの仮想マシン上で実行するのは、ライセンス違反とはならないようです。

XOOPS 2.0.16a JP を PHP5.3 で動かそうとしたところ、"Unknown Condition [8192]: ... " という警告がページフッターに大量に表示されるようになりました。 PHP5.3 で変更になった言語仕様によるもので、XOOPS をバージョンアップするか、PHP のアップデートを諦めるかのどちらかで対応したほうが良さそうです。 なお、警告を無視(デバッグモードをオフ)しても、特に問題無いように見えます。

何らかの理由で、管理画面でデバッグモードを変更できない場合、include/common.php をハックして警告が出ないようにできます。 その場合、下記の箇所をコメントアウトしてください。 また、php.ini で display_errors = Off となっている必要があります。

103:        error_reporting(E_ALL);

7z で解凍しようとして、ファイルが消えてしまうことがありました。 アーカイブ内のファイル名に不正な文字が入っているのが原因でした。 調べてみると、統合アーカイバ・プロジェクトに、「解凍時にファイル名の不正な文字を変換」というのがあり、試してみると無事解凍できました。 不正な文字の部分は、"_”に置き換わるようです。 海外で作成されたアーカイブは、日本の Windows で不正な文字が入っていることがあるので、覚えておくと良いです。

Windows で動く syslog デーモン(サービス)として、Kiwi Syslog Server という製品があります。 最新版の 9.4.1 と Windows Server 2003 の組み合わせで、インストーラが「Unpacking data」の画面が消えた後、勝手に終了してしまう現象に遭遇しました。 まったく原因が掴めませんでしたが、なんとなく .NET 関係かなと思って、.NET Framework 2.0 を入れてみたところ、先に進めるようになりました。 ただ、インストール途中で、.NET Framework 3.5 が無いという警告(その場でダウンロード&インストール可能)になりましたので、実際必要だったのは 3.5 だったのかも知れません。 また、このときのインストールは結局、フリーズして失敗してしまいましたが、再起動後に再施行したところ正常終了に至りました。 これから、試そうという人は .NET Framework 3.5 をまず入れてみてください。

ライブカメラで使っている BSW20KM11 と同じ外見で高画質の BSW50KM02 が発売されていたのですが、商品仕様の欄に視野角の表記が無いためメーカーである BAFFALO に問い合わせてみました。 ところが返ってきたメールを見て唖然としました。 お答えできないと言うのです。

> 誠に恐れ入りますが、弊社サプライ製品につきましては、
> 個人のお客様向け製品となりますため、
> 製品ページや製品マニュアルに記載を致しております以上の
> 情報につきましては、公開を行っておらず、
> ご質問をいただきました「BSW50KM02」シリーズの画角につきましても、
> ご案内を致しかねる次第でございます。
:
中略
:
>  ※「BSW50KM02」シリーズと「BSW20KM11」シリーズについては
>     外観は同デザインの製品となりますが、
>    製品仕様は異なりますため、製品ページをご参照いただき、
>    ご希望に沿う製品をご検討いただけましたら幸いでございます。

え? どういうこと? これじゃあ、ダメ元で買って調べろってことですか? 私の用途では視野角が重要なのですよ。 仕様に載っていないから、メーカーに問い合わせているのに、仕様に載っていないことは答えられない。 こんないい加減な対応をするメーカーだったのか。 まあ、愚痴ってもしょうがないですね。 こういう対応するんだったら、次からは BAFFALO 製品は検討しないでしょうね。


追記

Amazonのコミュニティで訊いてみたところ、60度程度の標準的な画角で、広角では無いようです。

リモートデスクトップを使って複数のサーバー管理する際は、通常の個別のウィンドウでは不便です。 同じウィンドウで切替えられるようなツールを探したところ、いくつか見つけることができました。

今回は、Microsoft 謹製の Remote Desktop Connection Manager を利用してみました。 非常にシンプルな作りとなっており、左に接続先ツリー、右に接続先スクリーンとなっております。 接続先ツリーは、グループを作って階層化できますが、接続先とグループは同じ階層に混在できないようですので、グループ化したい場合は、予めグループを作っておく必要があります。 なお、グループの接続設定は継承できるため、まとめて管理することが可能です。

フルスクリーンとウィンドウの表示を切り替える
接続先スクリーンにフォーカスを移し、Ctrl + Alt + Break で切り替えることができます。
エクスペリエンスの設定
メニューバー>Tools>Options にあります。初期設定では、デスクトップ背景やドラッグ時にウィンドウ内容表示がされる設定になっているので、オフにした方が良いと思います。
12