けさらんぱさらん

方向性は定めず、ただ思いつくままに

TFSのビルドプロセスに引数を追加する

TFSのビルドプロセステンプレートに引数を追加するメモ

ここにパラメータを追加したい!
f:id:cer1974:20130613232014p:plain


ビルドプロセステンプレートを開いて引数をクリックして
表示された引数一覧に1行追加します。
f:id:cer1974:20130613232023p:plain


ビルドプロセステンプレートをチェックインしてから
ビルド設定を最新の情報に更新します。
f:id:cer1974:20130613232031p:plain


すると先ほど追加したパラメータが表示されています。
f:id:cer1974:20130613232037p:plain
これだけで追加完了です!
が、カテゴリが勝手に「その他」だし
引数名そのまま出ちゃってる。
カテゴリもちゃんとしたいし日本語で表示したい!


またビルドプロセステンプレートを開いてから引数を表示します。
引数一覧に「Metadata」というパラメータがあるので
その行の右のボタン(これボタンか?)をクリックします。
f:id:cer1974:20130613232047p:plain


ダイアログが表示されるのでパラメータを追加して
項目を適当に埋めます。
f:id:cer1974:20130613232053p:plain:w400


するとこんな感じで新しいカテゴリができ
日本語で表示されるようになります。
f:id:cer1974:20130613232103p:plain

Nancy試してみた

ASP.NETのNancyというフレームワークがあるとのことでちょっと試してみました。
こちらを見ていただければ概要は分かるかなっと思うので
ちょっと嵌ったところをば

嵌ったのはASP.NET MVCと同様にPost時(まあPostじゃなくてもいいけど)のモデルバインドを自動でやる方法です。
公式にも書いてあるので嵌るなって話ですけどね
ちゃんと見てなかったんじゃよ

まずモデル作ります。

public class Employee
{
  public string Name { get; set; }
  public int Age { get; set; }
}

適当です。


で、Controllerになる部分を作る

Get["create/"] = _ =>
{
    return View["Create"];
};

Post["create/"] = _ =>
{
    var emp = this.Bind<Employee>();
    return View["Index"];
};

Postの方に注目、Bindというメソッドを使ってバインドするんですが
VisualStudioさんがそんなメソッドないよんって言います。
なぜに・・・ここでしばし悩む

あっ・・・拡張メソッドか!

using Nancy.ModelBinding;

これが必要なのでした。


そしてView

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form action="/create" method="post">
        <p>
            名前:<input type="text" id="name" name="Name" />
        </p>
        <p>
            年齢:<input type="text" id="age" name="Age" />
        </p>
        <input type="submit" value="Post" />
    </form>
</body>
</html>

ここでまた嵌る
name属性でバインドするんですが、MVCと違ってクラス名.プロパティ名じゃない!


これで
f:id:cer1974:20130514001044p:plain
こうなる
ちゃんとバインドされてますねん♪

TFSのODataServiceを使ってみる

なんかインストールや設定手順がWebで知らべても良く分からなかったのでメモしておく

TFSがローカルにインストールされている前提で
別なサーバなどにインストールされていれば読み替えてください。


ここからダウンロードしてexeファイルを実行します。
特に迷うこともなくインストールできます。


インストール先のフォルダ
f:id:cer1974:20130428213437p:plain

Codeフォルダの中身
f:id:cer1974:20130428213543p:plain

ソースコードしか無い・・・
ということは、自分でIISにホストしろと

VisualStudioでODataTFS.slnファイルを開いてWebプロジェクトのプロパティを変更して
IISで実行されるように設定します。

アクセスするとこんな画面が表示されます。
f:id:cer1974:20130428221211p:plain

これだけだとまだODataServiceにはアクセスできないので
Web.Configを変更します。

appsettings内の下記のアドレス部分を変更します。

<add key="ODataTFS.TfsServer" value="http://localhost:8080/tfs" />

それとHTTPSでなくHTTPでTFSにアクセスする場合は、セキュリティモードを「None」にします。

<security mode="None"></security>

プロジェクトの一覧が表示できました。
f:id:cer1974:20130428230623p:plain

JavaScriptのfilterとmap

JavaScriptのArrayオブジェクトにはfilterとmapというメソッドがあります。
ECMAScript5で追加されたみたいなんですけど最近知りました(汗

filterは、LINQで言うWhereメソッドです。
こんな感じです。

var array = [1,2,3,4,5,6,7,8,9,10];

array.filter( function(x){ return x % 2 == 0} )
    .forEach( function(x) { 
        document.write(x);
        document.write("<br />");
    });

結果はこうなります。
f:id:cer1974:20130407230617p:plain

mapの方は、LINQで言うSelectメソッドです。
filterにつなげてみます。

var array = [1,2,3,4,5,6,7,8,9,10];

array.filter( function(x){ return x % 2 == 0} )
    .map( function(x){ return x * x } )
    .forEach( function(x) { 
        document.write(x);
        document.write("<br />");
    });

結果はこうなります。
f:id:cer1974:20130407231308p:plain

for文などのループ処理よりは処理内容が明確になるし良いと思うんですが
実はこれらは、内部で新しい配列を作成して返しているので
効率的な観点で行くとよろしくないのです。
まあよほど大きな配列でなければ気にしなくてもいいんでしょうけどね
できれば外部イテレータにしてほしかった。

ExcelでWindows認証?

ExcelでVSTOを使ってWebAPIにアクセスしてデータを取得したいんだけど
Windows認証でエラーになってしまって困りました。

HttpClientクラスを使ってAPIにアクセスしていたので
実はExcelだろうとなんだろうとやり方同じなんですが
盛大に調査方法を誤って嵌りました。

HttpClientHandler handler = new HttpClientHandler();
handler.UseDefaultCredentials = true;

var httpClient = new HttpClient( handler );

var task = httpClient.GetStringAsync( url );

HttpClientHandlerクラスを使えば良かったと


普通にWebアプリだとWindows認証の時は、なにもしないに等しいのに
401エラーが返ってきてしまって
ExcelからはWindows認証できないのかと思っちゃいまいたよ

Jasmineの続き

前回、中途半端に記事をリリースしてしまったのでフォローをば
前回の記事

ajaxメソッドが失敗した時のテストが全然テストになっていない上にテストを実行すると
Alertダイアログが出てしまうという・・・

修正します。

it("getDataでデータの取得に失敗するとAlertが表示される", function () {
        spyOn($, "ajax").andCallFake(
            function (pos) {
                var d = $.Deferred();
                d.reject("error");
                return d.promise();
            });

        spyOn(window, "alert");
        details.getData("http://test.com",1);

        expect(window.alert).toHaveBeenCalledWith("error");
    });

alertメソッドをモックします。これでalertダイアログは出ません。
テストは、alertメソッドが指定した引数を伴って呼ばれたかで成否を判定しています。

という感じで以上!