忙しい人のための「SQL Data Services」ざっくり概要

Windows Azureが発表されましたが、この中で提供される「SQL Data Services」について日本語でまとめてみました。
原文は、技術ホワイトペーパー*1とか、アーキテクチャホワイトペーパー*2になりますので、怪しいところがあったら原文を参考にしてください。そしてツッコミを入れてもらえればけっこう嬉しいです。
これを読めば、何となく分かったような気分になれます。多分。

「UStream監視人」のバージョン1.1.1のリリース

UStream監視人」のバージョン1.1にバグが見つかりましたので、バグフィックスとしてバージョン1.1.1をリリースします。
 

何が新しくなった?

前回のリリースで、起動直後に監視対象のURLがロードされていないため、実質何にも監視されていないという不具合がありました。
申し訳ない。。。
 
と言うことで、バージョン1.1.1をリリースします。
http://sirayuki.sakura.ne.jp/UStream/UStreamSuperviser1.1.1.0.zip
 
例のごとく、zipファイルを解凍して、今までの物に上書きしてください。
今回から右クリックしたときのメニューに「UStream監視人について」というメニューが追加されていますので、ここからバージョンを見ることができるようになっています。

ソース管理について

今回から、ソース管理をBeanstalkというサイトが提供するSubversionリポジトリで公開することにしました。
URLはここです。
http://seigihouse.svn.beanstalkapp.com/ustreamsuperviser/
ここに「Anonymous」ユーザでアクセスすると、最新のソースがダウンロードできます。
ちなみに、Anonymousさんは見るだけなので、commit権限が欲しいというステキな方は別途連絡してください。

UStream監視人 バージョン1.1 リリース

UStream流しながら書いてますんで、手短に。
UStream監視人」のバージョン1.1をリリースします。
 

これは何をするツール?

このツールは、Windowsのタスクトレイに隠れて、指定されたUStreamの番組が始まっていないかを監視します。
番組が開始されたらバルーンが表示されますので、これをクリックすると番組のURLが開かれます。
 

何が新しくなった?

今回のバージョンから、開始されたUStreamの履歴を保持しておくように機能が追加されています。
タスクトレイのアイコンから右クリックで「開始履歴を開く」というのがこの機能です。
 

どうやって動かすんだ!?

動かす前に

まず、利用するWindowsマシンに.NET Framework2.0がインストールされている必要があります。
インストールされていない場合、MicrosoftUpdate経由でインストールが可能です。

どうやって動かすの?

まずは、こちらから本体をダウンロードしてください。
http://sirayuki.sakura.ne.jp/UStream/UStreamSuperviser1.1.0.0.zip
ダウンロードしたらどこかに解凍して、中に入っているexeを実行してください。
バージョン1.0を使っている方は、そのまま上書きしてください。

設定はどうする?

起動すると、タスクトレイに「.TV」というアイコンが出現します。
これを右クリックしてメニューにある「設定」をクリックします。
ここで、監視対象にするUstreamの番組を指定します。
指定するURLは、UStreamの各番組のURLです。例えば
http://www.ustream.tv/channel/kokuda-sensha-live
こんなURLを登録しておきます。
後はひたすら番組が始まるまで待ちましょう!
 

あの、動きが変なんですが

スイマセン、それはバグってますね。多分。
すいませんが、ぷにだまのハイクページで教えてあげてください。
http://h.hatena.ne.jp/id/punidama
 

ソースほっすぃーでーす

ソースが欲しい方はこちらからどうぞ。
http://sirayuki.sakura.ne.jp/UStream/UStreamSuperviser1.1.0.0_src.zip
VisualStudioのプロジェクトそのまんまです。
コメント入ってないところがあるけど、ごめんね!

「UStream監視人」リリース

久々にダイアリーに書くよ!
UStreamでお気に入りの番組が始まってないかヤキモキしたことはありませんか?
そんな悩みは今日でおしまいです。
UStreamの番組が開始されていないかを監視するツール「UStream」監視人のリリースです!
(なんかうさんくさいな・・・)
 

これは何をするツール?

このツールは、Windowsのタスクトレイに隠れて、指定されたUStreamの番組が始まっていないかを監視します。
番組が開始されたらバルーンが表示されますので、これをクリックすると番組のURLが開かれます。
いかがですか、これこそあなたが求めていたものではないですか!?
(ああ、うさんくさい・・・)
 

どうやって動かすんだ!?

動かす前に

まず、利用するWindowsマシンに.NET Framework2.0がインストールされている必要があります。
インストールされていない場合、MicrosoftUpdate経由でインストールが可能です。

どうやって動かすの?

まずは、こちらから本体をダウンロードしてください。
http://sirayuki.sakura.ne.jp/UStream/UStreamSuperviser1.0.0.0.zip
ダウンロードしたらどこかに解凍して、中に入っているexeを実行してください。

