FLVプレイヤーとセキュリティサンドボックス

Flashを使用してFLVファイルを再生させる場合
FLVファイルやSWFファイル(FLVプレーヤー)の
置き場所について気をつける必要がある。


で、セキュリティサンドボックスを簡単に説明すると
ある限られた領域でしかプログラムを実行できないように
制限をかける方法のことらしい。


まぁ子供をサンドボックス(砂場)で遊ばせときゃ
悪い人に連れて行かれることもない、と。
(最近はすっかり治安が悪化しているが…)


じゃあ「ある限られた領域」ってのはどこなんだ?
と思ってちょっと調べてみたら
あるサイトでこんな記述を発見。

SWF ファイルと同じディレクトリまたはサブディレクトリに格納されたローカルの FLV ファイルを再生できますが、上位のディレクトリを参照することはできません。


FLVプレーヤーと同階層、または
それ配下のディレクトリに置いてある
FLVファイルのみ再生できるよ、と。


他にもこんな記述を見つけた。

呼び出し元 SWF ファイルが ローカルファイルシステムサンドボックスにあり、ターゲットリソースがローカル以外のサンドボックスにある場合、NetStream.play() は使用できません。


これも先の記述を考えると当たり前か。


ちなみに、上記の条件を満たすように
各々のファイルを配置していたとしても
URLがDNSで変換された場合は
別のサンドボックスとして扱われるらしい。


これは、IPアドレスDNS変換したURLとか
localhostループバックアドレスとかに該当するってことか。

MTUサイズの変更


Windows上で使用するネットワークアダプタのMTUを変更する方法、
かなり昔に変更して最近また変更する必要が出てきたので、
忘れないようにメモっときます。


変更するレジストリキーは以下の通り。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\[ネットワークアダプタ名]


この場所の以下の値を変更する。

型:DWORD値
値の名前:MTU(デフォルトでは不在なので新規作成)
値の内容:設定したいMTUサイズ値。(デフォルトは1500)

Oracle7の嫌がらせ


Oracle7サーバーのリスナーに接続するときは
デフォルトポート番号1521に対して接続を行う。
しかし、それを受けたサーバー側のディスパッチャプロセスが
「○○ポートにリダイレクトしてデータを受け取ってね」と
他のポートに仕事を丸投げしやがるのだ。


このときのポートのアサインてランダムなのかな?
例えば1000〜1500みたいな感じで
範囲とかも決まってないのかな?
うーん。。。

CopyMemoryとは何者?


業務でJavaとかC#、プライベートでもPHPとかしかやってない俺が
C++やって死にそうになっています。
ちなみにCは少しだけ勉強した記憶がある程度。
で、そんなときにぶち当たる壁というのがポインタです。
一応Javaなんかでも参照変数みたいなのがあって
ある意味ポインタちっくな概念があるにはありますが
やっぱりC++みたいにポインタ使ってナンボな言語は
俺みたいなポインタ初心者はドン引きなんですね、はい。


で、今回CopyMemoryっていうWindows APIを使う必要があったので
ちょっと調べてメモっておきます。
できる人にとっては常識なんでしょうが、まぁいいじゃないですか。


まずこのCopyMemoryは何をするAPI?という疑問についてですが
指定したメモリブロック(メモリ上のデータの塊)の内容を
他のメモリアドレス位置にごっそりコピる事ができるらしいです。


ではどんな時に使うのか?ってのを考えてみると…
例えば、めちゃめちゃ沢山の配列要素を別の配列にコピりたい時
for文でぐるぐるやるよりCopyMemoryを使った方が
圧倒的に処理効率が良いようです。
だからこんな時はこのAPIを使用すべきです。
なんてったってこれ一個書くだけで
スパッとよろしくやってくれるんですから。


で、書き方は以下の通り。

VOID CopyMemory(
  PVOID Destination,   // コピー先
  CONST VOID *Source,  // コピー元メモリブロック
  SIZE_T Length        // メモリブロックのサイズ
);


パラメータはこんな感じです。

Destination
コピー先の開始アドレスへのポインタ。
例えるなら引越し先の住所ってとこかな。

・Source
コピー元のメモリブロックの開始アドレスへのポインタ。
まぁ現住所みたいなもんでしょう。

・Length
コピーしたいメモリブロックのバイト数。
引越し荷物の量でいいや(適当すぎか?)。


この時、Lengthには特に注意した方が良いみたいです。
重要なメモリ領域を書き換えてしまって
最悪OSが落ちる事もあるという、あぁ恐ろしい。


というわけで、使用例は良いのが思いついたら追記したいと思います。
まずはここまでという事で。

長い処理中の割り込み処理


環境はBorland C++ Builder 5です。


長い処理の最中
Windowsにイベントを処理させたいときに
割り込み処理をさせよう、と。


もう少し具体的に?
えーと、多階層のforループの処理中なんかは
ウィンドウのリサイズや再描画が行われないし
「やっぱりやめたい」と終了ボタンをクリックしても
「今忙しいから終わるまで待て」と無言の返事。


そんな時に以下の一文を書いておけば
「そういや終了ボタンって押されてるんだっけ?」
と、処理を中断して気を利かせてくれます
っていうのはどうだろう。

Application->ProcessMessages();


アプリが固まってない事をアピるのにも
よく使われるっぽいですね。

スレッド停止(シグナル状態)の検知


環境はBorland C++ Builder 5です。
超初心者な内容ですが、とりあえずメモっときます。
正しいかどうかは保証しないので
曖昧な表現で書いていますw


スレッドの停止を検知するには
WaitForSingleObjectという関数を使うらしい。
複数スレッドの停止を検知するには
WaitForMultipleObjectsの方を)
オブジェクトの中身はこんな感じらしい。

DWORD WaitForSingleObject(
  HANDLE hHandle,        // オブジェクトのハンドル
  DWORD dwMilliseconds   // タイムアウト時間
);


パラメータは以下のように指定するのか、なるほど。

・オブジェクトのハンドル
オブジェクトのハンドルを指定、そのままです。

・タイムアウト時間
ミリ秒(ms):タイムアウト時間が経過すると制御が戻る。
0         :江戸っ子か関西人風に即座に制御を返すようです。
           「せっかち」または「いらち」と呼ばれます。
INFINITE  :片思いの恋愛のように永遠と待ち続けるようです。
           なんだか胸が締め付けられる思いです。


戻り値は以下のどれかになるようです。
ちなみにスレッドが終了している状態=シグナル状態。

WAIT_ABANDONED:放棄されたMutexオブジェクトでした。
               (あるスレッドが所有権を解放しないで終了)
               これ見て「商品の取り置き希望の客が
               ずーっと受け取りに来ない」
               学生時代のバイト経験を
               思い出したけどそんな感じでいいのか?
WAIT_OBJECT_0 :指定したオブジェクトがシグナル状態になった!
WAIT_TIMEOUT  :タイムアウト時間が経過したけど
               まだシグナル状態じゃないよー、と。
WAIT_FAILED   :関数自体の呼び出し失敗。残念。


実際のコードは…ないです。