けさらんぱさらん

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

WindowsでMongoDBのレプリケーション設定をする

ぶっちゃけ誰得なんですが、まあ開発環境がWindows
そのPC上でレプリケーションしたいこともあるだろうってことで書いておきます。
今回は最低限必要な3台構成で作成します。

まずデータ用のフォルダを作っておきます。
f:id:cer1974:20140214225458p:plain:w200

次にコンフィグファイルを3つ作成します。
中身はこんな感じで

port = 30000
dbpath = c:\mongodb\data\db1
logpath = c:\mongodb\logs\db1.log
logappend = true
journal = true
vv = true
replSet = myrep

他2つのファイルは、port、dbpath、logpathを変更します。

ここまでできたらWindowsサービスに登録し起動します。

>c:\mongodb\bin\mongod.exe --install --config c:\mongodb\conf\mongod1 --serviceName MongoDB1 --serviceDisplayName MongoDB1

>net start MongoDB1

他2つも同様に登録し起動します。

あとは、Linuxと同じなので下記の記事で紹介されている方法で実行できます。
第4回 MongoDBのレプリケーションを構築してみよう:MongoDBでゆるふわDB体験|gihyo.jp … 技術評論社

TFSのGitリポジトリを複数持つ方法

TFSのプロジェクトに対して複数のGitリポジトリを持ちたいケースがあります。
できないのかと思ったけど簡単にできました。

設定画面の「Version Control」から「New Repository...」を選択します。
f:id:cer1974:20140202202040p:plain:w300
これでGitリポジトリが追加できます。
画面はVisualStudio.comのものですが、TFServerでも同様に追加することができます。

JavaScriptで一定時間で処理を繰り返す方法

JavaScriptで一定時間で処理を繰り返す方法は
setIntervalかsetTimeoutを使うのですが
ググるとほとんど

setInterval("func()", 1000);

こんな感じで呼び出してほしい関数を文字列で渡しているサンプルにぶち当たります。

でもsetInterval関数もsetTimeout関数も関数そのものを渡すことができます。

setInterval(func, 1000);

かっこ付けないように注意。

文字列で渡しているとTypeScriptなどを使っているときに
折角のコンパイルエラーの恩恵に与れないので
是非、下の方法でやってほしいものです。


但し関数を渡す方法だとちょっと嵌ることがあります。
こんな感じのオブジェクトがあるとします。

var obj = {
    text: "obj",
    func: function () {
        console.info(this.text);
    },
}

このオブジェクトのfuncメソッドを文字列渡しで呼び出すと

setInterval("obj.func()", 1000);

これは問題なく動きます。

関数そのものを渡します

setInterval(obj.func, 1000);

これを実行するとコンソールにundefinedがいっぱい出力されます。

なんでそんなことになるかと言うとあの悪名高いJavaScriptのthisの問題です。

これをちゃんと動かすには

setInterval(function () { obj.func() }, 1000);

これで無事動きます。

ということでsetInterval関数には文字列でなく関数そのものを渡してください。

今日のメモ

なんかすぐ忘れちゃうのでメモ

HttpClientを使ってWindows認証をする
なんか前にもやったのに忘れてるし・・・

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

var client = new HttpClient(handler);


Windowsクライアントの表示位置を指定する
これは右下に表示する
40と5を足しているのは微調整。
本当はタスクバーの位置を見てやらないと変なことになる。

var desktop = System.Windows.Forms.Screen.PrimaryScreen.Bounds;
this.Top = desktop.Height - (this.Height + 40);
this.Left = desktop.Width - (this.Width + 5);

ASP.NET Web APIでJSONをLowerCamelCaseで返す方法

この記事は、One ASP.NET Advent Calendar 2013の13日目の記事です。
前日は、xin9leさんのDynamicSignalRでした。


以前にASP.NET MVCでJSONのプロパティをLowerCaseで返す方法なんてのを書いたのですが
WebAPIだと簡単だって書いてその後なんにも触れてなかったのでこの機に書きたいと思います。

上記の記事でも書きましたがLowerCamelCaseにしたいのはJavaScriptで利用するときに
UpperCamelCaseのままだと気持ち悪いってのが理由です。

