WindowsでMongoDBのレプリケーション設定をする
ぶっちゃけ誰得なんですが、まあ開発環境がWindowsで
そのPC上でレプリケーションしたいこともあるだろうってことで書いておきます。
今回は最低限必要な3台構成で作成します。
まずデータ用のフォルダを作っておきます。
次にコンフィグファイルを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 … 技術評論社
MongoDBをWindowsのサービスとして登録する
ちょっとメモ
MongoDBをWindowsのサービスとして登録する
且、サービス名を任意でつける方法
"C:\MongoDB\bin\mongod.exe" --install --config C:\MongoDB\mongod.conf --serviceName MongoDB1 --serviceDisplayName MongoDB1
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; } }
とりあえずこの状態で確認
当たり前ですが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です。
では結果を
ばっちりLowerCamelCaseになってます。
モデルクラス別に設定をする
モデルクラスのプロパティに属性を追加することにより
生成するJSONのプロパティ名を属性で設定した名前にします。
こんな感じ
[JsonProperty("id")] public int Id { get; set; } [JsonProperty("name")] public string Name { get; set; }
Newtonsoft.Json名前空間をusingしてください。
結果は上と同じなので割愛します。
こちらは、LowerCamelCaseにする機能ではなく別名をつける機能ですね。
頭小文字にするも良しアンダーバー入れるも良し短縮するも良しって感じです。
まとめ
WebAPIの場合、すごく簡単にLowerCamelCaseにできます。
やっぱりJSON返すならこれからはWebAPIを使うべきですね。
ちなみにMVCとAPIがこんなに違うのはJsonSerializerが異なるからです。
ただしこのAPIがJavaScriptでしか使われないのであればこの方法で良いわけですが
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が実行されたときにも問題が発生します。
引数で渡されるデータが受注オブジェクトなんですよね
ここは会員オブジェクトが来ることを想定しているのでエラーになります。
そこで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を実行すると
会員オブジェクトがちゃんと渡されます。
これですっきりしました。
なんで早く使わなかったかなー