WebMatrix でプログラミング生放送してみた #pronama
執筆日時:
プログラミング生放送勉強会 第22回@松山に参加してきました #pronama - だるろぐ でやった LT の補足です。
何をしていたか
もう少し絵がうまかったらよかったのだけど。
- 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 を使う
この辺りを参考にしてください。
- WebMatrix 2: SignalR を動かす ( 1.0.1 対応版) - だるろぐ
- WebMatrix 2: SignalR を動かす ( 1.0.1 対応版) ※同時接続者数の追加 - だるろぐ
サーバーのソースコードは、CodePlex Archive に置いてあります。
WebMatrix 拡張機能を作成する
だいぶ前に書きました。
ただ、ちょっと古くなっているかもしれない。
Visual Studio 2012 Professional
Visual Studio 2012 Professional向けに、開発テンプレートが Visual Studio 拡張機能として用意されているようです。
あとはビルドイベントで WebMatrix を起動するように設定すれば OK。
Visual Studio 2012 Express for Desktop
また、多少手間はかかりますが、無償の Express エディションでも開発は可能です。
上記のサイトから WebMatrix Extension Kit(ZIP形式)をダウンロードして、(ドキュメント)\Visual Studio 2012\Templates\ProjectTemplates\Visual C# へコピーします。
すると、[テンプレート]‐[Visual C#]に「WebMatrix Extension」というテンプレートが現れるので新規プロジェクトを作成。
さらに、Express エディションではビルドイベントの機能が使えないようなので、デバッグ実行するためのコンソールアプリケーションを作成。
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 を利用)
- ショートカットキー
なんかはとれるはずなので、もう少し何とかしてから公開したいですね。あと、簡単な認証機能。