設定はどうする?

起動すると、タスクトレイに「.TV」というアイコンが出現します。
これを右クリックしてメニューにある「設定」をクリックします。
ここで、監視対象にするUstreamの番組を指定します。
指定するURLは、UStreamの各番組のURLです。例えば
http://www.ustream.tv/channel/kokuda-sensha-live
こんなURLを登録しておきます。
後はひたすら番組が始まるまで待ちましょう!
 

あの、動きが変なんですが

スイマセン、それはバグってますね。多分。
すいませんが、ぷにだまのハイクページで教えてあげてください。
http://h.hatena.ne.jp/id/punidama

WindowsMediaPlayerで再生中の楽曲情報にアクセスする(後編)

やあどうも。punidamaです。
今回はWindowsMediaPlayer(以下WMP)で再生している楽曲情報を取得するにはどうすればいいかの後編です。
前編では、何かあんまり本題と関係ないことを言ってるような感じでしたが、実は意外と効いてきます。
ということで、早速。

WindowsMediaPlayerのしくみ

WMPは2種類の使い方(動かし方?)ができます。この呼び方はオフィシャルなものではありません。今回、便宜的に名前をつけています。

エンベッドモード

一つ目のパターンは、エンベッドモード。簡単に言うと、前編で紹介した方法です。
単純に音楽とか動画を再生したいときに使うやり方です。
ちなみに、前回みたいなまどろっこしいやり方ではなく、wmp.dllを参照設定してさっくりと使いたい場合であれば、ここを見てください。
Using the Windows Media Player Control in a .NET Framework Solution

リモートモード

リモートモードとは、自分とは関係ないところでエンベッドモードでWMPを動かしておいて、必要なときにリモートでちょっかいをかけにいくというやり方です。
この使い方では、アプリケーションとして動いているWMPに対して、何を再生しているかを取りに行くという、今回のお題に沿った使い方になります。でも、C#からは簡単には使えません。

第二の関門

前編では一番最初にWMPのリファレンスを載せておきました。
Windows Media Player 11 SDK
これを読み進めていくと
Player Object Model for Scripting Languages
の中に
PlayerApplication Object
というのがあります。つまり、

PlayerApplication foo = IWMPRemoteMediaServices.Player;//雰囲気的にこんな感じ

とやると、アプリケーションとしてのWMPにアクセスできます。
「おい、ふざけるな。前編はなんだったんだ!」という人がいたら落ち着いてください。これ、C#からは使えないんです。
ちゃんとこのドキュメントを見ると

This object is used only with C++ programs that implement the IWMPRemoteMediaServices interface and embed the Player control in remote mode.

と書いてあります。これ、C++からしか使えないんです。
つまり、IWMPRemoteMediaServices.PlayerをどうにかこうにかしてC#から使えるようにしなければならないというのが第二の関門です。

C#でラッピング

で、ここから一気に他力本願になるわけですが、USのMSDNでEric Gunnersonがこんなことを書いていました。
Remotable Windows Media Player in C#
おお、やりたいことまんまだ!!!で、リンク先にあるUSのGotDotNetのサイトにC#でラッピングされたJonathan Dibbleによるコードがあったのですが、GotDotNetのサイトもろともなくなってしまいました。
そこで、私がサイト消滅前に確保しておいたソースを上げておきます。
http://sirayuki.sakura.ne.jp/WmpSample/WmpRemote.zip *1
この中にあるRemotedWindowsMediaPlayer.csがリモートで動いているアプリケーションのWMPをラッピングしているオブジェクトになります。雰囲気としては、前編で紹介したaximpが出力したソースと似てはいますが、おそらく全部手で組んだと思われるので、その苦労ときたらお察し申し上げますとしかいえません。
で、アプリケーションのWMPで何かを再生しながらこのソースをビルドして動かすと、アプリケーションのWMP側で再生されているものが一時停止できたり、スライダーを動かすとその部分を再生したりできることが確認できるかと思います。
あとは
Player Object Model for Scripting Languages
を参考にして、RemotedWindowsMediaPlayerをムニャムニャすれば、アプリケーションのWMPの情報に触ることが可能になります。

まとめ

最後はかなり他力本願でスイマセン。
Jonathan Dibbleのコードですが、手で書くのは大変です。良くぞここまでやったなあという感じです。
ということで、リモートのWMPに触りたいときはJonathanのコードを参考にしましょう!(コンナケツロンデイイノカヨ!)
 

*1:これ自体はVisualStudio2003のプロジェクトですが、2005でも動きました。しかし、ソースにも書いてあるとおりAsIsで提供されているため保証の限りではありません。また、基本的に他人のソースなので、クレームがあった場合削除します。

