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

執筆日時:

Web matrix でプログラミング生放送してみた from Hidetoshi Yanagi

プログラミング生放送勉強会 第22回@松山に参加してきました #pronama - だるろぐ でやった 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 を使う

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

サーバーのソースコードは、CodePlex Archive に置いてあります。

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 を利用)
  • ショートカットキー

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