読者です 読者をやめる 読者になる 読者になる

だるろぐ

とてもだるだるした日記です http://about.daruyanagi.jp/

お知らせ

WebMatrix でプログラミング生放送してみた #pronama

SignalR WebMatrix 勉強会

プログラミング生放送勉強会 第22回@松山 - だるろぐ でやった LT の補足です。

何をしていたか

f:id:daruyanagi:20130407140632j:plain

もう少し絵がうまかったらよかったのだけど。

  • WebMatrix 拡張機能で WebMatrix のエディター画面の情報を取得
  • WebMatrix 拡張機能(SignalR .NET Client)で Windows Azure 上の SignalR サーバー(Hub)へテキストを送信
  • SignalR Hub が Web ページ(SignalR JavaScript Client を仕込んである)へ接続中のブラウザーへ向けてテキストを一斉送信

これで「手元の WebMatrix で書いたコードを一斉配信する」システムができた。なお、Windows Azure 上の SignalR Hub も WebMatrix で記述しているので、「ピュア WebMatrix 製」ってことやね!

  • WebMatrix の拡張機能って自分でも作れるんだよ
  • SignalR は WebMatrix でも使えます!
  • .NET でも JavaScript でも OK!

ってことが伝わればうれしかったのだけど、なかなかそこまでうまくいかなかった。

WebMatrix で SignalR を使う

この辺りを参考にしてください。

サーバーのソースコードは、CodeCast (Server) - Home に置いてあります。

WebMatrix 拡張機能を作成する

だいぶ前に書きました。

ただ、ちょっと古くなっているかもしれない。

Visual Studio 2012 Professional

f:id:daruyanagi:20130407142451p:plain

Visual Studio 2012 Professional向けに、開発テンプレートが Visual Studio 拡張機能として用意されているようです。

f:id:daruyanagi:20130407143053p:plain

あとはビルドイベントで WebMatrix を起動するように設定すれば OK。

Visual Studio 2012 Express for Desktop

また、多少手間はかかりますが、無償の Express エディションでも開発は可能です。

上記のサイトから WebMatrix Extension Kit(ZIP形式)をダウンロードして、(ドキュメント)\Visual Studio 2012\Templates\ProjectTemplates\Visual C# へコピーします。

f:id:daruyanagi:20121012222849p:plain

すると、[テンプレート]‐[Visual C#]に「WebMatrix Extension」というテンプレートが現れるので新規プロジェクトを作成。

さらに、Express エディションではビルドイベントの機能が使えないようなので、デバッグ実行するためのコンソールアプリケーションを作成。

f:id:daruyanagi:20130407142440p:plain

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Process webMatrix = new Process();

            webMatrix.StartInfo.FileName = @"C:\Program Files (x86)\Microsoft WebMatrix\WebMatrix.exe";
            webMatrix.Start();
            webMatrix.WaitForExit();
        }
    }
}

あとは拡張機能のソリューションをリビルド → コンソールアプリを実行 という感じで開発を進めていけるはず。

WebMatrix 拡張機能のソースコード

さすがに恥ずかしくて公開できないレベル……調査不足で、リボンボタンを押したときしかコードを送出できない。

private void HandleBloadcastButtonInvoke(object obj)
{
    if (!ConnectionAvailable) return;

    try
    {
        var workspace = _webMatrixHost.Workspace as IEditorWorkspace;
        if (workspace == null) return;

        var selection = workspace
            .CurrentEditor
            .ServiceProvider
            .GetService(typeof(IEditorSelection)) as IEditorSelection;

        Send(selection.Text);
    }
    catch (Exception exception)
    {
        Send(string.Format("{0}: {1}", exception, exception.Message));
    }
}

public void Send(string message)
{
    proxy.Invoke("Send", message).ContinueWith(_ =>
    {
        if (_.IsFaulted)
        {
            _webMatrixHost.ShowNotification(message);
        }
        else
        {
            // _webMatrixHost.ShowNotification(message);
        }
    });
}

テキストの入力が取れなくても、たとえば、

  • ファイルを保存したとき(File Watcher を利用)
  • ショートカットキー

なんかはとれるはずなので、もう少し何とかしてから公開したいですね。あと、簡単な認証機能。