WindowsMediaPlayerで再生中の楽曲情報にアクセスする(前編)

 はいくメールを作ったときに、WindowsMediaPlayer(以下WMP)で再生している楽曲を取得してPostするという機能をつけましたが、こいつをどうやって実現したかのメモです。
 VisualStudioからCOMコンポーネントを参照設定してあげれば簡単に使うことはできるんですが、この方法では他のWMPが再生している情報にアクセスすることはできないです。
 今回は前編なので、そもそもWMPのコントロール自体をWindowsFormで使うときに、本当はどんなことをしてやらないといけないかを説明します。

WMPのリファレンス

 WMPのリファレンスはここにあります。
Windows Media Player 11 SDK
 はい、英語です。日本語版は見つかりませんでした。おそらく無いと思われますので、気合入れて読みましょう。

そのままじゃ使えないWindowsMediaPlayerのコントロール

 WMP自体はActiveXコントロールで提供されます。これはそもそも、IEなんかのブラウザ上で使えるようにということで、ActiveXで提供されているのでしょう。
 ただ、WMPActiveXコントロールをWindowsFormでそのまま使えるかというと、実は使うことはできないんです。ここが第一の関門です。
(MSDN)ActiveX コントロールの変換

 上のURLにあるとおり、ActiceXコントロールをSystem.Windows.Forms.AxHostでラップしてやる必要があります。
 これを手で書くと、発狂します。たぶん。その理由は後で。

AxHostでラッピングしてあげる

 幸いなことに、ActiveXコントロールをAxHostでラップしたものを自動的に生成してくるツールが.NET FrameworkSDKで提供されています。それがAximp.exeです。
(MSDN)Windows フォーム ActiveX コントロール インポータ (Aximp.exe)
VisualStudioなんかがインストールされている場合、C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\BinのあたりにAximp.exeがいるはずです。
こいつを使って、WMPのラッピングコードを自動生成するときは

aximp C:\Windows\System32\wmp.dll

こんな風にしてやればいいわけです。
/sourceというスイッチをくっつけてあげればC#のソースも作ってくれますので、実際にどんなものを作ってくれるのかがわかります。これで中身を見ると・・・

//------------------------------------------------------------------------------
// <auto-generated>
//     このコードはツールによって生成されました。
//     ランタイム バージョン:2.0.50727.1433
//
//     このファイルへの変更は、以下の状況下で不正な動作の原因になったり、
//     コードが再生成されるときに損失したりします。
// </auto-generated>
//------------------------------------------------------------------------------

[assembly: System.Windows.Forms.AxHost.TypeLibraryTimeStamp("2007/10/11 0:12:29")]

namespace AxWMPLib {
    
    
    [System.Windows.Forms.AxHost.ClsidAttribute("{6bf52a52-394a-11d3-b153-00c04f79faa6}")]
    [System.ComponentModel.DesignTimeVisibleAttribute(true)]
    public class AxWindowsMediaPlayer : System.Windows.Forms.AxHost {
        
        private WMPLib.IWMPPlayer4 ocx;
        
        private AxWindowsMediaPlayerEventMulticaster eventMulticaster;
        
        private System.Windows.Forms.AxHost.ConnectionPointCookie cookie;
        
        public AxWindowsMediaPlayer() : 
                base("6bf52a52-394a-11d3-b153-00c04f79faa6") {
        }
        
        [System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)]
        [System.Runtime.InteropServices.DispIdAttribute(1)]
        public virtual string URL {
            get {
                if ((this.ocx == null)) {
                    throw new System.Windows.Forms.AxHost.InvalidActiveXStateException("URL", System.Windows.Forms.AxHost.ActiveXInvokeKind.PropertyGet);
                }
                return this.ocx.URL;
            }
            set {
                if ((this.ocx == null)) {
                    throw new System.Windows.Forms.AxHost.InvalidActiveXStateException("URL", System.Windows.Forms.AxHost.ActiveXInvokeKind.PropertySet);
                }
                this.ocx.URL = value;
            }
        }

・・・・・以下省略・・・・・

これを手で作ろうとすると、レジストリを見てwmp.dllのGUIDを探して、目的のクラスのGUIDをゴリゴリ探して、IDispatch経由のとき用にディスパッチIDを調べて、おんなじインタフェースでコードを書いて・・・という一連のめんどくさいことをやらなくてはいけません。そもそも、COMとかActiveXとか知らないと、絶対作れません。ここら辺のめんどくさいことをどうにかしてくれるのがaximp.exeの素敵なところです。

これをどうやって使うのか?

aximpで/sourceスイッチをつけて作られたC#のソースを使ってサンプルを作ってみました。
http://sirayuki.sakura.ne.jp/WmpSample/WmpOtameshi.zip
ビルドして実行すると、WMPっぽいウィンドウが起動しますので、メディアファイルをドロップしてあげれば再生されます。


以上前編です。
次回は本題であるところの、メディアファイルをダブルクリックしたときに起動するWMPが再生している楽曲情報にどうやってアクセスするかを説明します。