2007/02/03(土)PARでPerlをWindows実行ファイルに(with ithreads)

ActivePerl 5.10の場合はこちら。以下はActivePerl5.8.x用です。

PARとは

PARとは、Perlのパッケージツールの1種なのですが、これを利用することでWindows上で(Perlがなくても)実行出来るEXEファイルを生成することができます。ActivePerlなら通常

> ppm install PAR
> pp -o test.exe test.pl

で済むのですが、この標準の PPM パッケージが古く、ithreads が利用出来ないなどの欠点があります。これは perl 5.8.0 ベースで作られているせいであり、同じ理由で「use 5.8.1;」なども書くことができなくなります。

PARによるPerlスクリプトのEXE化を参考に、Mingwを入れて最新版をインストールしたのですが、どうしても次のエラーが出て実行できませんでした。

Can't locate Win32.pm in @INC (@INC contains: .) at xxx.pl line 817.

この問題をうまく解決出来たので報告します。

PARのインストール

そのときの最新版で問題ないと思いますが、不安な場合はまったく同じバージョンを用意してください。まず、ActivePerlをインストールします。その後、それぞれのファイルを解凍します。

まず、ExtUtils::FakeConfigが必要なので、ppmで構いませんからインストールしてください。

> ppm install ExtUtils-FakeConfig

次に PAR-Packer にパッチを充てます。必ず make 前に行ってください*1

PAR-Packer-0.973\script\par.plの690行目付近
    require PAR::Dist;
    require PAR::Filter::PodStrip;
    require Win32 if $^O eq 'MSWin32';		# この行を追加
    eval { require Scalar::Util };

あとは普通に make してインストールしてください。make 時に不足するライブラリやツールは自動で取ってくれると思います(ただし再度同じコマンドを実行する必要が出たりします)。

> cd PAR-0.973
> perl Makefile.PL
> nmake
> nmake install
> cd ..
> cd PAR-Packer-0.973
> perl -MConfig_m Makefile.PL
> nmake
> nmake install

これで、ithreads が問題なく動く pp が生成できると思います。

*1 : make済の場合は修正後にmake cleanを

2007/01/25(木)HTTP asf (wmv/wma)ストリームのpush配信プロトコル

Windows Media Player 9(WMV9) などによるHTTPストリームデータの仕様は以下のサイトに書かれていますが、push配信については記述がありません。その点について解析を行いました。

http://sdp.ppona.com/

匿名push配信時のプロトコル解析

クライアントからサーバへのリクエスト。

POST /test HTTP/1.1
Content-Type: application/x-wms-pushsetup
X-Accept-Authentication: NTLM, Digest
User-Agent: WMEncoder/9.0.0.3287
Host: 192.168.0.1:8080
Content-Length: 0
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: push-id=0

サーバからクライアントへの応答。

HTTP/1.1 204 No Content
Server: Servet-agent
Content-Length: 0
Date: Tue, 09 Jan 2007 10:02:58 GMT
Pragma: no-cache, timeout=60000
Cache-Control: no-cache
Set-Cookie: push-id=35201712
Supported: com.microsoft.wm.srvppair, com.microsoft.wm.sswitch, com.microsoft.wm.predstrm, 
com.microsoft.wm.fastcache, com.microsoft.wm.startupprofile

注意点

  • (サーバ側では)Connection が keep alive される
  • クライアントが接続テストだけを行ってきた場合は、この時点で終了する。

配信時の接続ではさらに次のように続きます。

POST /test HTTP/1.1
Content-Type: application/x-wms-pushstart
X-Accept-Authentication: NTLM, Digest
User-Agent: WMEncoder/9.0.0.3287
Host: 192.168.0.1:8000
Content-Length: 2147483647
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: push-id=35201712

$H~以下ストリームデータ~

ストリームデータの取り扱い注意

push配信によって渡されるストリームデータは、HTTP Protocol (Pesudo-Stream) のうち「Type Header」のあとに含まれる、「MSS Pre-header」(8byte)がありません。よってこのヘッダに含まれるシーケンス番号やフラグなどを中継サーバ側で生成し追加してやる必要があります(この際、Type Headerにあるパケットサイズも書き換える必要があります)。

  • MSS Pre-header の先頭2byteは、$Hや$Eの場合 "00 0C"、$Dの場合 "00 00" で問題ありません。
  • MSS Pre-header の Length は $D などのパケットヘッダの Length と同じ値を設定します。

Digest認証時のプロトコル解析

Digest認証を求める場合、サーバ側は次のような応答を返します。

HTTP/1.1 401 Unauthorized
Server: Servet-agent
WWW-Authenticate: Digest qop="auth",algorithm=MD5-sess,nonce="XX~XX",charset=utf-8,realm="Digest"
Date: Tue, 09 Jan 2007 10:34:57 GMT
Pragma: no-cache, timeout=60000
Set-Cookie: push-id=98422531
Supported: com.microsoft.wm.srvppair, com.microsoft.wm.sswitch, com.microsoft.wm.predstrm, 
com.microsoft.wm.fastcache, com.microsoft.wm.startupprofile
Content-Length: 0