とりあえず準備

モデルクラスを適当に

public class User
{
    public int Id { get; set; }

    public string Name { get; set; }
}

コントローラも適当に

public class UserController : ApiController
{
    public User Get(int id)
    {
        var user = new User { Id = 1, Name = "鈴木一朗" };

        return user;
    }
}

とりあえずこの状態で確認
f:id:cer1974:20131208221133p:plain:w150
当たり前ですがUpperCamelCase

返すJSONすべてをLowerCamelCaseにする

WebAPIでJSONをLowerCamelCaseにする方法は2通りあります(私がそれしか知らないって話ですが)
まずは、全体に設定する方法です。

Global.asaxにNewtonsoft.Json.Serialization名前空間をusingし
Application_Startメソッドに以下を追加します。

var config = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
config.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();

これだけでOKです。
では結果を
f:id:cer1974:20131208222119p:plain:w150
ばっちりLowerCamelCaseになってます。

モデルクラス別に設定をする

モデルクラスのプロパティに属性を追加することにより
生成するJSONのプロパティ名を属性で設定した名前にします。

こんな感じ

[JsonProperty("id")]
public int Id { get; set; }

[JsonProperty("name")]
public string Name { get; set; }

Newtonsoft.Json名前空間をusingしてください。

結果は上と同じなので割愛します。
こちらは、LowerCamelCaseにする機能ではなく別名をつける機能ですね。
頭小文字にするも良しアンダーバー入れるも良し短縮するも良しって感じです。

まとめ

WebAPIの場合、すごく簡単にLowerCamelCaseにできます。
やっぱりJSON返すならこれからはWebAPIを使うべきですね。
ちなみにMVCAPIがこんなに違うのはJsonSerializerが異なるからです。

ただしこのAPIJavaScriptでしか使われないのであればこの方法で良いわけですが
WinFormだったりWindowsストアアプリからも呼び出される場合は頭小文字でも全然うれしくありません。
それにJavaScript側でちゃんとモデルオブジェクトを用意してマッピングしろって話もありますし
そんなに使うこともないのかなーって感じですね
せっかくのAdventCalendarなのにたいして役に立たない記事で申し訳ない!

明日はplusismさんです。よろしくお願いします。

Knockout.jsのwithを使っていなかったことを後悔している件

Knockout.jsにはwithという制御文があるのですが
今まで使うことは無かったです。
でも絶対使った方が良かったと後悔中

例えばこんな構造のデータあります。

var juchu = {
    juchuNumber: "0001",
    juchuDate: "2013/11/11",
    member: {
        name: "山田太郎",
        tel: "xxx-xxx-xxxx",
        show: ko.observable(false),
        showDetail: function (d, e) {
            d.show(true);
        },
    },
};

受注オブジェクトの中に会員オブジェクトがあります。

これをwithを使わずにバインドするとこんな感じ

<div data-bind="text: juchuNumber"></div>
<div data-bind="text: juchuDate"></div>

<div data-bind="text: member.name"></div>
<a href="#" data-bind="click: member.showDetail">詳細</a>
<!-- ko if: member.show() --> 
<div data-bind="text: member.tel"></div>
<!-- /ko-->

member内のプロパティをバインドするにはmember.を付ける必要があります。
それとshowDetailが実行されたときにも問題が発生します。
f:id:cer1974:20131111231728p:plain:w300
引数で渡されるデータが受注オブジェクトなんですよね
ここは会員オブジェクトが来ることを想定しているのでエラーになります。

そこでwithを使います。

<div data-bind="text: juchuNumber"></div>
<div data-bind="text: juchuDate"></div>

<!-- ko with: member -->
<div data-bind="text: name"></div>
<a href="#" data-bind="click: showDetail">詳細</a>
<!-- ko if: show() --> 
<div data-bind="text: tel"></div>
<!-- /ko-->
<!-- /ko-->

これでshowDetailを実行すると
f:id:cer1974:20131111233910p:plain:w300
会員オブジェクトがちゃんと渡されます。

これですっきりしました。
なんで早く使わなかったかなー